|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 h6 k) N( {- t' l5 p: V/*1 Z% d ]3 P: _; X/ g( Y6 _
* Copyright (C) 2009 Texas Instruments Inc
Z& R6 R; L) O *
# i( m2 v) K. s5 l * This program is free software; you can redistribute it and/or modify
) R& o4 ] `8 V/ k& V. |* O * it under the terms of the GNU General Public License as published by$ J$ a9 p" w9 G# K9 q
* the Free Software Foundation; either version 2 of the License, or9 i/ _0 o5 t1 ?% e* k, L" q5 ~6 y4 B
* (at your option)any later version.' r. ~, g R8 q( s
*
]. F3 ^3 f, S+ _4 c * This program is distributed in the hope that it will be useful,
2 {4 ^! d% r; X# S) m0 b6 } * but WITHOUT ANY WARRANTY; without even the implied warranty of
' F: L+ w6 m$ O* r3 w * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, D$ Y* A, Y N( F/ F" `! j
* GNU General Public License for more details.7 K5 G) l7 Z' J2 A3 Q7 C
*
; X/ C; \3 c9 F+ }1 u7 R5 [0 S/ h * You should have received a copy of the GNU General Public License
+ B3 D$ l' ?% {. l7 K+ f7 v3 \ * along with this program; if not, write to the Free Software8 \. C: d6 x& d/ O4 P
* Foundati$ f5 [2 g, n2 D C
*/
! i$ `3 H) I+ q- f#include <linux/module.h>
- L" ^- z% F8 i0 L8 _; F, [& c, x- F#include <linux/init.h>
6 Z, `+ u5 m5 [' _#include <linux/errno.h>* X/ Q; p9 M% t9 C; N- b, ~
#include <linux/types.h>; U$ \8 F7 `% A0 `: z- B G
#include <linux/interrupt.h>" b/ D {" X- l7 t3 L. _
#include <linux/io.h>
4 p5 R5 n. `: B! \8 f#include <linux/sysctl.h>7 ]) U, ]9 v7 `1 w4 C8 w
#include <linux/mm.h>0 `! V: f# x3 X n4 z& y
#include <linux/delay.h>" n! ^' n, N& C" B/ K* M
#include<linux/kernel.h>
. ~2 B3 e& l9 U7 |2 `/ N3 H( `( V#include<linux/fs.h>
: p% J4 T$ @* R; v+ k#include<linux/ioctl.h>
j8 O( Z1 ?/ A- f8 J#include<linux/cdev.h>6 `4 |* ^! o- d; V- T
#include<linux/kdev_t.h>' h4 h9 Z' \ }; S
#include<linux/gpio.h>/ M/ ~; ~ T" k) W3 T. O" M* |& ~
#include <mach/hardware.h>
! n, ]$ G! }. N1 Y* Z#include <mach/irqs.h>7 R) K9 P o0 X% l. K
" b- Q! F& U; i) r1 @; F- m
#include <asm/mach-types.h>8 j- R. E+ t' g; W
#include <asm/mach/arch.h>
6 v' J- U, D- c0 m l2 Y/ K; D#include <mach/da8xx.h>/ X( d. _& W6 a8 D& Z
#define SYSCFG_BASE 0x01c14000/ Y4 C# K9 s* G' L# X$ ]% ?
#define PINMUX1_OFFSET 0x124
1 o, ]% }6 u6 s l#define PINMUX18_OFFSET 0x168
+ T5 `/ H5 Y5 p#define PINMUX19_OFFSET 0x16c+ l% P( w/ n# C; y- v+ Q# S
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR: s& G* K' e! E6 O
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
+ m5 W' I: B: u! ?#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
3 ~7 ?; j: Y9 _6 X: ~#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
$ Y, r; w& ?, C. i, n; a#define PCR_ADDR 0x01D11024 //MCBSP1_PCR c7 D. i: o0 R) |6 @. H3 l* ]
d, P H% w3 Z& Q5 J/ v! N, U#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
4 u1 N: J* [/ N3 _6 N; p#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
4 Y: w( s# R( r" N9 {) c' u+ `//PSC( j% y) x" R8 d
#define PTCMD_ADDR 0x01E27120
$ ~2 z1 C+ J' h0 U#define MDCTL15_ADDR 0x01E27A3C& c" H5 ?3 D) E6 [+ e! j1 S
#define PDCTL1_ADDR 0x01E27304
3 s" L7 `* E3 c+ v& r//GPIO8 direction
: }5 p$ ^- V% `/ q" n& p6 H, @. o# c#define GPIO8_DIRECT 0x01E260B0
; O" ~- z6 d/ Z$ z0 ~3 s% i4 V#define GPIO8_OUT 0x01E260B4
! d* I5 b8 h0 M6 q5 d/ W7 p#define GPIO8_IN 0x01E260C0
) _ P& V* f# D) L+ v! X' V% T4 f4 Z. Z. V
//#define MCBSP1_RINT 99 . V+ _' D _: v$ ^( s
//#define MCBSP1_XINT 100 5 k1 @7 r: O1 ?5 u+ k! c5 N
static int MCBSP_MAJOR=239;) W/ ^$ S/ Y7 }$ i7 E+ d
static int MCBSP_MINOR=0;0 M% k M) U" n! ^; u k
static int count =1;$ U1 m4 w- e4 v) N7 G
# \0 G7 O, d0 ]! M U& A+ R- O#define MCBSP_NAME "MCBSP-device"* B2 F9 t& l; t; j) o4 ^
1 l* Q; L6 }' u0 zstatic struct cdev *mcbsp_cdev;
% }; F5 D1 S& _2 M7 ?static struct class *mcbsp_class;0 V/ c, X/ A% }- T9 X
static dev_t mcbsp_dev;& V* }; A' q" b& @' i3 G7 H
unsigned int DRR_data;# d' [ Y" W; h% q$ s
unsigned int DXR_data;
0 ^' U8 H3 C8 i r5 E# ]' U2 u; gstatic int mcbsp_open(struct inode *inode,struct file *file)
7 N+ t1 a8 Y* K( g$ _- A{
9 U: m2 O2 T9 D) |
& D. U4 m6 s- I //interrupt enable,initialized3 Z( ^7 e- q$ ?9 y
unsigned int temp;
# q! V$ \, @; E& W //SLEEP_EN(GPIO8[10])---0+ Y ^$ r, X: m
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' U7 j6 h0 B1 `9 p temp=temp&(~0x00000400);$ N- A0 \3 R2 I/ L2 G% F) l
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]& W9 p* @8 B6 R( G6 B2 w! p( a
//RESETn(GPIO8[8])----0----1 ?9 p7 j6 p: Z. {1 u
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));# w8 q% y8 z0 v5 q s
temp=temp&(~0x00000100);3 n6 B8 {( i0 O" E- _3 Q
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. F/ W' [8 g/ @# \' A0 I* f. [ udelay(100);
. m2 x; r6 a) x6 Y6 O! d temp=temp| 0x00000100;
# u0 E2 m4 g! e% r; Q: m' Q# u __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, ^+ q/ i9 G( K) v% W udelay(100);
; v9 f: T! ^0 P5 P5 y' V printk("open success!\n");& D1 w' @$ x5 q5 O$ W' C' h# F7 \
return 0;
/ w9 ~8 S ?4 A# g" D7 b}
$ q, Z$ k) w, R
& i( T. X" N" U0 q) z; V: v! zstatic int mcbsp_release(struct inode *inode,struct file *file)( c6 m! |2 {4 w& C3 L
{8 d# h- W' I9 n. A
printk("release success!\n");
$ Q" d; ~' ]/ M' e- f return 0;$ w8 ~; t0 T8 Z7 T a
}. y1 s* G3 ]' k
# F. R9 s. d$ y' y7 }) ?! L
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; l& l8 l" ?0 p2 I: n{7 {/ O# ~) h! f3 l- ?
copy_from_user(&DXR_data,buf,len);: u% x0 W e, w2 Q$ |( }8 ?
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 7 f$ b) r# I0 H4 {- Q
return 0;+ B! e& Y I+ U) ~3 x; _6 \
" w- `, e R: s& K}
& D$ z9 _5 d9 R
, `# z U. e( T; L$ a2 C! Zstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
; R# m& G: ?; k* N; v" a{
$ I- ]6 F( M' H DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, Y+ R% Y8 T$ _1 H0 {5 V( b
copy_to_user(buf,&DRR_data,len); ' {8 M2 G( Q( v: c8 G# {
return 0;
, c6 }# m C6 E Y% l: d s}' f7 x3 \3 w, ^/ i" o4 q& `1 u
) c+ U+ G, Z0 s3 N8 `! A5 b* W/ i
static struct file_operations mcbsp_fops=5 r9 t0 G7 q; W- K- R' z
{/ z5 _: J6 f' y3 s3 v# S% E
.owner=THIS_MODULE,2 n( w& X4 ?. ^, B6 J
.open=mcbsp_open,
) T6 W! V/ m3 X# P, |( V4 i a .release=mcbsp_release,
* w7 V( w! T) a; M; a$ w .write=mcbsp_write,
/ D* i6 K$ T/ d6 }, n+ M! M w# V .read=mcbsp_read,
1 o6 x+ O: Y- y2 o8 O/ e}; L8 ]( a+ t$ w5 i9 x1 Y2 C6 Y
static int __init MCBSP_init(void)3 {2 l" w$ B! v$ k+ L
{+ K5 F3 g x; ]
int ret; _, k4 h9 O; Q1 x7 d$ v
unsigned int PINMUX1_REG_old;
e9 G0 t0 e, Q c9 v n unsigned int PINMUX18_REG_old;
, A+ s f0 R( J* H unsigned int PINMUX19_REG_old;
+ K3 D! H5 [9 h/ t' I unsigned int temp; / p+ q b5 B; U9 J( ]
if(MCBSP_MAJOR)6 B! E% v! a$ n3 R/ C) ~* n
{
* Q% k* l( G7 G& W. X/ E% G& I% z V mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);* {: Z# o. M1 O& ]# _0 O+ Y5 t& D
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);6 U( I8 K" x; @8 V
}
/ `5 L! a3 X5 b4 }& C else/ y# n; L( R& j, A8 A0 s
{& Z6 b1 J4 q3 {# ]- z
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 ]5 n) u, V6 M! Q
MCBSP_MAJOR=MAJOR(mcbsp_dev);% H- g) c9 H. _# P9 T. k9 L. r: `
}1 c' ?2 c2 S0 d9 G# k& G) ~
" p% G& W9 I0 {+ b+ g$ t7 Z
if(ret<0)# V4 V9 S. m$ g6 }: m0 S
{; Q; R( y- Y$ w# J: }! P/ R+ D
printk(KERN_ERR "register chrdev fail!");
8 R" ^8 Q3 [' f/ N; ^. P4 a" i3 R. } return -1;3 B* x$ F5 a" P0 w/ e" t
}3 X: j# @2 ~" R% I" O$ _: t! }3 Y6 a
$ m* G1 e. A% [( P, v7 N mcbsp_cdev=cdev_alloc();3 S, T4 S5 a' ^+ ]) d
+ m6 J, i9 Y& _5 L0 h: } if(mcbsp_cdev!=NULL), v, F# h. j5 ^. g" F: S3 A
{4 I9 j+ e2 |! {. ~( |$ I% H
cdev_init(mcbsp_cdev,&mcbsp_fops);
2 _% p8 k1 t! R& \) i! I7 l mcbsp_cdev->ops=&mcbsp_fops;
# {# G {0 J! q& p' J mcbsp_cdev->owner=THIS_MODULE;: S5 w) X+ c1 ]' V) q) e. H
& ^5 S3 s& ]3 f( q7 D% q& e if(cdev_add(mcbsp_cdev,mcbsp_dev,count)). [" p" B. H& s% A# ]/ _# e
printk(KERN_ERR "register cdev fail!");* i* d5 ^4 E- k" S
else7 \7 _9 [% J. s% o: n
printk(KERN_ERR "register success!\n");$ ^' X7 O, \/ v, B3 N2 Q3 a
}
- v) R5 T3 v8 h/ R9 Z* r9 m, a3 l else3 N3 g W. Y3 L3 N8 A0 x, H
{3 Y3 |! H! _ F
printk(KERN_ERR "register cdev err!");
/ N# H8 h) u( n7 D" T# u return -1;
4 _; j$ Y1 h- e. ~) _ }8 u$ O+ A: u, O& q; T1 j s, `
3 f7 j( F) l' k' c _: F7 P' s
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);5 V% n8 z3 ?1 w9 ^+ d( ? e1 }0 }
if(IS_ERR(mcbsp_class))
* R0 U. v+ ^* M$ B1 Z {
6 P- V2 n; [% N printk(KERN_ERR "register class err!");
8 S" I7 l5 o7 a: f9 ^+ ?! u! e0 n return -1;
! }2 _6 h; ~. Q: E5 Z& C8 c }
/ e: f/ u& x0 }* h2 L- j device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
; S7 H L7 {1 ~) r# @
_: Q( N" U# e //PSC% n/ e# z; {: i L' ~* a! i
//add Enable MCBSP) k% d+ E3 o d
//test. }: i1 i9 g$ k- i8 W2 {
temp = 0x80000003;
; J5 _ s" |8 b& H6 U7 Y3 @ writel(temp, IO_ADDRESS(MDCTL15_ADDR));
+ ~5 @5 D* \# K4 P' ]* P) y6 | temp = 0x00000003;, j4 ?* U9 r X: y3 N
writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 A+ L$ w ^ C: a ; i' t% p& O2 e t/ s' T# z v8 {
temp = 0x001FF201;7 z. ?, q2 ^) ^4 ?! ]5 m9 s( ?
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
6 \$ S$ Z9 Y' U! ]
' ^4 o$ y& Z3 M //PINMUX ! `! W8 i2 r0 J: l/ U# m
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
; w& Q U: @4 V* a+ ]8 u PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ H; R" A# U4 {: [1 W) x; ]2 f PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ) u$ b6 Y* f C' S: u
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 F; V/ c. U. n) ~9 T. _ / h8 s3 P9 w) e
//SLEEP_EN,EPR,L138_SHK1,L138_RC
. G) B( `( I. b# A! z2 f PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); v: @3 q4 g* F
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
# h: p- q) x: a ?: z2 y writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# g7 s. P9 G3 c/ v; a3 Y- @
* f3 c( t) H. ]/ C$ _4 O/ R //RESETn,L138_SHK2: m& k5 ` @2 f% M9 J8 k. `
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 6 m& T7 O+ m8 `. N
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; : v/ s$ x5 x+ U" W
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- s$ c, a) A, Z7 M 1 u& ?( e6 L9 D3 m6 n* b
' C' h4 o2 U* n( w/ W' J/ E; j" b //SPCR Register
) u; @9 D9 U$ A# | //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" e5 P- l1 @, K temp = 0x03000000;//(DLB=0)
+ ^; R5 [; N7 {- O: D; ? // temp = 0x03008000;//(DLB=1)! N+ r7 \' B2 C+ t% d
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset, N& ]5 T! U8 r" ]6 j. J# ]
temp = readl(IO_ADDRESS(SPCR_ADDR));9 L" z: B. o0 m) @+ w
printk("temp=%x\n",temp);9 N3 I, q' U% F8 W) G/ R
& @9 o7 D! I. d, `- M2 B
//PCR Register
7 o$ [0 N% [5 @9 E: n //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0% T; x: H& U4 F0 X1 \( [
// temp = 0x00000F0F;$ S" r: M" }& q8 d
temp = 0x00000B0F;
* C& u2 C" j8 Y9 v0 p writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized $ I F* B' Z/ b$ G6 Y' ^1 ^
temp = readl(IO_ADDRESS(PCR_ADDR));
4 ?' d- _# l- \+ X2 ]* W( F9 M- i printk("temp=%x\n",temp);
4 \ l5 w/ _9 X' t* N+ R/ J8 W //SRGR Register
6 X3 ^( j) y* Q3 e; A. a( K9 @7 M //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( D& r# M3 A8 i0 i& e+ {. i
//temp = 0x301F000B;( Z3 ]7 ~+ h6 K& H4 f$ ^4 v) z
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized " E# z9 q1 H8 U
temp = readl(IO_ADDRESS(SRGR_ADDR));
# B0 `7 Y7 s# w4 A' B printk("temp=%x\n",temp);
$ ?6 Y- u7 B2 R2 T+ x //RCR% }. A7 v7 P, S) ~. D7 B
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 Y% N2 W _$ f, D, B. g1 |
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 d9 g( Z5 j$ R, P
temp = 0x00440040;& j$ F B2 S6 \6 c
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 8 c d& h9 ~: B9 h
temp = readl(IO_ADDRESS(RCR_ADDR));
2 W# c F+ m' ]2 P: g) S/ m% z printk("temp=%x\n",temp);8 t7 {2 a- u1 _0 B" E1 s
//XCR
7 N4 ^% ~: }1 {" C0 H& ?' x% x //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 B2 ]" W& L( M& L6 Q0 |
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 [) u% b! y5 {( v- ~* e- o
temp = 0x00440040;
- Q( n V* H: S1 _* n$ \ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
8 c7 K4 w3 h# u( r& ~ _& e temp = readl(IO_ADDRESS(XCR_ADDR));
+ h% w- R! V( |. b2 c$ A9 H printk("temp=%x\n",temp);
# W/ b* }" f4 {: m udelay(100);
1 L! V; f) b( V9 u //SPCR Register
% P4 `( y8 Y4 a' o //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
6 g9 }/ f1 I& \ temp = 0x03C10001; //DLB = 0 VS DLB = 10 ~1 { m' K+ b
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled4 s& }1 P2 q# D- E
temp = readl(IO_ADDRESS(SPCR_ADDR));# Z; o+ U9 { V1 ?
printk("temp=%x\n",temp);5 R/ R- Y T, y% J5 \/ H5 u. E4 h
udelay(100);9 [' i+ q7 n: R
& M4 e j' W( E8 [2 Z, n //set GPIO direction6 s# q8 {8 s- o$ y5 _! f
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));# d% T' ^$ T3 t
temp = temp | 0x00000100;//EPR----input
: z9 w, I# I5 V temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output, K: H% G9 V! V2 I. p* M. k
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); # D: H* r3 \( b6 r6 g$ N4 g
/ F. v. W$ U; u& r0 q+ L! i
return 0;
, l! ?' L; |8 U: Q1 l6 X8 n5 {}
( o+ f3 H: f t i! g1 Fstatic void __exit MCBSP_exit(void)
; R9 Z7 Z6 n8 s0 ?6 l+ X. h{6 Z" c5 w( G" t1 e0 g4 [) Y+ ]5 n
printk("mcbsp chrdev exit!\n");* g* e% h# k5 y" p, g
cdev_del(mcbsp_cdev);
# T9 x0 U0 s8 g& X* m unregister_chrdev_region(mcbsp_dev,count);! a$ b& z! j9 V( }# @
device_destroy(mcbsp_class,mcbsp_dev);. b( y+ [! d: G3 T) f, F" x
class_destroy(mcbsp_class);) A7 Q0 U& i, W9 p$ \
}+ j& R6 V0 k( n. O Q
module_init(MCBSP_init);5 `" X7 q7 p% T
module_exit(MCBSP_exit);
6 Y! Z, i+ ^2 k
* g7 v. E j* K5 X0 V3 X2 @% bMODULE_LICENSE("GPL");0 T4 Z) a% R' i* K
5 J2 _9 h& C$ T$ M' D
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
6 l- O3 ^* l$ k$ u0 E0 c2 C I我的应用层的测试程序如下# D! l ?/ D9 K* h" S' l
#include <stdio.h>; Y$ G. E2 ^7 n* x) S, U% i! B
#include <string.h># @* U1 d+ o2 h% y5 L
#include <fcntl.h>4 `) O1 N0 p( o: R) n# N5 o
#include <unistd.h>2 V1 Q" a1 _$ D8 U) a5 Y
#include <signal.h>7 I8 n/ `2 t4 ^2 @5 T7 ?8 g4 G+ ^
#include <pthread.h> //线程, k- e& v% J! ?7 T2 q% r+ m8 i
#include <stdlib.h>3 b4 O. l% Q9 r
#include <pcap.h> //捕获网口数据+ w8 ]3 x. |0 t" }8 q: ]
#include <semaphore.h> //信号
) o. a! e B# a |#include <sys/types.h> //消息对列" L( H1 ] b- M0 N
#include <sys/ipc.h> //消息队列
( Q* W4 W2 ~. S6 n# I3 a#include <sys/msg.h> //消息队列7 l/ ~+ y2 c! ~2 K
#include <sys/select.h>2 J( I9 @: C; y E8 D
#include <sys/syscall.h>% V% E2 d2 [" T0 l( P$ l) g
#include <sys/stat.h>
/ f4 I) [$ i! m1 u6 i; l#include <sys/mman.h>
& Q0 V D; {1 k+ y# s4 x#define msleep(x) usleep(1000*x) G4 k- E/ T* \- t% `' y
5 N0 L( P/ U( {- i( g6 V
int main()3 J5 O, j4 e" |9 C% ]
{
- Z9 J) F0 |+ Q( d) B n //MCBSP,ARM与AMBE2000交互设备) A3 w) i0 U% T O. l
int fd;; v: q; F/ C0 [" l& W9 O5 ~# t
unsigned short data_write = 0x5555;
$ n6 K9 S7 F) Y unsigned short data_read = 0x00;
$ M4 L. h8 Y8 `* G' w fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);7 O( r% @) [* J' v& `% i
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);, T; i, q5 \/ ^
0 Y% Q* ^) ~' M0 m) o: T' P1 ? if(fd < 0)
( B" f9 }& p$ f2 E: l# F4 X' R {! |9 v" Z/ I R* y4 n9 B& m! c2 I
perror("open failed\n");
! |7 G5 g; Y( i3 U return -1;
: [. b. o4 A @ }$ e9 s6 T. \- w
5 O( y$ t& X, i+ f9 j+ J while(1)# o; P5 J) m" C" E" f# V/ \
{
$ H$ _* F$ ]/ b" v
' ~4 D0 G1 R/ q+ ~ //AMBE2000每次读写是24个字为一帧
) _3 L, r. K0 M" x) I: r1 u //写数据时将数据在底层存储起来,等到中断的时候再发送$ ^" G0 S9 G. W1 w
//AMBE2000输入数据是以0x13EC开头的
- v9 c+ m3 ?* z& a write(fd,&data_write,sizeof(unsigned short));
- K& t7 N6 B# f$ s
& l: I, t; U3 `; m/ H) r6 a* l //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
( o6 { k. c: e: `* B read(fd,&data_read,sizeof(unsigned short));
4 I6 H; B( S/ }% V6 r 9 @& s" ?2 {6 j3 h- L/ s9 H4 a Y
if(data_read == 0x13Ec)! o/ I) H; e* v# F/ u
{1 D6 h- _$ B- w; r6 _* T- {8 R' a
7 [; [" W5 ~* @
printf("data_read = %x\n",data_read);
+ E. @& j: [ C1 y2 b ~: ~. y0 ?! @ }) S+ z% ], E8 ?' H3 ?( m
, U \9 c9 T: f8 z. s) f" G msleep(10);$ `) P- M2 t' }% N; f% L
7 i! b8 ], ^, t( g6 c' S8 O" |& L
/*
9 x. V9 `2 O/ ^9 W. G) F ioctl(fd,1);
1 h1 J" f+ v& \! h9 T sleep(1);' _5 [6 [/ f4 C
ioctl(fd,0);! U7 W7 G: ?% j+ W4 E8 ]
sleep(1);
, _) R& s5 T) y) t */ ! K4 r* p \; S6 U# Z
}
' j* _, [: u, D4 h' M# Y3 N- h% v1 s return 0;) k7 Q* E: n. a5 U' k# J7 ^$ h! Y
2 B! L5 o8 D. x9 e. h* V
}
7 ]) v+ r# q# S0 N) P+ j- s6 @4 K# Y& @' n) S* ^
多谢各位指教,谢谢! 急& L) b6 y1 n7 V2 K
/ m E# k* D* Z: G7 B6 w
+ D; B1 W) p6 @# P1 ?
, Q6 |1 A+ I. P, v/ H8 t1 V; |0 ?4 W7 _8 ^ v
- [7 I! M! `6 q, E0 j$ O( B$ [ w
|
|