|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
_7 X* N) ^9 S* E+ u. Y8 ^, q1 F% {/*
- h/ H7 x5 C! d% \: i( t * Copyright (C) 2009 Texas Instruments Inc I$ z: v" ~. `
*, O; G0 X( c9 @: M# J
* This program is free software; you can redistribute it and/or modify
( l4 |' l2 }4 } * it under the terms of the GNU General Public License as published by
8 ], [* F7 J! a7 E+ U4 y * the Free Software Foundation; either version 2 of the License, or' B/ U* P% ~0 b9 Z1 M
* (at your option)any later version.+ p# \0 y- }3 k: v$ P
*6 F4 ^' ~) j$ r0 z+ o+ ~
* This program is distributed in the hope that it will be useful," r9 E2 ]# a4 s# W# x
* but WITHOUT ANY WARRANTY; without even the implied warranty of
+ b3 m& x/ J; b" R * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the& E, [) l: U; i& z1 a
* GNU General Public License for more details.
) P Z! i9 V6 E4 N1 x+ u *
/ z6 o) e2 G J) Q * You should have received a copy of the GNU General Public License
1 r7 {$ T2 i2 u) w( Y' y' D4 E# I$ U * along with this program; if not, write to the Free Software
! r% X% a4 q; }" }# w9 s* ?$ j * Foundati
9 y9 Z2 b6 s' d% R/ i- i! r*/6 m$ s# W) f) |% K& X
#include <linux/module.h>$ g$ l# N0 V9 J& g4 b
#include <linux/init.h>2 B9 X! K3 t2 N. O+ u4 L% T+ H
#include <linux/errno.h>
2 a" D( y3 ?3 J4 A4 V# B+ M#include <linux/types.h>
, C& G( [' H s* b* P# O- K0 u#include <linux/interrupt.h>
" k) e( H$ a- w, @#include <linux/io.h>
# y+ i1 F b/ z& i# Y1 K#include <linux/sysctl.h> ]5 J6 x3 r0 F9 R% I) T6 {
#include <linux/mm.h>8 Q+ b7 U: U. m# t# r% C, x1 m8 X/ J
#include <linux/delay.h>. N5 I2 L: l' l+ Q8 q* s
#include<linux/kernel.h>
9 o4 m5 v+ e" h# }3 N- I#include<linux/fs.h>
5 |, Z, w' P% I9 S# [3 g#include<linux/ioctl.h>3 [/ e# S) I0 D9 `
#include<linux/cdev.h>
: c0 O- `: }; x6 `3 ?#include<linux/kdev_t.h>, D7 j! _/ Z6 G" k `
#include<linux/gpio.h>( t' Q* ^7 p- K6 X+ L
#include <mach/hardware.h>
* q, ^. Y% R2 x3 F9 c9 I3 u#include <mach/irqs.h>
2 d0 Z( _1 x/ S8 m6 y2 Y- Y! N: Z \, [
#include <asm/mach-types.h>
; n8 ^: r! f2 N7 _" | ?' \#include <asm/mach/arch.h># v2 _+ {2 J. o" Y
#include <mach/da8xx.h>
6 }: m* o. B& N2 Z: Z#define SYSCFG_BASE 0x01c14000: h6 @! w- _# g5 {8 X" m' z
#define PINMUX1_OFFSET 0x124 / b3 w/ M9 g6 [( j! |) t
#define PINMUX18_OFFSET 0x168 0 u! m- n* }, k' Q
#define PINMUX19_OFFSET 0x16c0 C5 ?! j) P' x
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR7 Z6 i( u6 J; E
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR3 v9 T' X4 Z" t4 [: ]; {9 N
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR& E7 k% S" M% M0 s$ I- N9 ]) j
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
7 H. L9 o9 N3 ?: b" X3 E#define PCR_ADDR 0x01D11024 //MCBSP1_PCR. z* p8 s3 T! z5 h, m
8 ~! f$ V: t2 }; v: B( s1 m4 s) D#define DXR_ADDR 0x01D11004 //MCBSP1_DXR9 _8 o4 I6 R7 q. E( t
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR1 z0 X6 Y2 ~& v3 w# l$ d
//PSC, g' _# b N- V) l, K8 E+ A1 X6 P8 `
#define PTCMD_ADDR 0x01E27120 ' r5 T$ c) K' J
#define MDCTL15_ADDR 0x01E27A3C
9 ?5 T* b& p M8 _1 B, X8 i9 c#define PDCTL1_ADDR 0x01E27304
4 w1 B5 U6 B: }6 W//GPIO8 direction
$ v/ o: r1 R# d) m' r& p#define GPIO8_DIRECT 0x01E260B03 ^$ j L2 O4 T- Z- U6 \3 y
#define GPIO8_OUT 0x01E260B4
1 R- L4 ]% ^, V/ Y! x#define GPIO8_IN 0x01E260C0$ b3 d S4 [% z% z1 S, r$ L
# e8 w v0 U8 x
//#define MCBSP1_RINT 99 + }* t% F9 M- D+ Q7 j& ?
//#define MCBSP1_XINT 100
4 E; m1 x2 P5 w- a& ~' ?. }, l2 k, dstatic int MCBSP_MAJOR=239;
* ]3 o9 v. H' p$ e) Gstatic int MCBSP_MINOR=0;
$ t! Q3 @0 }% R/ r* R9 p3 h: @static int count =1;: X, P S7 {0 ]. o
) p; H) U, l* j1 _; o8 Z8 a( L! G#define MCBSP_NAME "MCBSP-device"9 S4 S% r' z& {. D$ c" T
- T0 x$ u+ `, r
static struct cdev *mcbsp_cdev;
, V& r$ }0 M: Gstatic struct class *mcbsp_class;
) y& I6 Q% S- x% B$ {static dev_t mcbsp_dev;) `' X- l3 n7 z6 c! m j( z
unsigned int DRR_data;* [- r/ D8 i* O2 j& ~6 F* h
unsigned int DXR_data;2 t. K1 ?' p0 U& ]0 |) K
static int mcbsp_open(struct inode *inode,struct file *file)9 y6 o- y8 W3 I. s. N
{
0 I, Z* C- @1 D& P5 l' j' h0 |& x 9 \4 n2 {3 U$ H/ C. y
//interrupt enable,initialized
. C* i0 z& w: ^# _ unsigned int temp;! g8 H/ c% R8 u4 V% K* B5 I1 q0 s# R
//SLEEP_EN(GPIO8[10])---0
4 E' i% U: H( ]& B9 Z: I$ Q; U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ `$ ^6 ^# A5 u% V* S0 ~1 p1 O" X6 N/ y temp=temp&(~0x00000400);
% I9 \! b/ f3 q1 G __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]0 Q h& b# _( V* I1 P G5 W* e# p7 v
//RESETn(GPIO8[8])----0----16 |: U+ R- I. |; l- n' G
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* X. V r% ~( M
temp=temp&(~0x00000100);
- v& f1 Y0 ]; g __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0; o1 D9 h' g8 f: i' H2 N9 h
udelay(100);
) q* v5 k( {, G+ y C temp=temp| 0x00000100;3 F, r7 }' o4 X$ }4 T
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; k# p! E7 y% ^$ ~ I" [# S& d udelay(100);
) ^. ?6 r6 F3 |0 W* n) ~& E printk("open success!\n"); d- c4 e. Q+ P" F
return 0;
" x X$ U) l+ x l4 _: J. }}
* p( u4 g' _0 y- P7 a3 g! K& z5 T6 `4 U; j
static int mcbsp_release(struct inode *inode,struct file *file)
* N R' P" ]# h/ n{9 u# Y) g: x4 p
printk("release success!\n"); M0 h& V+ ]4 P% R. h
return 0;
6 ]) E- D. H) O9 o}
/ L: C1 @' ?( u6 t
$ U6 D9 b7 p) \3 Bstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
8 ~4 y3 {+ f1 \4 \% w- i5 N{
3 p) O4 ^. t ?- f copy_from_user(&DXR_data,buf,len);! N& p/ i/ L, B. }
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 7 a* I u& q, Q; V
return 0;% R; L5 D% f( S. f) }5 O
9 ~' P0 E$ q! j9 C/ @" m( l
}
, ?3 r% y. e1 L+ ?" O4 V# O# h6 I7 x
/ K* k( X4 N$ ~; `5 X! Y3 E# Sstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
3 l0 m/ U1 W! t; P0 i& e{ ! |* I; x T- [; N
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
/ ]- q' r" o, G$ V copy_to_user(buf,&DRR_data,len); , A9 f/ o% E& v: M3 }5 O9 p
return 0;
5 D- p( `9 f9 @, u! @+ {4 @}
- c' Y s/ {9 e V& z( F g& J7 R) r! `+ I6 k+ N% \
- A5 j G7 b2 x6 ]* ` Z2 H* K
static struct file_operations mcbsp_fops=% y9 \/ [& T- n
{, j' s) B: W( `/ O4 [0 ?. }" Q
.owner=THIS_MODULE,8 m8 i) g4 Z. U. w
.open=mcbsp_open,% d' ~6 H" N, U& i; u
.release=mcbsp_release,
6 O- W5 U, v- B. A4 X$ P .write=mcbsp_write,$ J) ?: q( V0 g; T- U; Z, L
.read=mcbsp_read, P, i( {, X. E8 L# \; y& x
};
. f y& M* P; Q! z0 ?static int __init MCBSP_init(void)3 ~3 y. Q2 ?1 ~: h w ~
{
8 y" F& B$ |9 K2 L8 e. D, f int ret;& i* s6 D7 k+ S, V
unsigned int PINMUX1_REG_old;
8 P( [/ {+ j3 T& y6 g4 N unsigned int PINMUX18_REG_old;1 x/ E; J- v! I, H; S
unsigned int PINMUX19_REG_old; I' r9 L( f9 [* c2 S" ^# K
unsigned int temp; 1 \+ Y* q. D( V/ i) l! J
if(MCBSP_MAJOR)7 P* M4 J8 R% p8 k i+ q
{0 g: ?$ v# `2 P
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
6 U6 R6 o2 }4 v* ^; S$ { ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
3 T* r. z# @# M+ Q3 z }0 O2 w$ G: ~4 P+ V* {
else! T+ f$ E" H: m& S* ~6 P
{) h0 ]/ |/ P$ _5 P1 h0 _- r* Y
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& L4 ^3 q9 N% Z9 i5 d) T MCBSP_MAJOR=MAJOR(mcbsp_dev);
# l9 b, B! o9 _2 r }0 P' {. C4 B+ @" H, A" w
* }! d9 S$ c9 t; e7 t& D j* k# _+ o if(ret<0)7 L1 S* H. v' \
{+ I. H* [, b) _9 l3 k
printk(KERN_ERR "register chrdev fail!");
* A6 \/ Q/ b% m1 s return -1;
% v! q8 M+ s% b9 q- d }: B2 R; l( m1 p
5 i1 v( u5 [% d' H% Q9 C
mcbsp_cdev=cdev_alloc();" m& H1 M9 _! T- Y+ C/ X
0 t/ z* c4 C% I if(mcbsp_cdev!=NULL)# x2 K0 q0 V2 `4 [/ \
{9 P( {( [" n: \3 a- e4 ^: L; A
cdev_init(mcbsp_cdev,&mcbsp_fops);
9 p% R8 T$ g; e/ p0 C0 s7 G* P mcbsp_cdev->ops=&mcbsp_fops;
: n% ^5 r; w7 d# ?9 ^8 ~ t9 R mcbsp_cdev->owner=THIS_MODULE;
6 W: g2 D5 b& G* u/ G
7 J3 {% `6 H% S/ J if(cdev_add(mcbsp_cdev,mcbsp_dev,count))" |( f& p" p/ q% P
printk(KERN_ERR "register cdev fail!");
9 e& V- D) ]) K4 D else
) C; A3 X, s; l) A$ `$ V printk(KERN_ERR "register success!\n");
8 l8 Z" E) J; l3 X( ^+ a }
1 Y8 m& S$ D0 j6 V. I else
8 a& V _. P# z {
! Z) j m* U, \3 i/ a" F printk(KERN_ERR "register cdev err!");
) C( E2 u, [; m! _( T6 B9 Y6 [ return -1;; R, L2 h3 d& g* x" Z
}, r3 f8 v. m* i
4 Y) { ]+ B; Z
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- @2 r. k$ U% t& `, W# r3 b7 N. r7 \! p if(IS_ERR(mcbsp_class)), u( r& d1 M7 [1 e8 ~. s
{
- Y) D: F& W/ S, I printk(KERN_ERR "register class err!");' ?2 I1 Q9 X8 W5 I. T* Y
return -1;
) V+ Y3 [; ?& @6 N v, y }
2 C3 t/ a( k* N, F device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 l# G4 p. L* [% f: R. ?
& z! O( E6 }1 X. D# p6 _ //PSC3 q, B0 j& ?4 l3 ]+ R* M/ T2 J
//add Enable MCBSP
6 e5 K6 D" X. a2 z8 p$ u2 }) Z //test
1 A/ D% I* p5 }9 l( I; c5 s( ] temp = 0x80000003;( i6 ^5 B+ x) [' T/ g8 J6 R
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 K* d8 o9 J; \5 O- q! @1 o temp = 0x00000003;
x+ T9 b% J0 p# b. f7 h writel(temp, IO_ADDRESS(PTCMD_ADDR));; l, J( X! E% }0 |
4 V2 G b" m8 C temp = 0x001FF201;
, L: P) u: ]& {) L; U+ X. z writel(temp, IO_ADDRESS(PDCTL1_ADDR));" _6 Q7 S: W) d9 b
8 @; v$ Z4 }# S. H2 N* G) @; s //PINMUX
' r Z5 L1 y& p: [ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,; x: _/ \6 r0 Y* A7 z+ m
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); & @* F) i0 I4 Z1 F* X ^
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 2 E. n4 J6 C: M5 c1 o- ]3 N( P
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);2 L- m( o" T5 _% d+ N" l/ s: S
) ?0 d# {) O* Q4 X
//SLEEP_EN,EPR,L138_SHK1,L138_RC' @9 C; |4 A( ?
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! g1 W3 K( ]2 j; ~ PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ( Q/ h3 N& s6 h$ S& @
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); a+ F' m% i$ s
: I* R3 D4 H: \2 t" |& E //RESETn,L138_SHK2
. o1 c0 C7 x1 d2 ^: [5 X- c5 n2 H PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 _4 O. A1 O, M0 n9 Z* M3 x PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
2 x% H0 D- j7 `2 f) N% _8 Z% L writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) X( `, b+ F, w
" @9 s- A4 a$ Y
( J& ?2 p' }3 f6 A3 C+ |, I, x //SPCR Register* y: }0 v2 J, r# u" a
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" r+ ^6 G, G* j( Q2 b+ [/ I1 x) @ temp = 0x03000000;//(DLB=0)7 X j9 d5 O8 \8 k, T/ K
// temp = 0x03008000;//(DLB=1)
: o( {' L3 A3 f# {$ y8 w1 P; X9 Y writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset! h2 k+ ^+ s$ s3 h) ^' k
temp = readl(IO_ADDRESS(SPCR_ADDR));
9 w& m* Q- e+ c2 b" A% d) C+ }$ D printk("temp=%x\n",temp);1 g4 m4 D5 `( I* j
% j( i9 L/ f: N6 N" u8 Z* @2 T
//PCR Register& w, {' K& t R4 b* E* v8 l
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 _: b9 V* u6 Q$ u5 @1 K1 n2 Z // temp = 0x00000F0F;
' R N! g3 w, f8 M temp = 0x00000B0F;
+ j! v) A7 y' O. H9 ?% m1 z7 \+ u writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized \0 e/ K+ N, r5 O1 B
temp = readl(IO_ADDRESS(PCR_ADDR));
# _, E0 L/ s$ F. ?* X3 Z/ z printk("temp=%x\n",temp); 7 u2 z$ G/ \ V* O9 ?9 e( q
//SRGR Register
9 F+ c9 n# R( _+ Z6 j1 U" y //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 b# W% ~) ]' N* p {: u4 ~# d' x
//temp = 0x301F000B;4 I8 P% r. O1 R+ [' b( `
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 2 N, B3 q! N! p' z' }' d( e' ]
temp = readl(IO_ADDRESS(SRGR_ADDR));3 F; {. k6 S9 ]4 |" o6 _
printk("temp=%x\n",temp);% |) z; e) m6 ]: y0 f; v
//RCR
2 w7 M9 d3 v9 x. G2 W //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
/ f/ X. M+ H% s //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
# e; c6 [7 Q: m1 X% D4 @7 G& ? temp = 0x00440040;
) k% A7 w. ^! o$ v writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
R" d- h( g" |. H2 E9 O- a temp = readl(IO_ADDRESS(RCR_ADDR));5 \5 L" h% \( Q2 ~2 H
printk("temp=%x\n",temp);) `5 F( w7 d( G( i8 t1 M
//XCR% L) E6 P5 e% B Y" }' }
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% b) s$ U$ ^/ n5 `/ O
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
1 o% b$ L }+ H. @' Q% y temp = 0x00440040;, O& J4 S. J! P0 p+ V$ }9 |" P
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
0 R4 w" `% s3 L% R- ~6 ~ temp = readl(IO_ADDRESS(XCR_ADDR));0 c+ a8 {2 B$ N' T- m, o) r
printk("temp=%x\n",temp);$ ~: O9 I# G' u6 s8 _
udelay(100);
. @+ J% i0 K9 O+ g; }$ d5 x //SPCR Register
! i7 J1 J( E6 ~ //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 C: F: a0 A: o! ]+ G! ?% r
temp = 0x03C10001; //DLB = 0 VS DLB = 14 i: T4 q4 l0 U
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled% i8 x/ K$ t3 f; \5 T0 p# f
temp = readl(IO_ADDRESS(SPCR_ADDR));, Y$ u! ~: X7 X, ^" |% C# t. {! S
printk("temp=%x\n",temp);/ r- \- n% `: U* C
udelay(100);
2 z' W: K/ m9 v2 R# f# j1 _7 O
2 m" {/ u& M- p //set GPIO direction
6 y2 w2 I4 V- x' Z2 _9 i temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! y8 q K0 v, S& ^ temp = temp | 0x00000100;//EPR----input( t$ ^) e$ d. h6 C) M' C
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output$ O5 q) b* x* _) W( U
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 ?% B4 t! U' V. Q& Z. G7 @) ~
* D' `% R3 s. I4 z" s5 M0 \
return 0;/ J$ j0 b' ?! y: S
}
2 m. H% o5 ]" p- }9 Xstatic void __exit MCBSP_exit(void)
* p f6 i; P+ @{* ^1 }1 b L. s( K$ a
printk("mcbsp chrdev exit!\n");
( r/ Z$ d' A+ D2 G& }8 { cdev_del(mcbsp_cdev);
. ]* b" {% b: c9 _3 S6 Q unregister_chrdev_region(mcbsp_dev,count);
% E' j! }/ M3 h$ M, ]2 G6 u+ h& k) G device_destroy(mcbsp_class,mcbsp_dev);- j3 i, w. u3 F& @
class_destroy(mcbsp_class);* |4 b0 N7 l7 D
}3 x6 T0 F/ x/ K. H. b/ p/ l, c
module_init(MCBSP_init);
8 i+ t9 {: P1 L/ _" O! P6 x/ A R8 E. [module_exit(MCBSP_exit);
7 [ Q% i0 O& D2 _' b6 h6 E+ G9 V/ \( d
MODULE_LICENSE("GPL");% p& W, r8 {/ U# U$ c# G1 }3 w
3 V0 J& F; s) }- E, W
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
; J! u; z4 \& S0 d3 k% `) [$ f& v3 M我的应用层的测试程序如下
& A6 u/ l1 L7 Q: t4 ?" l( y( `#include <stdio.h>
' P' L2 x% g8 F#include <string.h>& Y# R" ^# [3 b! m
#include <fcntl.h>
& E7 P' _4 r9 E0 i+ e#include <unistd.h>
4 z f' S* `0 X3 _5 {#include <signal.h>2 E: f# s7 A! T' q4 q
#include <pthread.h> //线程
$ E- |+ s: w, E h3 R#include <stdlib.h>
- q) R6 E3 [% y* ^9 @) J6 X, y9 C#include <pcap.h> //捕获网口数据! u5 w; n$ n k3 A
#include <semaphore.h> //信号
4 R, u$ P4 S4 b( A#include <sys/types.h> //消息对列- A# k3 S( g" I
#include <sys/ipc.h> //消息队列( P/ E `1 }: h$ Y) O- ^& @
#include <sys/msg.h> //消息队列1 W- X6 a1 w' T4 M0 F N
#include <sys/select.h>
+ M. t% A8 w7 y( W" x1 z+ p+ U#include <sys/syscall.h>- ^0 v) N- C8 R" I8 m2 r+ C2 l
#include <sys/stat.h> L8 l0 B5 B5 ^+ W+ K3 }! z4 X5 O
#include <sys/mman.h>% C: S/ F a0 R+ ]! O% C3 U2 S9 K1 ~
#define msleep(x) usleep(1000*x), W% A# d, ]8 j( F/ s
( H/ `1 l) z+ e; f% j
int main()
0 M: @. U" u7 P7 C5 G, \( f, ~{ ) k4 p* m) q# [9 x. h5 U$ h
//MCBSP,ARM与AMBE2000交互设备
7 w5 X9 R" u# x3 T8 c# L$ {. W int fd; W. B$ L9 M0 d# D) M
unsigned short data_write = 0x5555;
' q' e) v) `" ` |5 { unsigned short data_read = 0x00;- ^3 C3 T9 x a. j5 g: f6 \
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);) i* C+ d' n, | k
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- E* r. `' C k# L: C) b
$ P& q3 O& B. @# Z( h if(fd < 0)6 J3 u1 c2 p! J0 b' s8 w
{- s5 \& @& |0 R R: \( m' W; {, K
perror("open failed\n");; F+ C0 M# X1 _- T: P4 k
return -1;
& c/ X j. L* X r } j) X; I0 `/ f+ F
1 z. V1 B# [+ J, P
while(1); Y) |' E0 [5 R9 v h
{' ?( Y( @& Y* D! h; H; v+ \5 ^
- G5 `5 U1 B! Q; u m& w. r8 }
//AMBE2000每次读写是24个字为一帧! ?1 f B$ n* Y: x9 O! l- k$ X
//写数据时将数据在底层存储起来,等到中断的时候再发送
B9 j1 [9 O D) } //AMBE2000输入数据是以0x13EC开头的3 l! L- p. ~6 ]7 L: \) U- V: f
write(fd,&data_write,sizeof(unsigned short));
2 ]7 W! [7 L* J* u5 e0 p
; y2 P" }8 s1 m- ?# |4 _ //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ) A+ V5 Q( `1 y7 |5 B, F, o
read(fd,&data_read,sizeof(unsigned short));
; r7 w. S- b9 T! Q4 h+ ?
+ f/ C2 j; ]& g, p! m8 G8 D9 T if(data_read == 0x13Ec)' W! O3 R6 y1 W5 v& y% [
{
$ N0 i+ ^! M; A3 K+ D6 p" B / K! Z! W. S2 T7 V" n
printf("data_read = %x\n",data_read);
, Y; n- Q/ L( c6 d+ x }
8 `, v* p2 M. M. W5 |8 M" v; {8 ~9 e/ M " j) B) o$ X( j$ n! e0 `/ g
msleep(10);( [6 Z/ x% W7 J* B: f2 M! t; [
% g1 l+ I: e( O: {# \( `
/*
+ E7 i9 s- ]9 R3 p& V ioctl(fd,1); 4 Q1 |5 U4 F, l+ W
sleep(1);
: B2 F' j$ `2 \ a# k+ | ioctl(fd,0);0 M% E1 d* m' x% l8 E( b
sleep(1);+ `5 R& J* K* j
*/ ! _* f4 Q. [, _& F% B! C
}
$ Y6 d# \, C) Z# L, ` return 0;; T z- Z, g2 M8 x
: q) q+ O6 y" |7 a: Z2 Q% {3 v
}
6 a. v$ V5 Y$ D
* R% d+ j( h& w5 x6 {" ^多谢各位指教,谢谢! 急: Y- @# W6 R' ~& Z4 ?) ~& @( ~ t2 [
) Y% h2 t2 \ E9 e4 [& o! \1 a( V7 H( u" `* g: P% d0 D4 g; ]
+ J; E" d' v. l* x7 D) c$ f* U p- r4 C f
5 b: ?( N. ?5 Q( {% m. p |
|