|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
! o( u& y6 p- \: {: p9 e/*: \# d" y: ^$ X5 Z
* Copyright (C) 2009 Texas Instruments Inc
* U1 g6 k/ s b2 ^ *
" Y/ d! }0 a h3 d$ M * This program is free software; you can redistribute it and/or modify$ I+ O+ F* |- t( y4 }2 P
* it under the terms of the GNU General Public License as published by
3 M7 |: P* t0 ]7 w * the Free Software Foundation; either version 2 of the License, or O1 r2 C# `3 s# n4 P
* (at your option)any later version.
8 ]9 I- X k0 H) f% Q( T */ I! Q% I s t. E, R
* This program is distributed in the hope that it will be useful,. `9 r3 ~ E2 {0 N. X# T: i
* but WITHOUT ANY WARRANTY; without even the implied warranty of3 l9 P& D4 w9 X% |' X1 G& X; g* q
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ O& s: ?+ o. N. i
* GNU General Public License for more details.
& E" Z# H) ]: S1 L& b* Q" G. W* i/ M *
! x' S$ U+ e& E- q* S' G * You should have received a copy of the GNU General Public License
) |6 T' l u2 }: [& h2 I$ z * along with this program; if not, write to the Free Software. j8 ~9 [# W! j9 M9 p5 L9 W
* Foundati
) k- T, y0 F4 D9 Y8 Y, \9 n; c*/0 e7 Q% p$ w, N4 v6 N
#include <linux/module.h>) ^$ l3 F/ C9 R. K' i8 s
#include <linux/init.h>7 `5 _: S* c4 C
#include <linux/errno.h>% ?* E0 m! y% U$ g! q* w% X
#include <linux/types.h># o% W3 M* d* a& g5 m' G4 P# y
#include <linux/interrupt.h>4 j" [: Q" | b" r
#include <linux/io.h>) p" {' t0 t5 N/ b
#include <linux/sysctl.h>" b* ]. C f( s! f9 l3 ^
#include <linux/mm.h>; m& M# a$ Y/ r I; O8 U* O y
#include <linux/delay.h>
+ J- {& b; h: K. f#include<linux/kernel.h>4 D, q0 @) l0 X9 r# C5 f& R7 x
#include<linux/fs.h>
& ?9 r8 D0 r. V2 t#include<linux/ioctl.h>
1 N* W7 v; ~' q1 f6 W#include<linux/cdev.h>1 F$ C; X! U( N- Z& Y; }# v
#include<linux/kdev_t.h>2 {& W! u6 [+ L: \+ R
#include<linux/gpio.h>
/ m% S3 H9 W+ T) X0 o2 Q#include <mach/hardware.h>
9 w% m4 U# e) |( ^9 D#include <mach/irqs.h>
6 T. {# `7 K* \ a# T' @$ u5 s0 ]2 I: |: z2 ^
#include <asm/mach-types.h>+ A, n8 J" K) b% i1 s
#include <asm/mach/arch.h>8 Z! g! f" K$ u% B
#include <mach/da8xx.h>9 L$ v) `6 E* h# E& @5 J
#define SYSCFG_BASE 0x01c140005 k3 c5 s* F: W2 U+ N: o9 `9 t
#define PINMUX1_OFFSET 0x124
& }# `9 } R& r7 v0 b#define PINMUX18_OFFSET 0x168 1 n4 X" o0 V1 _' O
#define PINMUX19_OFFSET 0x16c
' W6 d! C( F3 }( p: z& x3 U7 g* x#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR9 `+ m+ i* p& O
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
3 _. z: b! I, x7 C& I! K2 n#define XCR_ADDR 0x01D11010 //MCBSP1_XCR# B" m# l0 c4 v5 R; ~; W9 C5 A! F
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
9 ?5 r4 s: `" i* [. L#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
6 o4 e e6 q3 ^# U
6 h* x+ p' u9 h! _( k, L/ Z) J#define DXR_ADDR 0x01D11004 //MCBSP1_DXR( o% C1 Q2 X; x( d9 D2 n
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR2 I9 q8 ]5 R; [* s; H% y
//PSC
, B4 Z; W) C4 N- X#define PTCMD_ADDR 0x01E27120 9 R7 ?+ ~) F- \# U9 {3 }
#define MDCTL15_ADDR 0x01E27A3C
9 r8 ]0 n% J9 Z, t& U/ J) [! ~#define PDCTL1_ADDR 0x01E27304
4 T. o" z1 Z" m. Z//GPIO8 direction2 ?( P n) `( {0 _# ?; s
#define GPIO8_DIRECT 0x01E260B0
G% {; N; d7 x& c) E1 ?( O#define GPIO8_OUT 0x01E260B4
3 ]8 ?% l3 t' R9 e5 Z#define GPIO8_IN 0x01E260C0
( c y0 w$ k2 d7 o
1 M3 k* ^2 P; c! Y- e//#define MCBSP1_RINT 99 ' J8 d+ o/ X1 M8 t0 P
//#define MCBSP1_XINT 100 * T5 _& _" W2 y2 y
static int MCBSP_MAJOR=239;
! X( b8 d- ^, ]: L4 C1 J# gstatic int MCBSP_MINOR=0;
# D& Q G% f( p- H' |static int count =1;8 d' b) F/ G* l+ ]- Y
1 K# i6 ~6 h- k! ^' H
#define MCBSP_NAME "MCBSP-device"4 J) |% [ p2 `& v6 a% g
5 V2 G+ S- m, U$ n- Q. W
static struct cdev *mcbsp_cdev;$ f: j1 n. z# p; V% y! p
static struct class *mcbsp_class;" c; Y& R' Q( L8 ~- a3 d% J' i
static dev_t mcbsp_dev;
, l0 ~. U+ | Z' I4 U) tunsigned int DRR_data;
; S5 x$ j+ z0 p) n# P9 ]unsigned int DXR_data;
7 O5 k: K) y4 ^" _% \/ R( r' bstatic int mcbsp_open(struct inode *inode,struct file *file)" \# N0 j: v Y4 _0 F
{* K3 D8 n' m$ M. ]0 C- r2 A
5 ~3 k9 G! N( y+ u; l& } //interrupt enable,initialized3 ]0 R* Q J+ v P2 [; p! J
unsigned int temp;
+ s1 I& E8 ?/ c9 A) b( b& J# C //SLEEP_EN(GPIO8[10])---0
3 c( i- n1 c/ Y( j( Q2 Q* S temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
5 L& A, Y& l; V8 x temp=temp&(~0x00000400);6 ]' Q# J& G' |$ @8 t
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ P6 K' v8 V! T! l //RESETn(GPIO8[8])----0----1
4 w# A% ^9 G- ?! d" u5 @ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ a8 x: v* z. r- Z7 u3 G1 c& K temp=temp&(~0x00000100);
/ F" F: k$ p/ |" C: M/ G; I! y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. V6 r0 j8 d7 i! C0 k* q udelay(100);
$ ]* I* o4 m. s4 W temp=temp| 0x00000100;8 L2 `/ q: L: S" i: y
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& G7 r6 T1 B2 Z3 y+ ]7 U/ y6 v* V) ]% G udelay(100);5 F6 G+ Y& X9 }2 l; w
printk("open success!\n");
* D+ h& X4 A- t S& {5 x) R return 0;
8 X- |) k/ X T+ u! W- f- G& u) v2 `}5 C ^& x" i+ X) L
0 q/ G I0 K' W( G0 G% Y, zstatic int mcbsp_release(struct inode *inode,struct file *file)* }2 K% q% z" n3 k7 J+ P
{
3 s2 t7 S U7 _" i% ] printk("release success!\n");
) G* ~0 m2 ?& l; R return 0; r- i3 s+ k1 o' G% a$ U
}" V, o2 Q8 Z) V. x
) m2 k$ w% _" f# k* r* [/ W2 _
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)6 ~* L$ ~9 t1 i- s4 R8 B
{
! b) H- I# |' i: x copy_from_user(&DXR_data,buf,len);
8 C$ R( G: f) n- g2 @' @3 E4 {% M4 |% d iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); % x8 A# Y8 w% X J9 V+ Z
return 0;/ I; ~/ Q. }, D; L; O/ y
, n4 W* J5 E8 g}1 L/ ?+ R2 T, {9 _: ^
) V7 `. G" r' R# @2 [6 z G
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 l5 g; j& |- }* S' T
{
1 t# h0 [0 _8 y/ V" } DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));6 O3 J% j% d. j) J8 G0 J- i0 [
copy_to_user(buf,&DRR_data,len); ) Y3 C2 {* x% ]6 Z: X1 o
return 0;
# M) C0 X( T( Q, e0 l9 i! S. Y5 \}+ S y+ H3 K: ]. w
1 Y, M7 D$ u8 N9 D. e; s* l0 d
- T* X3 G. @0 o/ i8 istatic struct file_operations mcbsp_fops=
. i+ l9 `+ |3 K* K0 c* r0 h{
& ~- b! V( y8 m3 J5 R- u6 Y- H .owner=THIS_MODULE,
/ C1 n; I( @3 g, V. e" f% D! ` .open=mcbsp_open,: v5 N3 s" o2 \* C9 o5 S
.release=mcbsp_release,% a& z" o9 P, D
.write=mcbsp_write,
3 y$ C6 O6 R" _1 ?9 E .read=mcbsp_read,
3 d& ]" M2 z1 V+ j2 O5 ~};
0 {7 @, ^ [% {! S- ]7 n8 xstatic int __init MCBSP_init(void)
+ @. o7 _( l/ k3 w{
2 ?1 k; a- J- W9 ^) i int ret;
3 i! T O2 F( X5 l( w" U) | unsigned int PINMUX1_REG_old;2 g. g4 `; U, O- e6 l. F
unsigned int PINMUX18_REG_old;
0 d+ I- B4 [9 V% |9 B( q unsigned int PINMUX19_REG_old;
: C8 F- ~. {9 B* C* B) p unsigned int temp;
) {& I# q8 f$ p B# k! Q( W if(MCBSP_MAJOR) t* K! _! [, X7 N9 O* k# P( j
{( b1 R5 Q: Y5 {& b5 O4 y' t
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 n4 Q9 g- T6 Q7 t
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- r: r1 h' l0 A! t& J) H
}! Q# K' D2 h+ I$ ?3 d+ \( [, \
else: Q1 d( B: s/ N3 }; F. O
{
) Q% C5 Z k9 H. ^( `2 n/ i ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- X" M$ |# l/ ]
MCBSP_MAJOR=MAJOR(mcbsp_dev);
/ T) {3 Q; Y8 I" h0 s2 f; C& Z }
/ I! ~. G% g+ `5 s' c
6 u( n; K3 Y7 J1 \7 s, c1 f C5 y! W1 l if(ret<0) J/ O# a3 N7 Z4 W& N& c8 V" _+ H
{( X$ h+ k9 L+ ^$ e5 ?
printk(KERN_ERR "register chrdev fail!");
# h- ]: [" q1 u E8 E6 F return -1;
3 ], o+ ]' k, P* w& d: V }
$ L% X4 |) m: `% h6 i3 b& Z Q- ?3 l" e0 _+ l
mcbsp_cdev=cdev_alloc();
- y$ I$ P. J% s# @6 ~1 z % J4 a5 d! }* u
if(mcbsp_cdev!=NULL)4 ^# p2 _) |) d8 f" ^5 r8 y
{ X Q* j3 M: x/ M
cdev_init(mcbsp_cdev,&mcbsp_fops);
. V E3 l! ]9 J9 s5 P) D1 @ mcbsp_cdev->ops=&mcbsp_fops; ?/ v F8 k8 y
mcbsp_cdev->owner=THIS_MODULE;" m$ [1 ]( `& h0 `7 t$ q1 e g
: n) w& D* [4 n# ]8 h
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))5 c! D! ]9 J6 ]. _
printk(KERN_ERR "register cdev fail!");
I4 s& R9 J1 E! i g3 ` else
8 Y3 B4 O3 U: H" B4 m0 G7 l( q5 O printk(KERN_ERR "register success!\n");5 @0 @1 A4 u! }
}3 y/ e! D: H0 J6 `
else. Y4 V1 G! ?8 R+ N2 w' K% k" S& S
{
2 }" L2 o9 t& I- a$ }) ^6 k printk(KERN_ERR "register cdev err!");
# A y. M5 @ ^. }+ s: E return -1;
- s# c* r' Q! ~$ A! r }
( Z; \2 U+ @$ r0 t" s5 M / `4 _! I# [( a
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
4 [2 m3 ]0 c3 ^8 w' o if(IS_ERR(mcbsp_class)). R( v+ d1 P5 k1 V2 i9 b
{
+ E# c6 h- `2 r# U/ _: j9 T! ^- M4 Q( l printk(KERN_ERR "register class err!");
3 `* C+ K2 ?' K9 w: \& x) G1 R. p return -1;5 _9 F6 b Q P& u
}5 Z* V$ k# y- y! j, m& z; w3 @- K
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ d) ~3 e/ u8 L g, d: n2 t5 h. M- e
//PSC0 L( v( ^% y! u1 |
//add Enable MCBSP& C! O7 x) v/ c( j, V5 F& w
//test
, x8 K7 g. y9 M) C4 M temp = 0x80000003;8 t% m" l5 y# O" T: p. U% p# Q' Z
writel(temp, IO_ADDRESS(MDCTL15_ADDR)); r" m5 d% N* j- I! a! L
temp = 0x00000003;
" x, F' U% G+ l4 E. M* o writel(temp, IO_ADDRESS(PTCMD_ADDR));
5 @; F+ e& N8 Z: E$ y {+ l8 N& e : C# U, h# W6 E( q
temp = 0x001FF201;! t' I+ n; E, \1 B, j! W/ A
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
c8 G; E8 y9 p% O$ h. N! S& c6 Z ' e4 C& M# l9 A* g# S
//PINMUX
# U/ |$ L0 E } i //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
2 d( D) v- a0 P PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 1 M. a7 E+ H- o7 m
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
8 G8 L$ W$ x) W1 r writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);4 L. p* p) {! b k6 r. z. X
6 x, \, n9 i( R# k3 }* G2 p" c
//SLEEP_EN,EPR,L138_SHK1,L138_RC6 {3 `" E) W+ V, N6 ^# S
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ! }! {- Y4 B8 W4 H" p
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
7 h3 E9 x" }5 u" z. _ writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. c. J1 _' Q7 D2 \* Z- x# `0 E 9 j5 l4 c; z$ F0 u' X) l" s4 L
//RESETn,L138_SHK2; f/ q2 L# x6 A
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); # N) L- J9 R1 I8 Z
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
* X4 y5 }8 o8 b* J* Z' ` writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
$ y2 z& F% r. i6 b* O 6 g8 z$ ^$ Q7 C4 X7 T9 H* i2 S) y
9 [6 ?; K& D& p& k9 L6 V
//SPCR Register
+ X0 s; J0 g r: T //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 `$ [; j3 L9 ^) b r temp = 0x03000000;//(DLB=0)) f) b9 @0 e8 y4 X* ^$ h
// temp = 0x03008000;//(DLB=1)
@3 ^! \3 O7 a2 |3 E @ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
! `+ h2 e/ r/ [6 p; U- w temp = readl(IO_ADDRESS(SPCR_ADDR));
+ S" H9 |4 d4 _ printk("temp=%x\n",temp);# W2 t' e1 e5 X3 G. F
0 ?, q& ]3 ]9 R- o- Y5 ?( _, ] //PCR Register
8 I5 c& A7 k! U. X, u: R ? //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
- @2 R9 K9 n# V2 v9 ? // temp = 0x00000F0F;
1 L5 M- O! T0 P8 A, d3 s4 X) ~ temp = 0x00000B0F;
: e4 P' @' {6 G" I2 n' g7 p writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 8 D% h) d# ^# T; b, C
temp = readl(IO_ADDRESS(PCR_ADDR));
' l$ y: N# k; d2 }/ G: W( @ printk("temp=%x\n",temp); 2 f2 u4 {1 R- j) S9 r& c+ ?, c
//SRGR Register
% i$ K6 C+ i) Y" U5 E Q/ W' b+ I. `6 G //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 Z* R; ]' s |
//temp = 0x301F000B;
; p4 X, O( x5 Z( ^1 z. W* t2 c# y writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ) w5 Z) P8 V* D3 H$ O
temp = readl(IO_ADDRESS(SRGR_ADDR));
% h( n5 i/ D/ G, k4 r" G printk("temp=%x\n",temp);$ ~, X$ n+ J8 _6 l1 c
//RCR
" f- h4 T9 j; E //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 Z0 w/ ~/ y: `* S% t //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
8 H. N6 g: i) v+ j. d4 s5 T temp = 0x00440040;
/ B/ L% X' X1 J8 V writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized # v8 w/ d# V' p: Y
temp = readl(IO_ADDRESS(RCR_ADDR));3 l3 P2 q8 d: `; H
printk("temp=%x\n",temp);
$ R% K7 k& O: l) f0 g9 i ?2 |4 r% Y //XCR R7 `; X/ d* s: f. x" [
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 G+ E5 x4 O- I5 `% A
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0- f n, y" s* c4 U5 V
temp = 0x00440040;
/ N# i4 c" T# q2 T/ v9 X% C( U N; \ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
+ D: {7 @/ H, M8 h( C9 g: ?" o+ k: Q temp = readl(IO_ADDRESS(XCR_ADDR));
2 u) x! p) O& ~) b9 x+ K printk("temp=%x\n",temp); b9 _" M& W6 H, S/ I* u6 C
udelay(100);& O& g# ]2 l4 t9 n; Z
//SPCR Register
4 g+ {( V3 R; ~; ^5 Y# j' I8 i0 m; L //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, |6 G1 s: K7 q" \/ J
temp = 0x03C10001; //DLB = 0 VS DLB = 13 H/ c- a# \1 s: l8 F5 N+ A3 t
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled9 j9 g$ y: h* }: ~, g
temp = readl(IO_ADDRESS(SPCR_ADDR));
& w2 \0 X" E5 c: F) F+ v! e) L printk("temp=%x\n",temp);3 P* S3 }/ Y$ x2 R& R
udelay(100);/ C' _- R) N- k0 l4 K, m; N% G8 O
: N% u+ b% b9 J8 E4 h' K //set GPIO direction
/ Z& K3 b' c) f: d2 ? temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! @! K' t. ~% Z+ e" P: P) F2 n temp = temp | 0x00000100;//EPR----input( t9 ?. o; I$ E A/ f# |
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 D2 S+ I* |2 s& ^, h" J
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 q; x- j* v8 Z" |& j" `* ]; l 2 f: R9 U( ]: R, N$ i
return 0;8 ~9 C' q- r% o. I2 H$ y! I
}, q, X* l2 a( ?7 k2 N8 u& A+ j) D
static void __exit MCBSP_exit(void)- c5 s0 H; l1 m+ b0 B& J
{
3 n1 }( X, Q4 s printk("mcbsp chrdev exit!\n");
" Z# ~8 m$ J3 W# y/ J3 T& V cdev_del(mcbsp_cdev);9 K3 Z6 G' f" y8 ?1 [3 }
unregister_chrdev_region(mcbsp_dev,count);
/ }% i1 Q# z6 L D device_destroy(mcbsp_class,mcbsp_dev);
! h. h. m8 J6 C" g1 `) @" f class_destroy(mcbsp_class);
8 z) {! \& F! n+ M7 x( @}
5 C8 c0 z- a* k0 B8 m4 D; gmodule_init(MCBSP_init);: J8 N- `: ^7 o# C9 k0 |
module_exit(MCBSP_exit);, J0 {; Z+ e$ z2 _
8 F' i, |( L; ?8 L5 o1 {MODULE_LICENSE("GPL");
' n+ p) w* ]& _1 b/ Z. M
8 z" G0 @* b3 y3 r0 u! Q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
) E( A6 s2 D' z7 s; Y, G4 h我的应用层的测试程序如下, V }7 ?+ Z8 M! Z9 T% t0 G2 x" W
#include <stdio.h>
! Y9 |& m" D' C# B( g' D& c0 V#include <string.h>$ t2 R% |: q% y' `8 j. y1 C
#include <fcntl.h>
3 Q) N/ P0 S3 }# w5 V8 z7 x" w#include <unistd.h>
- y5 {3 d+ g# T5 p2 _#include <signal.h>
- d" N) B) S( \2 c# j$ C; g#include <pthread.h> //线程; Y* o6 _$ D; t* U5 f' H
#include <stdlib.h>6 ]2 l0 T# r, X
#include <pcap.h> //捕获网口数据9 P) K& \; T, v8 C
#include <semaphore.h> //信号% H4 H+ j; i4 _
#include <sys/types.h> //消息对列. t; }8 I8 N2 t7 {( H, B& H
#include <sys/ipc.h> //消息队列$ E L( d. ]! R0 p* j
#include <sys/msg.h> //消息队列
' j, K: u( ]3 [& a& }5 ?#include <sys/select.h>
9 {2 t6 a3 m8 g; D( d. a#include <sys/syscall.h>
# D" _$ Q+ r# i: k; ^+ H#include <sys/stat.h>
% F5 |2 H5 g5 X" L5 t#include <sys/mman.h>
. E, L8 W: a1 }" M2 l& i/ v. B4 A#define msleep(x) usleep(1000*x)
. B( o3 C+ o% |- A
" C' T2 S6 C! b4 A; Mint main()6 n( I/ [1 ], H: j9 Y9 J
{ % r2 u" v0 `' ^7 r8 V" B3 ~
//MCBSP,ARM与AMBE2000交互设备
( m- ?8 `7 s! W2 K" p int fd;
& c' n; W2 M: I0 f unsigned short data_write = 0x5555;
6 z4 q9 m) I0 [6 t( ? unsigned short data_read = 0x00;
6 ?% V0 x0 x; k) T/ W fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! i/ {' a [5 X {1 z
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 m* S8 u4 W8 x) c: |
7 h. Z0 c4 v- N8 b/ b2 t& V if(fd < 0)
! G% z: `5 g$ P! H. ~ {
' U* w, |5 z5 l perror("open failed\n");
; J* @( O! e% y$ \7 h2 Q return -1;. u2 v! ~% {( a" x- I0 B! {: C
}6 D9 h( O" ^' }
7 k" h) ~8 C6 H1 X" ^
while(1)
$ d( b2 O, M7 c: ~1 } {8 p! \+ J1 g% {1 i- Z
% v4 v- N7 U i" P //AMBE2000每次读写是24个字为一帧3 F# |! J( B6 _* Y/ @1 E7 E
//写数据时将数据在底层存储起来,等到中断的时候再发送2 s5 ^7 b l1 T3 r. W
//AMBE2000输入数据是以0x13EC开头的
4 N4 M9 {) U. Q$ W write(fd,&data_write,sizeof(unsigned short));& a* t6 k: K4 Z
3 I+ { U$ P) H
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 + h. X5 W% Y0 l* p0 w# u
read(fd,&data_read,sizeof(unsigned short));
: c, x, F& V& [- A( `0 M
8 I# X$ c% r8 i7 h if(data_read == 0x13Ec)
. i; |' ^ o4 ^- o+ r( H7 z {' Y5 d5 i& \+ z$ E1 S9 p/ t
9 W' {2 V1 | J2 }; B3 Y printf("data_read = %x\n",data_read);; o( L: e* k) u+ ^1 P# |
}
$ P* |: S8 E: X$ q ) l2 {7 ~) T Q
msleep(10);" E9 W7 n" [/ d$ I
0 W* t! e( q/ k' @4 H" |
/*
0 j- K# {/ c$ i7 l. D+ Q: u9 c ioctl(fd,1); 5 b2 \+ W8 X2 ]% b, Z% d
sleep(1);
3 a9 S: j5 ?* [/ ]& U0 n% N ioctl(fd,0);6 X4 x& ~% _, d7 E: Q" e" s; E
sleep(1);
$ A* W* V8 q x* I% k% n */ 2 l# N# a4 w5 i4 H/ ^- `
} 3 M" i" Y6 w& [' |% C% W! ]
return 0;
& t$ i9 q4 Q& D& l
. q" |: f8 L8 M}" s K. i" [& ~, k; @) E; f) @
& V a; P/ C0 @& C, z- c2 y' J4 }多谢各位指教,谢谢! 急% O* v/ k' Y- j+ N5 l! P3 a
6 L+ z( d% j: u; n! I2 z9 g% i
) A F* X- H Z% X1 u: X9 c9 N. C0 U& `4 z9 g; Z. U4 @
) ]$ h' s/ X: }1 r3 d: P: C
$ c+ I* q5 h2 `1 x% q1 J |
|