|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
3 u5 M% N: m8 A' b; ^/*
& U c6 x- Q; S6 s * Copyright (C) 2009 Texas Instruments Inc
+ C$ v ?, K/ f0 V; Q# n# ] *
7 t9 x L8 l/ s& f G* K * This program is free software; you can redistribute it and/or modify7 j0 D u& Y, _" a
* it under the terms of the GNU General Public License as published by1 h5 Z$ [5 N1 h Q s; s
* the Free Software Foundation; either version 2 of the License, or
; `/ G% e- c2 _3 T! _9 O4 }8 l * (at your option)any later version.: c( y. _3 u! `: ~& D/ R# ?
*
* O1 i- ]7 n( Y4 N. K7 ]- ` * This program is distributed in the hope that it will be useful,( a' T. ~% k* `+ o
* but WITHOUT ANY WARRANTY; without even the implied warranty of' f5 T$ a# s' Y) i0 h
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the6 `& N5 ~- r7 v! d7 S
* GNU General Public License for more details.
& Z l9 i4 |; M: W *1 H* m' T7 Q8 ]* U; k
* You should have received a copy of the GNU General Public License6 n. t3 A g0 z& f, r/ w' y
* along with this program; if not, write to the Free Software& K" S O" _3 W# f3 T+ F; Q
* Foundati6 h& @( P& ]: `+ w+ X
*/" P& U1 t! U# Z7 z- Z1 O" F
#include <linux/module.h>4 M: Y6 @# O' L8 i
#include <linux/init.h>
9 K' F6 Q- _; V: u; ?' Z( J#include <linux/errno.h>9 o6 `0 l4 E; R6 i
#include <linux/types.h>
* {0 {" B2 f: S' t2 D6 m( ^#include <linux/interrupt.h>
# B' B5 z0 n: P+ T, e#include <linux/io.h>
8 w' t+ L6 S4 b. e#include <linux/sysctl.h>( B% R3 A2 g3 t9 j8 }- n- D
#include <linux/mm.h>3 o+ R8 D0 l* b$ B
#include <linux/delay.h>; a. ]+ K8 V; t. \4 f8 B$ j! |
#include<linux/kernel.h>: S- `$ k/ S, @1 v# r _
#include<linux/fs.h>' _5 }9 k7 T4 K V9 m
#include<linux/ioctl.h>
$ e, B+ D1 g( r2 h1 n#include<linux/cdev.h>
) A. S G! m. B1 y. b% l& |* p- V#include<linux/kdev_t.h>3 n: ^/ R4 d# u; H
#include<linux/gpio.h>
5 g* H+ j n' |2 p7 x* f7 S( i, ~#include <mach/hardware.h>9 m/ b8 `& W, {: y/ c' Z# C
#include <mach/irqs.h>1 g0 r1 z, x1 n+ y
: R& V+ r1 |! c' k0 p2 c" R' P
#include <asm/mach-types.h>
( I1 q, t. s7 `1 X9 ?0 a B2 s9 n#include <asm/mach/arch.h>8 |' t$ q% }. W3 H3 m) X) N
#include <mach/da8xx.h>
8 z, _! M0 L4 ?/ f3 x8 O3 K$ Z#define SYSCFG_BASE 0x01c140006 Q" D6 z5 F [% p# b. ]
#define PINMUX1_OFFSET 0x124
, X9 g. ]" {7 I8 l# @5 C2 D#define PINMUX18_OFFSET 0x168
7 W3 M8 h* e( b. G#define PINMUX19_OFFSET 0x16c
2 j7 |& g# \* g0 { ~; T#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR: c% M( m- ~3 C) _! W
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
+ m9 O& p5 x. |: W8 Y#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
7 V' I1 J" j( W0 k#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR; O" j7 v8 q/ M' ]$ W! _' G) h
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
' b$ P1 s& I/ e1 ]
: B8 ^9 A3 {' R. }9 K; Y1 D: V#define DXR_ADDR 0x01D11004 //MCBSP1_DXR. ?& P. H0 t) d
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR. S; A/ I* B7 k) C1 v7 h1 u( P
//PSC9 O A- B* z0 ^! H% B" d3 p$ U
#define PTCMD_ADDR 0x01E27120
. Z- _/ k& j( f6 W+ r' N#define MDCTL15_ADDR 0x01E27A3C
) _5 o0 d1 Q1 a* W4 |#define PDCTL1_ADDR 0x01E27304
7 f, v0 x5 k3 T( _# F//GPIO8 direction% q b; W0 E! J. o/ ~6 h- c
#define GPIO8_DIRECT 0x01E260B0
5 h" \7 C9 c( j0 h2 u$ R#define GPIO8_OUT 0x01E260B4
. T8 y/ G3 l6 L#define GPIO8_IN 0x01E260C0
0 a$ v- ]5 F* a$ Y3 ^) `, C- H7 E6 x! c
+ c* {3 i/ W$ K0 P3 L8 j2 a//#define MCBSP1_RINT 99 9 \, |; \9 M# q8 @1 K
//#define MCBSP1_XINT 100 - P4 a$ s# p; M& k" a7 a
static int MCBSP_MAJOR=239;- s3 c" y! h6 a. b( |% D7 c1 U& U
static int MCBSP_MINOR=0;5 B) a9 C; N, u# n1 @! A o
static int count =1;
; {& S5 W5 u5 v1 L$ s' V5 H# l* e0 D0 z/ O8 L
#define MCBSP_NAME "MCBSP-device". n& S9 g2 C7 b2 b+ G* g3 e3 d; n
( P6 R' r; Z3 V6 I3 o4 Zstatic struct cdev *mcbsp_cdev;
& E1 c& R8 ^% f+ p# o4 ?* [static struct class *mcbsp_class;
3 K: ~# L: e0 k- U9 I- qstatic dev_t mcbsp_dev;
( g- }7 M) _' E+ O( V7 J) Sunsigned int DRR_data;
" f) h d* M6 k7 _- Hunsigned int DXR_data;0 X+ ^! |% M1 ~; U& d# C- ~ y
static int mcbsp_open(struct inode *inode,struct file *file)
, G4 ?$ c7 s) m/ L! F! r5 _{5 c$ ~" [ h1 C+ ]8 S$ t: m0 ^
* _: c4 o5 r) D+ u
//interrupt enable,initialized
1 _4 u1 m( ^$ o8 n unsigned int temp;
) P/ M8 h& P6 t6 {. F' S //SLEEP_EN(GPIO8[10])---0
) `) c1 ~/ _* b/ g/ w temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 h7 m8 l& J2 A( ?0 r0 x6 m
temp=temp&(~0x00000400);
6 \* A- |% k: U: S __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]6 z# V3 G3 f$ Z" y4 a' W
//RESETn(GPIO8[8])----0----1. y; G* g2 J0 H# t) P
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- y/ q0 T2 f( o4 z* N2 \ temp=temp&(~0x00000100);
/ z$ S6 ~* o- J1 r, j __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0 i6 P9 X7 u2 j( p
udelay(100);; P6 G& F5 k0 @$ P/ M% S3 q- f% H8 ^
temp=temp| 0x00000100;
0 S) O6 A' ?! _ _ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; Z2 L3 l; Q& Y0 r) m1 ] udelay(100);
* h! U( m9 y: _1 u0 e( w printk("open success!\n");
9 }* t9 Q$ B) }4 l8 e$ b, I return 0;
, \. L$ G4 [. x( ?% _& o' R}# a; b7 j8 g% G% h1 Q2 A
5 n9 p7 f1 m j( m2 y4 f" ]
static int mcbsp_release(struct inode *inode,struct file *file)
. @2 f d% e: E{
8 K3 @ R/ p+ h6 E G printk("release success!\n");
$ V/ C( F* w8 \) B5 u' e" K/ ? return 0;
3 w5 I* ?/ y0 [( Z0 n" ^( ~}
0 P% @. x" C, K, O
" Q& Q. \& s( h' y5 e+ }static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
& C) F$ G; a, [) F7 M{
# w6 ]' a: x/ Y5 |! C copy_from_user(&DXR_data,buf,len);( s0 D9 ?1 \* `* O; _, a5 ^4 d
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
# f* ]7 l2 H# \/ J# Y( Z) S/ ?5 } return 0;0 b+ v: W- X1 o9 A& b
3 w( t8 ~1 ~) o$ u6 ], S; m8 ]
}
; c4 B$ D& C% T1 D6 c9 r9 t& C+ Q: C" [4 t, k5 e) }& G n( E
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)) h) n, N) O) Z
{
7 n* w# ?' l- a DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( q9 j3 D! X; _0 D6 o
copy_to_user(buf,&DRR_data,len); 7 D' ^" s O/ C" ]1 ]% ]
return 0;6 z6 o$ l0 Y9 K# _1 P, R
}/ R3 Q. l% B0 v% l% e
/ X* h8 x4 s7 A8 }6 @8 [ d. [
: X' h; a: _+ I; ~+ a
static struct file_operations mcbsp_fops=$ K& R4 Y* A9 y8 Q7 j' o
{
- R) N- S( Z( \3 @ .owner=THIS_MODULE,
! R/ c. ~$ V% o1 i- l .open=mcbsp_open,
1 C( K# Q9 s! F I& T% h .release=mcbsp_release,5 |) J9 L( @3 v5 A
.write=mcbsp_write,- ]8 h" I& f+ d6 G+ {1 m
.read=mcbsp_read,
2 B2 G" U0 B8 d7 c: i};
+ I6 l3 i" K$ p: a/ F1 ostatic int __init MCBSP_init(void)( l b* W% v9 ]' c
{
7 Z3 E; n; ?" s" t int ret;. M, _. u, H9 m2 x' p8 D
unsigned int PINMUX1_REG_old;
- q9 N: O: T% k% N [7 U unsigned int PINMUX18_REG_old;1 F) `8 L+ e& i( z- D
unsigned int PINMUX19_REG_old;7 K1 `4 ]- {$ d: Z( P2 ` W0 E# d" |
unsigned int temp;
* z( j, N M& z2 r, A2 O if(MCBSP_MAJOR)
2 j0 g) X' ^% u H6 V G, O {
4 R1 c' N! }; G, d4 K3 y4 F mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);" @, H! k8 @9 M3 ~
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
: r0 D8 `! g+ U3 A4 l }
% p2 w8 _8 k% f+ X1 b& b6 C) h( U else
9 Q4 N5 j- `: w* ?7 K# y* ^ {7 L) H% H. v& T i# K
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
1 J% ?+ q* x5 T4 \* L MCBSP_MAJOR=MAJOR(mcbsp_dev);( e6 ~5 l8 u. X+ m: T- w& v
}
) {8 k: r- r; O) p % y+ b% p$ H% O$ o" p7 h( f7 e' K
if(ret<0)4 ^! q0 x) ]5 `3 f N2 Q+ Q' n
{
. @4 F- h0 O- d( C printk(KERN_ERR "register chrdev fail!");
( c) y$ Z( k% Q6 @2 {; j* a8 Z& ?. } return -1;$ K8 V- c4 e7 j
}
1 t1 F2 j9 Q. y" b7 w 6 w3 Y2 z( N; C
mcbsp_cdev=cdev_alloc();
1 ?2 U: D* o, E4 | 7 c6 q/ J1 M* S6 x3 ]; ]$ ]& u
if(mcbsp_cdev!=NULL)
" Q1 n, e- Z! G$ g# K( l {/ o9 ]" O& F: } u8 m
cdev_init(mcbsp_cdev,&mcbsp_fops);
5 s, }( K9 m) u1 ~ mcbsp_cdev->ops=&mcbsp_fops;
, T% j+ u3 {9 {: _ mcbsp_cdev->owner=THIS_MODULE;$ b$ c" @$ e8 L; Z
E [0 q9 E- c
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
4 E9 z1 \0 p! u6 N6 P6 x- J printk(KERN_ERR "register cdev fail!");: m- I9 k: t) {: K3 r0 e! ~0 ?
else* x" P' A* h9 E0 \9 A
printk(KERN_ERR "register success!\n");& i9 A/ u& w6 g- j
}- c4 l }) q% k$ A' f Q I( p
else
: i7 Q' B, x4 G; U {1 b2 I5 K. }5 ^
printk(KERN_ERR "register cdev err!");) d" d& j% R+ ~5 X; @. X
return -1;7 i; C$ `; l. ]5 ?5 D
} ^( ^) c) R3 T! ]( s
* M- k8 b( R6 E! Z2 m
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
: \/ M: B( V8 K$ }; i2 S* V- x% X* F2 d. ~ if(IS_ERR(mcbsp_class))/ \0 o- j) `, t2 p' ~' }
{
' ~- D4 d& T9 \* A/ p! V8 E printk(KERN_ERR "register class err!");
9 s9 ]% {! U! N# S/ i3 J% y return -1;8 `5 G9 t4 R) A; ^: i; b; P4 k
}
- Q0 W7 }1 ?% [" v5 U device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
( X6 Z. Q* M& h/ s2 Z* `2 ]: F3 c8 J
- v: h" C+ E) N9 Z //PSC7 R' n3 b) I- ~
//add Enable MCBSP
L# q) {. e9 }- b" G) f: u' E //test
* M& |) n, }. e temp = 0x80000003;
2 x$ M6 J M1 ? writel(temp, IO_ADDRESS(MDCTL15_ADDR));, v$ h1 @7 ?! t
temp = 0x00000003;& ^$ z- S4 X3 o N* f" ]3 [
writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 S7 g5 N# ?; `' I/ A . {9 h8 }; _" |
temp = 0x001FF201;; u' B: D6 _7 k7 z
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 j' W5 J5 X8 @- Z3 S , ?3 H. D8 g ]
//PINMUX
9 S3 j4 G: Z3 \5 Y0 D+ T //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,5 q8 r! P% c3 T' o
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ' j( N9 {) {2 n" G! M
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; , P5 _* e' U+ L1 J$ V
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 }: }; K$ L; H/ Y' Z / m3 x3 z/ C' [% F+ F
//SLEEP_EN,EPR,L138_SHK1,L138_RC7 r2 @: U+ x& M- p
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 6 S8 k2 t" @; o* e
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
! Q2 v* ~4 t% R' C3 |* j7 i1 g, \* _2 b writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 k/ `: n+ I0 y9 S4 X9 e " H0 P: q! j: p4 p. o
//RESETn,L138_SHK2
: R' p3 ?1 H# ? PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 V+ B. B, E0 | PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
" |! x$ C1 J: j5 ^/ a% L6 G2 O writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);4 P# I. b6 j7 x+ E
! s+ G" W8 e, Y: T1 d6 @0 B) j: t
7 }3 `, t) x% P" H! D s {- C% p //SPCR Register
# V' X/ {- ?* ` //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset h) n- ~+ M) m7 ?
temp = 0x03000000;//(DLB=0)
8 }& ^4 r( A0 t: i; K // temp = 0x03008000;//(DLB=1)
7 x0 }) c) ]3 L. e writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
I6 M: j/ Q# }( T5 |$ M! }, X temp = readl(IO_ADDRESS(SPCR_ADDR));
# p! V. [1 e7 J2 c& l printk("temp=%x\n",temp);
- }2 t) X2 p* Z% z" c; ]
0 G; F u/ }: j! v* m0 e2 o6 {7 _ //PCR Register
/ i4 I+ e) ]3 t0 y6 B9 M* c8 t/ W //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-07 _3 W* Q2 J/ i+ a6 |3 O
// temp = 0x00000F0F;3 v) k- U6 U, K% }% }2 r
temp = 0x00000B0F;& @9 N t& i( A/ J4 N) G7 B
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
% G* i& e/ j/ {# j4 M temp = readl(IO_ADDRESS(PCR_ADDR));& v d6 k& [: a" [& ]& A! e
printk("temp=%x\n",temp);
, S) Q3 c- ?5 B2 f( \" k //SRGR Register
- |; { r! O; D0 c: u //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; G2 r% n+ d, O' F; L9 F
//temp = 0x301F000B;
3 `) U) e) P# Z5 Y writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
- |, T+ `) F: W! p# w/ h4 x7 Z! J temp = readl(IO_ADDRESS(SRGR_ADDR));
5 X, e8 _% n" h' A printk("temp=%x\n",temp);" \4 m% l; Z% d( c
//RCR: ?2 q& H8 x7 I, s3 A2 U- y$ ^; b
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 o- l0 C j; e& L9 Y5 P; h% Z //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-04 C, k$ K. N4 i3 [
temp = 0x00440040;# P% C8 }, R. ^6 u* w" ~
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
. o1 c8 g6 @5 K8 F9 b temp = readl(IO_ADDRESS(RCR_ADDR));* \4 c. q( Y' o$ s
printk("temp=%x\n",temp);7 S/ D! X; |+ |5 g+ @( p. F5 y! f
//XCR, K0 R7 B$ {6 V4 h/ v
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-15 t u5 V/ b& _# J; C
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0/ y8 f+ H5 R; {! H5 c6 w% F& |& B
temp = 0x00440040;
+ A9 Y$ K) ` @8 W1 K& O t0 K writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
# D4 ~+ g* r. O% J/ X* }: S temp = readl(IO_ADDRESS(XCR_ADDR));
3 I2 Y2 L1 I9 C printk("temp=%x\n",temp);
6 E1 ]& E f' M udelay(100);6 w' b8 l# M0 U) }& k/ }* ^1 N1 g$ s
//SPCR Register1 x! R$ ?% V5 p
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! z2 y0 \* |9 o* R# h2 v, o$ O+ C# P
temp = 0x03C10001; //DLB = 0 VS DLB = 17 ^" S. Q. K% ?. J5 c# S
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled$ C( Z& _' d1 ]+ e1 H- K0 r
temp = readl(IO_ADDRESS(SPCR_ADDR));
# ~7 J2 r0 Q, O5 ]6 E printk("temp=%x\n",temp);( y8 q9 u1 r5 I" Q/ C8 Z
udelay(100);
5 ]$ R6 ~1 x- h# s% @' D) e/ l6 {
4 }4 i8 k N1 x6 d' z //set GPIO direction2 L" Z" _7 z" V3 H- F; c8 s
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 X+ h' p+ b( }3 ?( V( @ temp = temp | 0x00000100;//EPR----input, ^1 P/ Z4 n# @& V Y
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
% Y( l. f% b. m9 h __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 u7 u3 j" H4 m. F
( F4 u5 w4 L. v) w3 Y' N" L0 w# \& s return 0;- e$ m7 u6 W: P' V% K
}; t4 M0 w# j, ~) W
static void __exit MCBSP_exit(void)* K' w. V6 E, w. j
{" H7 G7 {; _- N2 r1 |% C& ^& w
printk("mcbsp chrdev exit!\n");
|* [0 b8 b, z3 t cdev_del(mcbsp_cdev);9 h& t9 Z1 O7 v' ?9 q
unregister_chrdev_region(mcbsp_dev,count);/ r. k, A8 E4 s) D
device_destroy(mcbsp_class,mcbsp_dev);$ N/ J7 T) _4 x5 D. d3 e
class_destroy(mcbsp_class);+ R4 ?& a$ F( c; e. |$ E6 i' q
}, C$ p- S; ] ?+ O: K0 S" N: l
module_init(MCBSP_init);) m; `1 P M; f- U6 k. T+ U: o
module_exit(MCBSP_exit);
% q+ C7 e! `9 ~& e6 Q& R& O3 j9 q" D( Y$ R; u5 h) |
MODULE_LICENSE("GPL");+ y. J" a% l+ L( R; z
7 Z: d; K; j$ W% D) Z
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
3 p# z1 b2 V* ~9 ` z) {9 i4 Q, U我的应用层的测试程序如下( f4 [) e' L6 J& B3 \$ }
#include <stdio.h>
; M2 r' V2 c( C( S#include <string.h>
, w! s( \2 ~( G i2 @#include <fcntl.h>) i1 R W! c$ y4 t" J, Z
#include <unistd.h>
( b1 E; R- g- R" K7 {" t( b#include <signal.h>+ \. t8 `1 R; U' [; e/ Y5 u# |2 |
#include <pthread.h> //线程
1 I# v8 `# Z8 E, q3 V) u/ b#include <stdlib.h>- Q* J3 I( ?5 A2 @# f! }1 q
#include <pcap.h> //捕获网口数据
0 D9 W" [8 Z6 T1 j5 U0 l u#include <semaphore.h> //信号" ?. T7 e$ I. `/ ]; d
#include <sys/types.h> //消息对列3 ^4 h: F" }% {
#include <sys/ipc.h> //消息队列
) Q/ W& x: |4 R; B; o9 r#include <sys/msg.h> //消息队列
7 A& y3 F( B/ ]- O; g2 E D#include <sys/select.h>
# Y- _, g, [" K: @#include <sys/syscall.h>5 U9 V9 T3 c. b
#include <sys/stat.h>) t" r% Q) _3 I7 W2 v0 |4 u" r1 E5 ^
#include <sys/mman.h>
6 e8 ?( u+ R7 e" S f: n% J#define msleep(x) usleep(1000*x)
2 q: S/ } t, E% ~7 Y) o8 s' k- E& s# ]* W
int main()) {# B3 c$ T$ T; A2 T, m
{ ' F. j1 Q# q; F3 }% d7 B& n
//MCBSP,ARM与AMBE2000交互设备- V, Y% O+ ?* H3 h% D& w) D& H. r
int fd;
- D- X1 K8 E7 K: P0 g unsigned short data_write = 0x5555;
) ?4 D" Y3 G! ?$ o1 f unsigned short data_read = 0x00;
: \8 V- d# ^. b# @; _- s/ j fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);" s8 G) h1 ?5 N1 @0 e5 ^- t6 F
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 s4 h8 L5 ~3 c8 ?" o % h' t1 c: c8 I! i$ j! a! Z
if(fd < 0)
( q O0 ^; z, O1 [ {: F; Q0 T) I* Q) A" L# P/ ?$ l
perror("open failed\n");
+ X. [( z U- c* D! I+ E$ \* i return -1;
, p- N$ Q2 _ i6 y$ Y }
3 e) G7 w* y% n# o: a; y; L1 a 1 W0 Q, s3 ? h: @# r
while(1)
4 H' \( H6 E) |! y/ x* U {
6 P \4 Q) A; m E 9 s5 v0 x, v9 t* D0 b- {2 x
//AMBE2000每次读写是24个字为一帧
1 b* e/ W) V2 W( z5 ]5 z //写数据时将数据在底层存储起来,等到中断的时候再发送7 d5 y2 K4 v5 L) d3 h- I! t7 U
//AMBE2000输入数据是以0x13EC开头的, |4 { |5 e8 m$ x' \
write(fd,&data_write,sizeof(unsigned short));3 ^1 W' s+ a4 u# e/ c8 @6 I
/ t1 U% g7 C) r9 d) q //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
5 h$ S& d' N, N9 w1 Z' ?; V read(fd,&data_read,sizeof(unsigned short));
1 B E: ^/ i3 A$ O% X 7 ?! l4 z; Z5 B% Z% u' Z0 ^8 M6 O
if(data_read == 0x13Ec)
6 y C1 E! a6 r" d {
6 T% Y: V+ {) f ) ~% A* ^- q# e/ S) d$ W) b5 p$ N4 p
printf("data_read = %x\n",data_read);
4 i$ |* |$ q% Z" J. t4 F' [, h }
2 w8 j3 u6 K7 {5 S8 S" f O( p : g4 Y7 H# e6 Z0 N7 a* E' d
msleep(10);- J" V* r5 b2 G
; \8 w1 V- i% f /*
* E: V& n$ f5 S* ~ ioctl(fd,1); 8 U) r4 H- E* m( N
sleep(1);3 R y8 }* C0 v+ j, r) V
ioctl(fd,0);, e. L7 u; u: F, `" [3 Z+ q+ u+ z
sleep(1);" i7 c% ?/ l$ u2 h( G
*/ ) t, g) [, p: m& v& W
}
/ \! V2 | ~6 A return 0;
0 T6 b( q' T' T! l4 L8 X9 \8 p
) P( Z+ E n2 g6 G/ S0 W* v}
, c5 D+ Q8 \. O7 a8 g! t y" x( R( _. g$ {4 f7 @- z
多谢各位指教,谢谢! 急& z- g$ f! [! C' R5 _" C
& g- ^ A0 f: O2 v4 v; p% X9 T! S& w6 R2 {
! M$ c) l( ~0 `
2 ~% Z2 R% }$ n- W7 g9 k/ u' y P# j; i/ ^- j* h
|
|