|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
2 Z h) W9 c$ _0 T# l/*% S5 z7 ^$ f! d
* Copyright (C) 2009 Texas Instruments Inc
0 C; p. {" ]: [' K *
% k. b; C; G& x2 b g" E7 Y: r * This program is free software; you can redistribute it and/or modify8 R U! Z9 a/ A9 b6 b
* it under the terms of the GNU General Public License as published by6 i+ S, e5 ^- H+ {0 q% e5 u
* the Free Software Foundation; either version 2 of the License, or4 s! h4 Z$ _4 U' r: i
* (at your option)any later version.
) ?3 M9 q; h2 i. t: V. ]* Z3 H! S+ o *
) P0 c9 G" k# y * This program is distributed in the hope that it will be useful,& }2 I2 z, h; x7 `* f
* but WITHOUT ANY WARRANTY; without even the implied warranty of
) h7 T% A2 @8 _ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ~) E4 h8 Z) ~1 @/ u4 o# ]0 v
* GNU General Public License for more details.
7 D9 ^. K' P9 | *
2 v% {1 ^4 t$ j2 m: r/ K * You should have received a copy of the GNU General Public License [7 d* S5 p9 g6 R: H
* along with this program; if not, write to the Free Software
/ _# w$ j+ U9 Q3 f8 x * Foundati% w/ @: F: r$ p5 l/ _' `$ ^
*/' X! r% U, E: ~! T; _, @2 m: P
#include <linux/module.h>
; D/ F& p% S, ^( p; H& ?6 `#include <linux/init.h>$ {' V* t+ @8 d7 n$ Q. V
#include <linux/errno.h>) R4 ?5 H$ L) [+ b R
#include <linux/types.h>$ V- e& [0 K$ | i0 g+ Q$ E
#include <linux/interrupt.h>7 G; w5 X3 g& i: g
#include <linux/io.h>, [0 D- U, w0 R0 b! b: N a
#include <linux/sysctl.h>; u+ k$ j0 z1 a
#include <linux/mm.h>9 W, R: a9 N; X
#include <linux/delay.h>
: z2 {- r' e7 Q#include<linux/kernel.h>: t# h- x* r: M+ p2 d1 p9 t4 j
#include<linux/fs.h>
' [9 D+ o$ m" l B#include<linux/ioctl.h>
0 a G3 u! p( z3 J) S#include<linux/cdev.h>
0 z; u+ V- x% h# M7 F2 K1 h" V! F#include<linux/kdev_t.h>4 J& _4 @6 I) M. h2 H/ T3 K
#include<linux/gpio.h>
/ X) ?' V% j8 p# e- A#include <mach/hardware.h>
, w+ z4 s+ [! X' p( M8 ` p#include <mach/irqs.h>1 c- Q7 r) k1 c p2 x" n: M/ V, p
. B4 s2 \. n0 ?9 T. [, P* C# ?* x
#include <asm/mach-types.h>9 r) [* U5 r+ ~4 R3 {8 }+ W0 l0 Y8 D
#include <asm/mach/arch.h>! p: n' s2 z6 g" M
#include <mach/da8xx.h>8 L; T$ ~9 k. _* N& q
#define SYSCFG_BASE 0x01c14000- K: @- j5 }) d& m2 \6 X
#define PINMUX1_OFFSET 0x124 3 k; a3 P, B2 O. U
#define PINMUX18_OFFSET 0x168 * ^1 q2 i* b. J
#define PINMUX19_OFFSET 0x16c+ {( o* G: g$ X+ k
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR0 t* l: `6 w% |, x' W2 \( R
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR6 |$ w7 S; C7 W2 M
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR( y- g( \4 `3 x( b2 E
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR4 d& A! b. }! [* w- s; l: y
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR+ V% ~' |2 T& i7 s7 _" d
* I7 a" q1 S$ k9 v) D( q2 h. s#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
% b2 v% u8 q* G8 L#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
- X( D2 T* i4 h//PSC: p) e* I% i: [* U" o% G
#define PTCMD_ADDR 0x01E27120 $ b7 V& v* x8 y; Q: F$ y3 R% i
#define MDCTL15_ADDR 0x01E27A3C1 H0 ?$ j$ u' [/ S; R
#define PDCTL1_ADDR 0x01E27304
0 K6 X& d% F7 Z- q! V* G. g+ c! `//GPIO8 direction0 B$ z0 i) ~2 V
#define GPIO8_DIRECT 0x01E260B00 ]8 D `1 \6 E, I: ?7 B
#define GPIO8_OUT 0x01E260B4
+ y# Y- l& R- A/ S8 V: v" ?#define GPIO8_IN 0x01E260C0
# D9 H! {* X: w6 n) `7 b$ _" o& ~( y, e8 N" i- x( Y
//#define MCBSP1_RINT 99
' L& a+ x Z" r( m# V% r6 [2 `//#define MCBSP1_XINT 100 * A, y5 h6 O$ o& R2 x$ t
static int MCBSP_MAJOR=239;
; Z U4 d- v# `- Fstatic int MCBSP_MINOR=0;
, |1 S1 A, U0 E w$ E$ kstatic int count =1;; m0 X6 l$ O% t8 z& H/ K; q
+ I3 d/ q# M0 [% b4 G#define MCBSP_NAME "MCBSP-device") V" F' d1 `& K# y D+ R
$ Q* U% z$ \* x0 ]$ W, _static struct cdev *mcbsp_cdev;
5 ]* K2 U$ c5 e, T: F% ?( istatic struct class *mcbsp_class;
) x" C, U& q1 t4 u& o7 L7 U% tstatic dev_t mcbsp_dev;
$ _) X( |, j, ?& d% D: A9 Cunsigned int DRR_data;
8 P0 T& }8 w# L1 I& t7 ~unsigned int DXR_data;% V' W& F7 O& _ Z% G
static int mcbsp_open(struct inode *inode,struct file *file)
/ K3 Y7 Y3 N4 F# ^" |# C6 _3 J{
( O. J4 v8 @% `* W' G( K9 ^1 ` / ]- S/ v6 S1 l
//interrupt enable,initialized M1 U2 D5 N) H3 G
unsigned int temp;) y* m2 X- { ]" l0 P
//SLEEP_EN(GPIO8[10])---0
6 f; B8 s. z: x6 A9 { temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" I$ q N' G/ p# K
temp=temp&(~0x00000400);+ j% I6 [' s4 i7 i& G8 B. x2 H
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, k) d& g- s5 W //RESETn(GPIO8[8])----0----1
) v9 l$ T9 X W. D2 s) A temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- d) E. o7 v" R) p0 R
temp=temp&(~0x00000100);
" e. ]. ^; b& W, G1 L- H __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
! r' }3 d9 k0 d udelay(100);4 d8 j: ]' _9 c/ B" k
temp=temp| 0x00000100;' a, N) p+ z, K- c6 n2 }0 G
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, ^+ q! [8 _% p: h: s" F4 x9 ~( k: g! z udelay(100);$ D# ^! q/ x$ u. ^8 T
printk("open success!\n");
+ e6 @/ H0 F. T' d return 0;# x; f1 U- L0 V6 q9 Z
}/ Z" O1 W* h/ S0 I0 s* |+ Y
% _! r2 s$ [6 T) j0 X
static int mcbsp_release(struct inode *inode,struct file *file); B! h# P$ |! }7 O
{
9 x0 a& l% z! p, { b printk("release success!\n");
/ G% g. K/ F$ w$ B1 x/ k( `, u return 0;9 w# [9 ` y$ z Q: h1 u$ z% Z0 X
}
( W% O3 l! Y' T7 A( p, e3 o/ J
8 r4 ^; m: y; l4 @static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ l6 l, X: `8 T( R2 ~) _$ q{
+ k- e* R5 x+ n) z0 d7 |( q copy_from_user(&DXR_data,buf,len);) E6 Q! g7 M* u O
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
' x# L% J1 R/ v5 H0 U return 0;* ^4 F) O$ v9 \/ D2 e1 F/ R o
# f. Y S& o( \# e# ?
}
& C* }* k8 x: X3 O& Y$ l$ f: h5 S6 F. y: a2 H* m4 C7 Q# b, k
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* W+ C' q4 r4 b8 n" M{ . ~5 E- E7 R9 }, l3 z7 P
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));0 \. @; `- H H6 J8 N6 N
copy_to_user(buf,&DRR_data,len);
, W/ b* A! Y4 h5 O& ~8 r& [1 u* f return 0;
) c( l( U; _; j& a}
2 m! P" Q0 l2 |3 J$ d1 Q' `8 F) r# H" e2 p- A3 E
1 }5 ]7 \: c4 X: a5 I; ~ d( j9 K" m) Rstatic struct file_operations mcbsp_fops=
# n P6 ]# q7 x3 m9 h [: X( k{
- r' z, z0 A% A H v# B .owner=THIS_MODULE,+ D; E- l- Y8 t# Z# E4 D
.open=mcbsp_open,) R$ T. z- R/ n, b
.release=mcbsp_release,& B7 {0 e* m1 ]4 j' X& r/ x
.write=mcbsp_write,3 {8 S* c3 @6 Q0 Z
.read=mcbsp_read,- p( n v6 o# s& I/ x+ U
};
1 j8 j4 S, U' m3 `) \" j% X! Zstatic int __init MCBSP_init(void)
/ @+ G E1 w% S6 N7 S4 f" z{: D; [5 y! g+ Y4 J5 X
int ret;- R8 `, c" C# Q5 S
unsigned int PINMUX1_REG_old;* x( @$ c/ i f1 q3 w9 l$ ]
unsigned int PINMUX18_REG_old;% ]. `" K2 h) y) q( T
unsigned int PINMUX19_REG_old;# N; k7 _1 F( W7 O% C% e
unsigned int temp;
+ y- ?8 [* o9 d. S9 d e& d if(MCBSP_MAJOR)! c/ c# o8 b; d. x. L3 H: E: m+ O8 I
{' L+ v; S: R) Z6 w% l: n* t; i/ F
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
- _5 I" c$ B9 _: e7 P, Q9 c! ^ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);$ S1 B; X8 @. d2 Z3 @8 v, W
}6 T) K) E6 F5 _ s; ?/ _
else$ l, K7 N3 c# a9 E/ R& G
{
, O4 r3 e. y% C, u, X+ a/ _ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);7 H1 Z( J8 K4 x8 m5 L7 `8 D6 m% w
MCBSP_MAJOR=MAJOR(mcbsp_dev); o+ d$ x7 ?# ~: a2 V) Y) F! m# I
}
. N+ a# D7 s6 a6 ?. O- g $ k5 K& y$ n* G& ^! B* t d1 V8 r `
if(ret<0); U- D; @) ]# w
{+ Q: D6 [+ F8 g4 T% z' h
printk(KERN_ERR "register chrdev fail!");# |! T) L- o# T; d2 w* o2 e4 f
return -1;
3 q6 x! j8 V' }1 X0 }# y- l& X }
! L$ H0 T( ^9 w1 {; |' m
. E) F) O& @% Q mcbsp_cdev=cdev_alloc();
. P' X9 x; s1 v. N( R4 J6 Q 5 J' o D/ c& n) ~/ q( z
if(mcbsp_cdev!=NULL)
& n& ^* p9 o# V" r7 X {, A0 D( {' Z* a4 B% @
cdev_init(mcbsp_cdev,&mcbsp_fops);* W2 P% c9 C* Y3 ^* d( j& V$ h
mcbsp_cdev->ops=&mcbsp_fops;1 K: e1 [) ^- E3 S6 O7 R
mcbsp_cdev->owner=THIS_MODULE;+ C1 G0 Y( A- \ u# S
3 \5 A! b3 ?) j* b' n6 x
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ z2 C# o( G. a! L% `/ F
printk(KERN_ERR "register cdev fail!");0 Q6 X; s" d( t, Z
else/ K9 `$ W2 \$ l2 I* k
printk(KERN_ERR "register success!\n");
" K" w0 ^5 t4 {; x* n& A }
6 x/ J9 v7 B2 _ else/ m; ]4 x0 x5 N$ U
{
3 \. O0 y" G0 W8 [8 a printk(KERN_ERR "register cdev err!");7 r9 r" }( v& r* p" V7 h
return -1;
! J: ~0 ]8 H9 w5 ^- S: _% J }
3 I2 A' C' t3 S) r9 ~6 N7 E, z) B 7 G" P9 Z9 l1 U4 w! J
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ B- o% b9 H" x
if(IS_ERR(mcbsp_class))
" ^9 m( r, \. m e) ^3 ~ {
! }8 |& H( v% R& r! S' E! P, `" Q; Y printk(KERN_ERR "register class err!");
9 W: E7 p: q3 z$ E2 M; O: U2 e return -1;
; W3 U4 C# a6 E) \# _$ y- f }/ q5 Y+ `) T }
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);2 a+ |& v1 \0 P: d
/ o T6 D* y2 d1 v* d2 V/ t3 _8 v //PSC, e0 |' d! g9 c8 w! N4 E0 C
//add Enable MCBSP. ?! N% Q- x5 w% n' J( P: L
//test7 u5 M- h1 z5 J9 j9 S$ s$ q4 z; |2 q
temp = 0x80000003;- v) T* B4 I/ l, L
writel(temp, IO_ADDRESS(MDCTL15_ADDR));' \0 F* f. R8 [" Q
temp = 0x00000003;3 Q% K% [ Q3 e# N
writel(temp, IO_ADDRESS(PTCMD_ADDR));
+ P+ ?: n) k. V9 h
. W6 ~7 G! l+ l) n' f temp = 0x001FF201;( ?7 O; o: J1 `+ J. U
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 N* F q+ b- O5 P; [" t, K * A( Z& z, [, }$ f; w5 x
//PINMUX
) E7 R& k$ ?0 v3 j( p1 N8 j //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
5 g$ E, o! l( z4 y9 u' e4 } PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- u$ H, a$ K% G K- E/ d3 T+ z. a PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
8 C% N- ]" F7 u( z5 P! j writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ w* I: M% z" F0 Y1 i 7 t3 P& N5 ` S
//SLEEP_EN,EPR,L138_SHK1,L138_RC0 X' L! J1 s. a/ i3 D- V4 ?
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 1 U7 ?9 Y* O+ L% f
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; / ]. @% v; ]! \$ P* R
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);$ u' N9 k f( H$ o# p" c6 h
- I( r" L" i8 \% G7 i& P //RESETn,L138_SHK2
7 f( G; d& e; O+ z PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); x( p; Z4 J7 t F
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
: E% P% |% c1 D3 N3 ] writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- e, @& D ?; P1 `. e$ T% o6 |. L
$ {( s" {7 R: E# C, J3 ?# r3 a 5 L2 W; m! K2 N5 {5 U: X$ n
//SPCR Register1 s" c: L1 X. L% @5 _* X- P0 f* e
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 W+ Y) |8 H X+ Z, i" h% b temp = 0x03000000;//(DLB=0)2 h3 T, b; r& N) U% g
// temp = 0x03008000;//(DLB=1)
$ X7 i' O0 g& l2 g6 @% A writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
7 r( r7 _1 a- Q4 s* U4 n% y temp = readl(IO_ADDRESS(SPCR_ADDR));( H4 w& z" A# N' l
printk("temp=%x\n",temp);' ?. I7 E4 b" ~' h% G+ ~
: e: |3 ~- ?' x$ d- c R7 Q //PCR Register
; ^8 _2 u7 [$ x; w* U' U; T l //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-03 q6 j) D, h, N2 l& n% r
// temp = 0x00000F0F;9 @6 {$ m4 q2 V) T4 e
temp = 0x00000B0F;
. Z) Y; C: @; _9 b) W4 g, h writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
0 `. T% B; h3 j% k' b temp = readl(IO_ADDRESS(PCR_ADDR));# k7 S9 j% z' u# [4 x1 A7 v
printk("temp=%x\n",temp);
) P/ f4 F% C% c3 Q: G) q9 k6 x //SRGR Register* n% [4 C" I7 ~
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
' A$ v6 u B7 F5 m //temp = 0x301F000B;7 l, Z5 W( m9 a; _0 O
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
) G8 J$ f9 m. C7 D6 D/ f0 I t temp = readl(IO_ADDRESS(SRGR_ADDR)); j' q8 f! p* @
printk("temp=%x\n",temp);1 R( n. c+ w2 }5 x- v
//RCR% x# H) k( k1 G! L% r' Y9 }
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, x. c& W" c# v4 x
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
& e' U: N8 S9 C8 p/ `1 ]- b- g1 s5 n temp = 0x00440040;
+ ~9 B4 q8 z0 Q+ S4 j. l writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
) i$ z* S3 u- c# }& m5 W1 C6 d temp = readl(IO_ADDRESS(RCR_ADDR));
4 f% k# a3 Y8 k$ P/ f printk("temp=%x\n",temp);
) o6 D, b7 G2 ] //XCR
$ g$ A% r6 G* @ //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
8 \3 |- L1 @: y! E) g //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* N& T9 [, F3 x+ p* k
temp = 0x00440040;5 @/ G# ^# Y& @' _
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
& @4 H" I/ i _9 M temp = readl(IO_ADDRESS(XCR_ADDR));$ A2 s* `5 f' g+ c/ X2 z
printk("temp=%x\n",temp);) U- u+ l! y2 [* {% d% b# V
udelay(100);
! y+ O- h7 v1 k: `; | //SPCR Register; p0 c3 q6 a4 P/ H
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ w. [1 v( i9 d+ Y! u3 M temp = 0x03C10001; //DLB = 0 VS DLB = 1 ?% I& [ J* ?) G5 p7 y4 @/ e4 K6 G
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled$ i& e- s5 D& z6 {
temp = readl(IO_ADDRESS(SPCR_ADDR));
6 S3 L6 Y2 F& ?, f- l printk("temp=%x\n",temp);
2 t) U& b0 v, }. Z0 M9 }5 i! I udelay(100);$ C( K3 k; X- L# Y m( w
$ e# n. e- I- Y/ B1 P) g
//set GPIO direction
& r& _ Y, D' R! Y temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' l- y" m8 l9 F) L
temp = temp | 0x00000100;//EPR----input3 A0 ?% e- i9 ]' a3 Q: M8 G
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output/ Y1 _, @! W* j9 C- _& m! V) q
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 V& [# C: K2 r/ I' h; K9 u
4 C& Q) ?7 X! O9 K' e/ T: L
return 0;& r8 B( \; K% q# m
}# L+ |6 f3 ]2 G0 V
static void __exit MCBSP_exit(void), w( a# L- i- `( v1 O2 b
{
4 S7 S, }1 |9 W6 A, Z printk("mcbsp chrdev exit!\n");
$ j/ s( x. N- U4 D1 a cdev_del(mcbsp_cdev);
' W% x6 Y) X) v C. t4 `! ?1 e unregister_chrdev_region(mcbsp_dev,count);) q- d6 P3 [6 W G" X# O8 i
device_destroy(mcbsp_class,mcbsp_dev);- u) ~, P; z2 s) n1 _
class_destroy(mcbsp_class);( i2 U- Q1 |5 l: }5 f c
}
$ C6 ?" `! M m5 A0 y" nmodule_init(MCBSP_init);
% ~" r, K! P* c: A' c( a* Fmodule_exit(MCBSP_exit);. a# D+ ]' q1 s) P; z( ? w$ H, d# q
! n( j8 m5 S& aMODULE_LICENSE("GPL");8 Q- C! W3 _ a* Q* w& y' i8 I
3 c5 e' `+ i3 n) ]$ h3 Y5 Y8 K( H
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
! ?: z& |! ]6 c* U" U5 n4 ]/ k我的应用层的测试程序如下; o2 o% V& n5 m4 E/ _
#include <stdio.h>$ s$ e2 y3 c/ k8 U+ P6 ~1 S
#include <string.h>/ G: [! S0 v! F8 \
#include <fcntl.h>! t7 S; @1 [9 m. P Z% L
#include <unistd.h>
, X% q7 }5 F& n( f- ?# Q#include <signal.h>8 G( k7 i- A6 i2 V
#include <pthread.h> //线程) @( I$ U3 b4 h
#include <stdlib.h>) i8 n* `6 ~: o' n V
#include <pcap.h> //捕获网口数据
+ }7 V8 G2 q7 f1 a- m#include <semaphore.h> //信号
f. ^- P: \: N4 a N2 e#include <sys/types.h> //消息对列; F" c' _0 d' @, w) @7 V
#include <sys/ipc.h> //消息队列- X+ Q% T8 t/ R9 P
#include <sys/msg.h> //消息队列 p" x( `. h3 S3 B L
#include <sys/select.h>* K! M; m$ U* g5 f3 E# \% ]/ T
#include <sys/syscall.h>
0 u! c4 p0 k% g0 A8 p3 i& y#include <sys/stat.h># z0 B* j, u+ k' z& U
#include <sys/mman.h>; Y ~. A! _5 f' d* s
#define msleep(x) usleep(1000*x)9 t D' J1 O( c% C
7 l5 d9 X3 d7 l; @0 e; l2 ~int main() i- x Z2 J/ [# Q, o* e8 b& O
{
( f+ H, _; h4 ?! u //MCBSP,ARM与AMBE2000交互设备
) _4 ]( N# R, q3 ^5 d: T2 o ~ int fd;
' ]) Q. {% D6 J- g8 [ unsigned short data_write = 0x5555;" [- Q' b/ f4 d0 O: j* c
unsigned short data_read = 0x00;0 N; G% l& `: B
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* r9 p( @; W t3 n
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);: ^! f& v2 s# K* W
; ^$ k9 {7 j9 F# }4 i3 _" Y4 C
if(fd < 0)# i; d8 I, K6 i* r8 }" K4 t9 e
{2 d# c$ L3 L7 n5 b4 r5 S' @* h
perror("open failed\n");
! Z6 w/ Q7 d4 H4 P! H return -1;& o3 p' l+ Y* o; M; B& O5 u& r
}
# [+ _/ e& F% o/ T( e4 }
4 k- X& _! d$ c; P, D5 r+ I while(1)7 U( i q$ k* V- T! e4 b/ ~
{
: }7 A3 R& n; z7 A' z; M! L4 D - V0 {5 V$ ]8 n- z1 h
//AMBE2000每次读写是24个字为一帧9 i4 z' h0 H l. ]
//写数据时将数据在底层存储起来,等到中断的时候再发送
1 y# ~) m6 z1 U8 p //AMBE2000输入数据是以0x13EC开头的
; |" ~& I5 I; @6 X7 M- J6 S write(fd,&data_write,sizeof(unsigned short));6 n+ K4 J! d* z3 r9 e& |
# a; [7 j: Z, D* ^1 f
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 8 w3 [$ v1 T' ~4 W
read(fd,&data_read,sizeof(unsigned short));
2 C1 |5 w" A0 U. G
& R7 v& V, G0 R- p if(data_read == 0x13Ec)% r* Y) f7 v4 k0 Q
{
! T6 Z4 s1 X7 r
& W3 r1 h6 M$ y8 S, t printf("data_read = %x\n",data_read);
8 m( i$ h7 L' q* W. m( c+ { }
$ ]; m1 }, I7 H. ]% i5 t6 H. b
& ?! d& f& C4 J" f msleep(10);
+ F( `8 P* t4 J, ]. ] , B) z) ]2 I! e& [- d3 V6 T; Q, e
/*& V2 s% s4 I( F0 q9 |6 _$ E
ioctl(fd,1);
, G1 {' K1 q0 j: O) @7 |0 m sleep(1);
+ Z8 i3 z* A9 @ ioctl(fd,0);
0 b$ ]2 f/ G5 B# `9 I+ T! h sleep(1);
) R) F8 Y6 G. T1 n5 x( f0 B */ + M0 t: B' q0 ~; B
}
1 p: r8 |" w1 z" K: | return 0;
. R+ o% P% H m G4 B $ z( h7 n/ Z" M+ V; K% u
}% `3 ]5 H5 W: L* o( M7 Q' n; U
8 b. Z( y$ g+ x3 n) C# e0 P多谢各位指教,谢谢! 急
; Q2 `! _; M" c: k. S
% [$ [* y0 U( U1 s9 i7 G" V X+ D8 d7 Q% ~3 p
* \. e! v7 R( V, H+ M
! D0 ?+ x" P: C- Z6 }
: m, l3 _$ J0 o' k- c |
|