|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: " `( J. H8 R' ]; [% \
/*2 K, p! x( Q& M- F- U; b8 l' _
* Copyright (C) 2009 Texas Instruments Inc2 a# c* u$ O1 f* M. X; L) e
*
. o' V& b( m3 y, p6 q+ T( B * This program is free software; you can redistribute it and/or modify
. K2 M4 s/ o. }1 a F6 I * it under the terms of the GNU General Public License as published by6 G7 Y3 I6 f+ N- Z5 ^' [
* the Free Software Foundation; either version 2 of the License, or1 [) l' K* t( U
* (at your option)any later version.
7 X6 Y b- e7 u. s" U& O: E+ | *
: S) F& b- a, t! K3 l4 s' N * This program is distributed in the hope that it will be useful,6 n9 j3 H! ` X F7 d6 ]+ s
* but WITHOUT ANY WARRANTY; without even the implied warranty of N% l2 j/ c8 [4 C% c ^
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5 I, Q0 t1 q8 j% \/ p! u# N8 q; r$ e * GNU General Public License for more details.
' _7 A8 z, V5 ] *
; {% n P* s/ Z- U7 A4 C& F * You should have received a copy of the GNU General Public License
- p% ~# A1 Y8 v! W6 w4 n* ^( n * along with this program; if not, write to the Free Software
# T( S7 y$ s! t+ N" j. g3 F. H H# L$ J * Foundati' N( S& m1 p2 E3 ?8 t7 }
*/
2 M) C8 w) d+ z$ {5 A: p6 R; I: P. Q9 A#include <linux/module.h>6 |+ K% C: J7 Q& H* H y
#include <linux/init.h>; W2 R( g6 c$ w4 t, @3 m) m+ r
#include <linux/errno.h>
! |4 w- J; P( X! l#include <linux/types.h>
0 Y p, o3 s$ u# i5 X- J5 M3 T$ t. d#include <linux/interrupt.h>
) O4 ^# P' v! U) {% ~#include <linux/io.h>, m9 x6 g/ n- L2 p
#include <linux/sysctl.h>! u$ y3 P/ y3 ]
#include <linux/mm.h>
& h: i1 z6 f- [5 W- `, C#include <linux/delay.h>
5 i/ o/ Q1 z- J! }% q( [7 u#include<linux/kernel.h>
& ^# W+ Q4 I; J( j) G# U#include<linux/fs.h>% s' Q3 }3 p2 }, j, |& G3 b9 }
#include<linux/ioctl.h>- y1 j. ]$ x" U" j
#include<linux/cdev.h>
! s4 ?/ k% R) }. f1 h: N8 \4 ^#include<linux/kdev_t.h>3 q1 k& Q5 Z& W2 G. |6 j: ?
#include<linux/gpio.h>! g: X2 s- D8 W; H: w9 j# a
#include <mach/hardware.h>
: v6 A7 V9 R& Y2 V5 n3 M1 @! H#include <mach/irqs.h> Z2 r' I- U0 S# q. a) \+ Y# c
0 Q( Z) G4 o) G4 h: b. Q) N
#include <asm/mach-types.h>
/ l8 S+ J& ~, N( ?& |#include <asm/mach/arch.h>
5 b# p* g7 R. d" R/ s3 x4 P7 U3 ?#include <mach/da8xx.h>
/ v! Y3 |8 D+ I z( w8 o& ~" H#define SYSCFG_BASE 0x01c14000" [6 @5 j# T. M2 j4 n
#define PINMUX1_OFFSET 0x124
) I0 g7 o1 k; E#define PINMUX18_OFFSET 0x168 ' M- B! ]7 j9 u; C4 y
#define PINMUX19_OFFSET 0x16c! [3 H9 U) ]& `; k: q
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
/ k- C4 s8 C& K% q& p#define RCR_ADDR 0x01D1100C //MCBSP1_RCR( o! Y( c! n; H1 n6 T! Y% y# Z
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
$ n% b- s/ s* p2 N5 J#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
) t* o8 b/ L! W5 E#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
5 }1 u. S* j- c1 O; v% Q: h " y# M" Y# T/ W4 N0 K, `1 _
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR7 E4 g+ O+ K. X3 m( Y7 I
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR- t1 E. w0 x6 f4 e+ ?
//PSC$ ]) @" q( r6 L) f3 P; A
#define PTCMD_ADDR 0x01E27120 ! |% g* }& U% H$ g. U: n
#define MDCTL15_ADDR 0x01E27A3C
( \+ r7 G8 D3 E#define PDCTL1_ADDR 0x01E27304& \( `) T& L! u V# _
//GPIO8 direction2 [8 k, l' J- c/ H
#define GPIO8_DIRECT 0x01E260B0; H2 ~; U0 ~* {7 j
#define GPIO8_OUT 0x01E260B4. J' }. ] k* F2 r8 v" Z8 w: J! K
#define GPIO8_IN 0x01E260C0
- N3 h/ C& b6 Y) d2 U
% {" a. V# e. R4 F$ `1 p//#define MCBSP1_RINT 99
8 | W% b! z/ Y9 c9 r7 |( ], k//#define MCBSP1_XINT 100 ; @, }' G3 O' S2 }" ^
static int MCBSP_MAJOR=239;* Q W7 `3 @; f5 n, L! F
static int MCBSP_MINOR=0;
7 v- \" |* V5 X1 {static int count =1;5 w ?/ J* U' Q. f* I
) e4 B1 F( E# W$ L) l) h#define MCBSP_NAME "MCBSP-device"% h% [% B! ?3 b6 {% R+ _# |
- ?1 m3 w1 w v$ v
static struct cdev *mcbsp_cdev;; g4 o- B0 x2 @5 z3 [+ P1 L1 c
static struct class *mcbsp_class;
9 z/ t5 T% ? K2 E2 c/ C! Ostatic dev_t mcbsp_dev;
7 ~/ u2 ]4 [ e- B3 D8 a3 p, c A1 Yunsigned int DRR_data;0 s( `7 P, x1 q- `/ c3 ?8 _; ~
unsigned int DXR_data;
, H( F9 R* }! Q9 O8 f4 xstatic int mcbsp_open(struct inode *inode,struct file *file)
$ k8 y; ]4 V/ @' b/ k+ s2 J$ k5 E8 S{
R0 s' f+ J' f3 \$ x+ \ - {+ P3 ]4 r0 k+ W# ]
//interrupt enable,initialized4 l$ W/ h& V' E7 i5 _" W
unsigned int temp;* M( @8 m4 D: E* P3 n# i0 j8 x
//SLEEP_EN(GPIO8[10])---0
8 p; h+ S5 L" v8 ]8 M7 I" k' X4 ~* [ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 h+ Z1 p2 I# o8 g temp=temp&(~0x00000400);
$ Q( c+ D' x5 Z: [+ y n( i __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
! _; L. W) B0 }2 D$ l //RESETn(GPIO8[8])----0----1
% e1 S9 q p- P temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ ]" C7 k, e! X6 M4 U! } temp=temp&(~0x00000100);
r" J4 b! C4 W) s5 Z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---01 [/ f5 e6 D: Y* u
udelay(100);
4 ?9 [& C/ {& X9 ^! ]$ r$ t, o temp=temp| 0x00000100;) c/ i' J; U* H
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, e& G; c) [* q" a; W$ f+ F+ J( p udelay(100);+ p# F( h+ l$ a+ L
printk("open success!\n");
3 F1 @" K5 h9 G' h5 D u$ V return 0;5 U) b7 h7 ^6 Z4 }
}4 t4 ~9 M# E( w2 p& V; W
/ o$ g' j3 V6 \6 y) B2 T6 V' |static int mcbsp_release(struct inode *inode,struct file *file)
( S" c' N) \* f* P/ X) o/ _( U{
2 H R* \3 _9 a" m& E' U printk("release success!\n");
; e% w+ o. H9 h! D% L return 0;
) V& F+ Q4 B' M! [- A( K m% x$ e}' l6 d4 n- g! n: G, b' w
) t* `. A$ h6 ^& v; v7 D. fstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
) c8 w& G3 l5 l% s& t0 D, W{
( ?. J) M& ]- y6 p copy_from_user(&DXR_data,buf,len);
5 ]1 n5 T+ Y5 i7 E" U iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
& S5 o7 c& E D8 _ return 0;
9 U+ l( e7 M6 M$ r A# W2 ?# N , Y% z, l/ C4 t' R
}
4 H/ h/ _5 z+ f9 ^+ d0 c/ u9 l9 G s! ~% U& H
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 H. l# B/ ]# V% z9 L; K
{
3 k; Q+ u) n( j6 p, | DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- o9 p9 |* s1 K$ s
copy_to_user(buf,&DRR_data,len); 3 @& A& u3 w, Q. D# ^- L
return 0;
! a) ^8 P6 \2 S& z}9 @ P% c; w4 u S. J& L& {1 j) ]
/ w+ P" R5 L1 [: S0 w
4 g7 u0 P5 i( T) N8 ~4 ]
static struct file_operations mcbsp_fops=. g$ O8 [( b5 z! B* \, w/ ~3 X
{
0 P5 v2 T5 w2 L m: d: B .owner=THIS_MODULE,
4 c5 }! g" \4 W# M3 g6 y2 p .open=mcbsp_open,
$ x2 ^/ w4 @8 n( X .release=mcbsp_release,/ e- F7 H1 N- B# s3 ]' B6 w7 d
.write=mcbsp_write,. p( z) ?) d: A. Z( i
.read=mcbsp_read,9 W2 {, L7 ?: a
};2 ^ N, M& }: G( s5 h$ e9 H S
static int __init MCBSP_init(void)+ h" T% J7 A/ D
{
! x# N( d0 f' E1 V5 V$ d int ret;
: J c" D" k8 c unsigned int PINMUX1_REG_old;3 S1 l! `' \) q" x0 C
unsigned int PINMUX18_REG_old;- [/ t5 T0 m0 N/ i5 j
unsigned int PINMUX19_REG_old;
! w8 k- I: u( u; Y v' b unsigned int temp; ' G' }9 b3 q, z! b0 F4 K* W% ?
if(MCBSP_MAJOR)
+ O/ W. C$ b5 I9 s* }8 d+ _ {7 r$ y1 K3 ~3 j8 e3 I% q
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* T7 k2 P4 o7 H$ Y( q0 [ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
* y2 O* ]4 U3 s3 g2 Y/ y1 p/ R }) _: A; M; ? f5 {- k. R
else
/ W' y2 H9 r& G {
; m& W! G& T8 p# e% ? ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
9 P: A! I$ O$ q" Z MCBSP_MAJOR=MAJOR(mcbsp_dev);7 `; F; K, {3 o+ v, `7 ~0 H; h
}
; C! u' S- c4 Y4 z* G+ m
- b2 [" \( Q- Q if(ret<0); }2 }1 h5 H9 O+ g0 Z
{
$ R: m$ K. X! {) L printk(KERN_ERR "register chrdev fail!");
* P: D Q, B6 K. ]' P- L return -1;
z K- g; n4 ]- K& f+ _ }
4 T- j: v, h1 q, W A# \
- S) H- x, c5 c n' h mcbsp_cdev=cdev_alloc();
8 v7 R/ f' g* \
& L7 o; C" v8 t% w if(mcbsp_cdev!=NULL)4 F) w4 Z d! P4 g5 ? ]4 V
{- L0 I5 G( u' ]$ z/ ]
cdev_init(mcbsp_cdev,&mcbsp_fops);
, j R8 W3 W: s mcbsp_cdev->ops=&mcbsp_fops;* P; ^! A/ |! ?5 e3 b
mcbsp_cdev->owner=THIS_MODULE;
; ^4 o, n. H. @ 4 D4 W- ^# O# R% f4 f+ u
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))& G7 g* Z1 Q* V; D
printk(KERN_ERR "register cdev fail!");
" M* q( A& W0 F# K else
- z% c! d) n4 } o printk(KERN_ERR "register success!\n");
; u) o4 p0 K% I: {9 S5 z& G }# C! B [6 t. |- H/ y- n6 J0 _4 X, N
else9 i o& k8 t2 N9 K
{4 z0 t) ?. V8 F
printk(KERN_ERR "register cdev err!");
+ o2 U% a1 Z- K$ w return -1;
& u- l% U5 @ B( d9 D3 m }
, v. a, s. t5 V# u/ q/ L. r9 @( G
/ ~; G: ?9 ^8 _$ I% i' g0 \2 q. ^ mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);' T: v. s4 B3 K# X: K( Z
if(IS_ERR(mcbsp_class))
+ u/ E2 M1 J D$ K0 V: _. x {; {( S- s( Z' ^* x
printk(KERN_ERR "register class err!");. H9 n+ e% @1 k
return -1;1 r7 I6 Y) V, p) V
}: n5 U4 ]8 m" q) B* M
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 a' V+ e, Y2 R
3 S) L2 v( T3 d& i: }( x. z. z //PSC( K6 v* H2 u4 K) t8 M% W( h
//add Enable MCBSP
- z6 @4 S$ v4 W1 F8 G% V* M" g+ e //test
( W$ m! g$ M) s0 B# `+ F% [ temp = 0x80000003;* m2 j2 }& y g# f- Q0 Q5 V$ L
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
* D7 l: F/ B. v. c( A6 O temp = 0x00000003;0 e3 J+ ]6 z+ k
writel(temp, IO_ADDRESS(PTCMD_ADDR));
, y* m' h0 f+ O" R2 Q& Z
& Q* A# p6 s' u; |& Y: E temp = 0x001FF201;
& p( g \, j) B" ?& e: U writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ o1 u, i- m# o l
) L; m/ C0 k5 D& [ //PINMUX ' w! h. O+ X W
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
) [/ |9 ~; \2 b3 h2 s; F8 N/ V; N5 o PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ) \8 p s1 ^6 h/ B1 [5 T6 L
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
; p Y0 b9 W: y# ], ~( o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 E) @/ M( }% \8 M& u# X
. J$ Z; W3 R$ y
//SLEEP_EN,EPR,L138_SHK1,L138_RC
7 o) `/ Z9 L# h8 ]( ~3 b3 H! ], s PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 4 f. _& I: i: a4 Z
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
5 a' f) F1 o* z, t d+ V! d writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- g& ?% F$ y& i# g4 @
# p6 L7 D0 k8 R$ t9 z/ e: N //RESETn,L138_SHK2
* b9 u2 W% m/ e' J! K: j PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( f7 `: t/ \6 j4 O- Q- o5 R PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
" F; O1 u3 p- a, F writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);; L$ x5 g6 b# t1 y/ `' e/ A+ N
* C2 I& X0 n- ~; G5 I+ t # }6 Y2 S1 G% w8 ~/ s- E) U
//SPCR Register
6 V, N5 M- [# O* a //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
7 [0 b ^6 i( t3 A$ K temp = 0x03000000;//(DLB=0)
4 ]8 S2 S& ~$ e // temp = 0x03008000;//(DLB=1)) }; S( X7 {, b! W& I
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset6 G4 z) p$ a# ~& B1 E ]
temp = readl(IO_ADDRESS(SPCR_ADDR));0 ~; _/ J$ u& \5 {( l9 C
printk("temp=%x\n",temp);+ W) I, ?1 n0 x. G1 d: ^
2 N5 ]; E: l. q3 Q( v/ F1 G: `$ x
//PCR Register
; S& |0 n9 ?+ {9 x7 { //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
; t) x! n2 ~6 c' r- H // temp = 0x00000F0F;/ Y7 O+ x. k9 R; N R- U6 r
temp = 0x00000B0F;
; X3 C! h8 B# G9 J# y, x. T( J writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
* T% I& G; h) G( ~$ y5 U temp = readl(IO_ADDRESS(PCR_ADDR));( y3 l: b/ z& x, r W; n
printk("temp=%x\n",temp); # x6 r: T. F/ m1 H7 v$ P# j
//SRGR Register& Y7 a3 }: z" o$ r1 [* r$ v
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 R+ L( F" K* }
//temp = 0x301F000B;+ ?/ H% a6 E8 v+ v+ C0 Q
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
4 T- o+ j9 I4 c1 U& N) c" q temp = readl(IO_ADDRESS(SRGR_ADDR));9 b; t4 B- r! C6 `2 {# z
printk("temp=%x\n",temp);/ D- j( H' z5 m9 b. G" t: D
//RCR/ G8 H. n3 @4 L
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 J/ A* a8 }" O8 l$ g$ g
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0& y, B8 e7 J4 T& K2 ^7 J! b
temp = 0x00440040;9 e) a7 X( T* A1 d
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
# R4 y0 k; Y, O- t$ a temp = readl(IO_ADDRESS(RCR_ADDR));$ b1 f6 {* f, i* L: e1 Y
printk("temp=%x\n",temp);
) U/ I# r+ y/ v4 g' k; y! E9 ? //XCR: L+ |& G( c4 m! y
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1" G$ y( k C3 K2 `8 T4 h6 J
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
9 h% i i# ~; g- B& x0 x temp = 0x00440040;* A0 A* d$ Z& Q6 u1 g
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 8 y+ I9 P2 J/ B0 F% D; O1 `
temp = readl(IO_ADDRESS(XCR_ADDR));, Q3 B/ b, A2 z5 ?7 I) i1 @' f
printk("temp=%x\n",temp);) N0 N- h9 q/ S
udelay(100);
/ Y% ?: \6 e" d8 s5 v0 \8 @0 s //SPCR Register7 l( e8 T5 O' V1 g" u) b: ~
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1$ m4 ^) J8 [ T8 l: E; P
temp = 0x03C10001; //DLB = 0 VS DLB = 1* d9 w, n0 v. c6 r& Q, d% @. x: `
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
( u/ r c! y' J+ b+ I. i- G. K2 h1 M temp = readl(IO_ADDRESS(SPCR_ADDR));
3 M0 R2 _$ k+ d# Q% D0 [) S, v3 @' Z# E5 K printk("temp=%x\n",temp);
6 L* {' v+ I7 Q# z% F) ~ udelay(100);
9 l+ l- o1 u' T8 a
2 L- K: Q$ O4 I$ D+ D9 ]) i& E, C- q. e1 O //set GPIO direction A2 I& i/ J3 ?' Z! b
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; x! O9 Q& f) h' T
temp = temp | 0x00000100;//EPR----input
1 A- L1 |9 _( s$ O temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output& S4 b) U1 S [
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
2 L3 j n1 Z- n, Y- @
( V( m+ L; L/ A return 0;
. X0 b8 s; ^+ ^' Y8 A9 K/ o}. j5 `! y2 J+ b' k7 @; N; m
static void __exit MCBSP_exit(void)6 s! X: T- e6 x
{- J* a* l$ ] v% N( T, C
printk("mcbsp chrdev exit!\n");. ]; [1 F8 T1 q. j) ]- ?
cdev_del(mcbsp_cdev);
/ }6 W; o b/ { unregister_chrdev_region(mcbsp_dev,count);* c4 l) j" t7 f' o: p
device_destroy(mcbsp_class,mcbsp_dev);
; S: x$ p3 c% Z7 W* i+ ]0 s* C class_destroy(mcbsp_class);
; k) {; ~) B" H' p/ R}
& Z f, H5 H8 }& Y4 Q7 ?: V3 Emodule_init(MCBSP_init);
4 p" @9 r+ ]$ C8 ?" nmodule_exit(MCBSP_exit);
4 t' X b( d2 _2 v- C: }# {6 X6 Y8 m: }( M7 \# ~% Q
MODULE_LICENSE("GPL");3 P- w1 g" f4 S: L" ^& F
& \5 s4 a; B) U% y我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& O7 N' k; a6 y0 k) d9 y
我的应用层的测试程序如下$ ?/ L X; \) W2 N: U" K/ L3 v
#include <stdio.h>6 ?; {* @/ n% O& Q% i s0 a0 f8 c# C( ~7 W/ b
#include <string.h>& L' o2 W/ ^3 z. T' y, f. |% U
#include <fcntl.h>
o) T! B5 D3 U8 s$ q# }. X#include <unistd.h>7 I4 F. c! {/ ^4 Y
#include <signal.h>: I3 Q2 q f$ V! ^( [& H, x
#include <pthread.h> //线程
' H) Q% s- B A" y0 ]#include <stdlib.h>4 D$ T$ v- D5 t, U& D
#include <pcap.h> //捕获网口数据
8 T+ `& A. k& G6 R$ H8 l7 J#include <semaphore.h> //信号
$ b$ H7 C" c% Z' y+ ]#include <sys/types.h> //消息对列" U# i( H* R2 S$ u! H
#include <sys/ipc.h> //消息队列. p2 N9 |) K q( Q& \
#include <sys/msg.h> //消息队列5 e- F% a5 R0 i7 A3 S. _
#include <sys/select.h>
5 H/ Y1 T$ | k- w+ ]& H#include <sys/syscall.h>3 A* ?* \4 ^) h! B
#include <sys/stat.h>
: Y6 J! ?. p+ e% E* \3 B* Z: }#include <sys/mman.h>
: {6 W6 v1 Q$ x/ n; w; f- k" ?1 c! S7 h#define msleep(x) usleep(1000*x)
3 d! U! ^% {: J' _" p* l1 y. y+ ^& ]; ?; E, N
int main()/ m# n5 M) |7 @% w! p
{ # a( p: E* x5 _: U$ Z& v {
//MCBSP,ARM与AMBE2000交互设备
: a/ i H3 { q( m8 O) ] int fd;6 m3 V5 O6 O+ r& x
unsigned short data_write = 0x5555;' O, }/ F. R! u. V
unsigned short data_read = 0x00;
% ]6 p; J. X8 g X1 m fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);6 G; i+ U5 c: c0 ~
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
; d7 A. [. x/ ^& ^* |4 ^
2 a0 i1 D' W; W3 w; w# c) \( t if(fd < 0)- H; r. y1 w3 o+ A5 a- \' o
{
, I8 f0 W+ q7 v/ O" N! q perror("open failed\n");
0 s: z$ g; O: H1 [* O' O- d return -1;
( l( V0 H/ Z4 l# y% e3 g }) R0 Z4 U! N; \& F! e G
& ?+ w- D% X$ R# k$ ?" k9 V while(1)1 S" }4 r8 o. i1 n0 ^
{
- _/ i# R) W% C5 a0 Q; |7 s& Y 0 M- r0 ~& _5 w- D6 q @5 n) p2 e
//AMBE2000每次读写是24个字为一帧: D7 p* o G4 ~' I( {! v% @
//写数据时将数据在底层存储起来,等到中断的时候再发送
( Y: Q R1 r) ~7 L& I/ x* u //AMBE2000输入数据是以0x13EC开头的: W6 a. |8 R' d
write(fd,&data_write,sizeof(unsigned short));
* a0 s) A- a$ P- M$ m' | # i ~' i$ _7 S; a; d
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
2 z! s2 f) b/ Q9 s$ f4 G3 p read(fd,&data_read,sizeof(unsigned short));* q6 W% M0 ~% M5 n6 K+ f
8 U+ o1 V7 O1 x+ d. J
if(data_read == 0x13Ec)* I; ?! H- K. f+ i+ p+ K# a
{
* a; p* \$ ~. A% B" U. u+ `
1 ?9 P. U0 m, e9 v) _0 t printf("data_read = %x\n",data_read);& `* W. `$ A9 J
}6 O5 |5 H* ^& t* V# l5 [
/ n8 |* [7 q ~2 ~
msleep(10);% e* Y a4 D# J- X* R
2 \$ B3 U7 \! t+ d5 p( K
/*7 M4 `+ f- E/ F1 Y( M
ioctl(fd,1); 8 N2 t8 ^+ E6 M" g: s( S
sleep(1);
: J* p6 g( w6 m- Q4 ^" ^ ioctl(fd,0);
. c& D( u* W8 {/ o+ h sleep(1);+ g8 n; l. ~3 m6 N% B$ P( G) N2 `
*/
! O$ f: D" [1 F4 d, l }
6 m1 c( v+ b2 e4 C! O: F2 @2 ? \ return 0;
~. B2 t" y) b, R: z/ W. k' f- k
! J, J q0 Z3 H: F}
& I- t; C. C8 v
* e8 t+ O- [9 [5 i# v% \多谢各位指教,谢谢! 急
c9 j% B8 h) u: A" z. ]) h0 D5 R! n) l$ `6 s S/ C7 G, J5 E/ G2 L/ |
! y/ n$ q0 m5 X/ ?5 [. m6 w8 H9 `
8 g# K0 S0 r5 i1 n$ e- P" P
) v9 b8 ?4 D4 U
/ J P l$ j6 N i |
|