|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( w/ W, @, |5 u- x3 I- E/ S
/*
" t9 s" v7 h0 [% N2 v * Copyright (C) 2009 Texas Instruments Inc
+ [3 W* p) W( `0 x, [' w0 C; ` _ *4 t, |: A' P0 k
* This program is free software; you can redistribute it and/or modify
% W( F. {& P6 N * it under the terms of the GNU General Public License as published by
6 k' R9 ^# N% I( _: P$ ]) F * the Free Software Foundation; either version 2 of the License, or: Y0 {# t% M# n5 ]
* (at your option)any later version.* X- F2 d' h* U F' O' ?3 W
*
+ y- q# F$ T: r * This program is distributed in the hope that it will be useful,0 t4 o# \& v4 N8 @' T
* but WITHOUT ANY WARRANTY; without even the implied warranty of
1 A5 R8 t( ]3 `2 U * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( R! I2 F' s$ ^9 B& i, y- O7 N * GNU General Public License for more details.
: C, d: F. a+ K2 ~ *7 U* P" s$ ]( L. ?5 U" \( H; k2 I
* You should have received a copy of the GNU General Public License/ l x7 l7 K) J- l, Y! {
* along with this program; if not, write to the Free Software l' w$ _& L5 p2 x! `: T
* Foundati
: b, ]9 C7 u d! M*/* o+ ^ T, ?4 {1 z6 P- u, R4 ]
#include <linux/module.h>
& A& k- X' a6 e- O$ q#include <linux/init.h>
% a$ | F8 S3 h, ]9 P#include <linux/errno.h>4 X- v ?( P/ ?- z. W
#include <linux/types.h>; \* X' l' J6 }0 E6 ~" c; V
#include <linux/interrupt.h>
) p6 p3 _/ h# z% t7 D1 I#include <linux/io.h>
3 {) a; g. m1 V/ q- H5 F8 s7 K#include <linux/sysctl.h>) r: c) t: O9 l+ h1 K2 k
#include <linux/mm.h>
9 u( _& v* E' _#include <linux/delay.h>7 y$ o1 X. ?$ t! b: T1 n
#include<linux/kernel.h>
7 o- m' r0 U0 x. X1 i6 y; \#include<linux/fs.h>7 W6 [9 i1 G- P& H
#include<linux/ioctl.h>
; F% `, X0 a& \& i: [#include<linux/cdev.h>& M" } _( \* b# T+ _
#include<linux/kdev_t.h>* L3 f u4 H) G. o1 b6 `* I1 w
#include<linux/gpio.h>0 d3 v# U& ^! j2 G) X; R$ P1 P/ I
#include <mach/hardware.h>
I( \6 }2 b' J" L W2 W) y#include <mach/irqs.h>
+ L; G% ?0 n% F& c6 k8 e {+ K; B. ]( J* i3 E; g' l7 j" ~. K* p0 b' R& p
#include <asm/mach-types.h>) U" G, l# l4 T3 \7 K) v
#include <asm/mach/arch.h>" `2 ~8 b* V. n) U E( ~0 Z N
#include <mach/da8xx.h>
2 K: F/ K8 E( T9 V, b/ Y: b#define SYSCFG_BASE 0x01c140009 q3 m3 _8 D3 u( C+ X+ C
#define PINMUX1_OFFSET 0x124 ; E, @5 e8 `. q$ t: p# @5 r
#define PINMUX18_OFFSET 0x168 ; K, G7 c2 _3 j
#define PINMUX19_OFFSET 0x16c( a$ |; v! n* a8 R7 B
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
* V: _7 \" p+ I) D4 T#define RCR_ADDR 0x01D1100C //MCBSP1_RCR" C- T m/ u7 l
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR: G" {) F- \" c- [
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
: s7 ?. ^( h) J' J; _. k ?& `5 @#define PCR_ADDR 0x01D11024 //MCBSP1_PCR! S/ O& z# ]# }) w: u# y! [* w6 j! e
; U1 G, |; L- R2 L% d7 I, M#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
$ R6 W1 m9 r/ c4 b#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
5 C0 C" S4 @8 L$ }% D E3 n//PSC
4 ~9 c4 B% k* O2 K$ S#define PTCMD_ADDR 0x01E27120 2 c9 j: J2 {! y2 B
#define MDCTL15_ADDR 0x01E27A3C* \& ] p% N& y6 s: M4 P( G
#define PDCTL1_ADDR 0x01E273047 P3 f5 D5 i' I+ D) h
//GPIO8 direction$ z2 R0 w o$ x5 d+ I
#define GPIO8_DIRECT 0x01E260B0" W' Z) Q2 l2 W# L: u C& }
#define GPIO8_OUT 0x01E260B4) t4 Y/ C3 {3 I: S4 B. U* S
#define GPIO8_IN 0x01E260C06 u8 Q, \% ~# X1 m3 x
) g L2 o# e3 Q8 @$ R" T" g* O//#define MCBSP1_RINT 99 6 y5 w5 w! ~/ p
//#define MCBSP1_XINT 100 8 U! M8 A) s$ S/ ~# Z0 `
static int MCBSP_MAJOR=239;! u/ Z* V1 a$ `$ \4 E* ]
static int MCBSP_MINOR=0;
$ |' _* w- _9 r9 T: ?. zstatic int count =1;
7 P; i; M: T- S0 w2 Z" o, a& V4 ]$ a4 U, G
#define MCBSP_NAME "MCBSP-device"
% c7 e- H% v! u' E- S+ V4 O( z$ r! `; ?
static struct cdev *mcbsp_cdev;, c* j; J1 D/ o2 C
static struct class *mcbsp_class;
/ ?; z9 M- `7 @; r5 @+ Gstatic dev_t mcbsp_dev;& Z- L: o# a8 L1 K3 l; G
unsigned int DRR_data;
* t4 f( E d0 G: O4 n6 `unsigned int DXR_data;
# U F1 i$ h- d5 _, Hstatic int mcbsp_open(struct inode *inode,struct file *file)
- P6 O3 Y& r2 Y- H" c2 F) S" B{1 r( k& G, U! J
9 l& u4 F. S3 t* T3 h% ]' X. }. i //interrupt enable,initialized# r3 H3 U9 S( _. o. C; ^
unsigned int temp;
6 o, j" s! U6 _ //SLEEP_EN(GPIO8[10])---01 T9 A& C0 `- h" U: [4 n" I: ^
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" k& H2 n( t6 k. {+ Z
temp=temp&(~0x00000400);
+ n j8 z$ h. [* f! @ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; l7 D& |1 j7 ?2 ]) ?) i6 D9 J/ u
//RESETn(GPIO8[8])----0----1. j: G3 w2 W$ A* i X- d
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' i' n) _, Y; [ temp=temp&(~0x00000100);; ]5 u7 a ?$ l; Y
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. E3 ]0 c$ l# R0 K! \
udelay(100);
8 C. I" f0 n- h3 m; S temp=temp| 0x00000100;* o7 o' |% x( I0 G
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" k; i1 ?1 E7 J2 B
udelay(100);8 ~( L$ L# v- ^& G9 r+ T2 d! Q
printk("open success!\n");
& z: D6 O, \, A) l$ R. n return 0;5 P6 B- }, w/ A, W0 J
}
$ f+ W& f3 M9 C/ z# B# _" [: L$ `
0 a4 ~1 Z! j8 y- i+ n3 }static int mcbsp_release(struct inode *inode,struct file *file)
: ~. l2 K+ [: t) O% I{ \ r- A; j4 r+ [/ b3 Y u0 s
printk("release success!\n");
5 _( X* T$ c8 m/ F% v9 m/ M return 0;1 g. d7 y- r' B6 s( X2 D
}
7 v8 P' b i5 s( ?/ o* p
; E6 _) f9 {# p4 P: J2 Z; w3 w) Astatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off) Q8 E3 U$ @1 Q" x" ^
{1 ^% s. s# b; ]& N1 \! a! ^# @; c
copy_from_user(&DXR_data,buf,len);" j2 b; _' { Q! v3 N$ Z4 H) D
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
$ p8 u$ N0 E: h w0 H' F: e6 a( k return 0;/ w. x! w! ^) Q# H, n' ]8 V6 I
3 C/ j: x% l# i# O) ~! R
}
6 t2 h) a/ T3 _$ }# P7 m0 c; k6 D* j7 n5 G0 z {
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off); }' h, k; N5 a; I) p; R7 ?( i
{ 3 Z3 {6 h: [% U+ i
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));' H2 O U0 E* @/ q& e" c' I5 N
copy_to_user(buf,&DRR_data,len);
# H, D9 t5 o$ ? return 0;
% j) l, W3 C# S! m7 v}
; W5 e% s# u8 z, K1 a. ^+ f/ ~- t2 e4 s2 I
! Y$ b$ {& M5 w- U* m4 |static struct file_operations mcbsp_fops=
. a0 |$ @' ~2 l% J) C4 T{' |* f" _; N. L- k# j0 _% ]6 @
.owner=THIS_MODULE,% i/ U2 @" |( f8 X- ]
.open=mcbsp_open,
1 f: P* O% m3 w: B% ~* T3 w+ j/ a .release=mcbsp_release,4 {9 k8 d1 x2 K4 }; _
.write=mcbsp_write,$ T2 N; k$ v, ?4 _& @' }2 R9 X& M
.read=mcbsp_read,' i% w* s7 t4 b8 T) K8 e) r' b
}; m2 j+ B. z* O" D3 j u
static int __init MCBSP_init(void)9 w9 s* \/ N- V3 x4 x$ l
{
7 v* i2 j, r5 P, a int ret;$ B# `" Z/ |7 q$ A3 l/ c
unsigned int PINMUX1_REG_old;/ Z4 K& E$ I) h* j
unsigned int PINMUX18_REG_old;
. X3 H1 l6 T6 f# L3 n) j6 w4 U4 f' i unsigned int PINMUX19_REG_old; C! r& a5 N2 D* P& ?
unsigned int temp; 8 m1 l3 z+ C' {4 e
if(MCBSP_MAJOR). G' _- ?% w, i
{
, E* S, y4 z& z; H6 }$ s- G+ [ mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);' Y/ M0 {; ^& U
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! k' Q g# _9 s, x
}
, k' U. C+ R% S0 T: Q else' p3 h. S: o2 O% e
{
" D/ u' g+ [+ `0 e9 i1 h ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- ^+ O; W9 q7 e! ~6 @: G MCBSP_MAJOR=MAJOR(mcbsp_dev);8 A5 | T' O# E& q' f: ^4 ~
}
6 a9 ]7 V8 g; S5 q1 ~2 L# e: Q
" D. ?7 S* P! [" U) u# o& o if(ret<0)
2 P/ V/ w; D; {0 ~ a {
. ^7 [# f" | W9 Y, D. t* D printk(KERN_ERR "register chrdev fail!");
! ?: H* W5 t8 R) m7 x& [) [ return -1;6 ^$ b6 T8 g9 y- A7 j* `) g; ]4 i6 M
}3 C) n t# o7 F) ]8 t* ?
2 `2 t3 E- Z3 L0 G2 Y) ^: o mcbsp_cdev=cdev_alloc();
% U+ F$ m# @: @1 `7 M7 Q* @
) X& f5 y4 o( K, x: H1 ~ if(mcbsp_cdev!=NULL)" s- T- ^5 D9 O0 W. G! v/ q: y
{
3 M( |3 P+ o1 \4 \* S cdev_init(mcbsp_cdev,&mcbsp_fops);
: w0 y0 L0 K( b9 z) `( H# N mcbsp_cdev->ops=&mcbsp_fops;1 C, J$ O( y+ b1 _) @
mcbsp_cdev->owner=THIS_MODULE;3 @0 a+ X* J8 _
9 ^7 q4 q6 K7 P. a0 C4 ~
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
* c+ P: W9 {3 `- w" _9 I6 R, t/ p printk(KERN_ERR "register cdev fail!");7 X8 I u" E7 O' q1 |
else% b, I# U4 _& O8 _' g- g
printk(KERN_ERR "register success!\n");
4 H+ q: r. q5 }8 ?! g } o) S; I( H0 Z, \* r5 {! X
else# G% O: U. v2 ^0 y, \& C
{- M0 |/ ^' }1 M$ u3 E4 G+ I E
printk(KERN_ERR "register cdev err!");
1 e+ c4 _1 J/ G! w; E a& a return -1;7 i ?( V, E- r4 M
}
f7 @4 e5 r$ A% ?8 d( w3 f( }/ g* E; {
' M: Q# Y- ^0 ?; F mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
. Q: ?; t8 X" n- ~( A if(IS_ERR(mcbsp_class))
+ p& P3 h. u9 O: @+ n/ S# q) I {: l) k9 s# h6 G& q9 l# l. f3 y: K
printk(KERN_ERR "register class err!");
0 U5 G4 a1 y3 L: R! O return -1;( @0 `; N: W/ a; b
}# o& f* Z3 B. y8 A9 Z6 f
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
* Z( }2 Q% R7 t5 |* J# ~! Y, @$ M/ D
+ W1 \+ r8 M# E1 x //PSC# M) V6 b! T0 T3 r5 E" \6 @, o) X
//add Enable MCBSP
! r# r1 G# X! K8 c/ T. h; b //test7 `* e" T' V6 `+ l# _; a( q& y
temp = 0x80000003;' a. |+ y w) }2 ^$ Y
writel(temp, IO_ADDRESS(MDCTL15_ADDR));1 ^6 N; R1 M% H$ x1 A$ k" @& a5 ?" @
temp = 0x00000003; c& c4 o5 {/ \; P8 q7 y5 M: ?8 M
writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 O! u- W2 P) i2 V, m
! G: G" k3 J' i' G5 h' |, q$ n temp = 0x001FF201;$ t3 F9 h% H j, g1 F. I$ @2 s
writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 I/ j) L8 x% X* V9 z
7 N" x, P2 i% x* x //PINMUX 1 B ?0 `5 i* o( M; C s
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,) c4 f8 H/ w; l" `
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
4 G& \1 w, t3 \* e& B PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
7 T% O% M' t3 a1 g# j i; b8 o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- f0 A% V3 K) I/ Z! [: e , E# m( _ v$ s' t) e5 H d
//SLEEP_EN,EPR,L138_SHK1,L138_RC
/ t( U) ?- A6 g$ c2 w' ? PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ) K' H, v8 u/ z/ |% }, y$ h
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ! i: H7 o3 {" `4 T
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
3 y) P% v7 L; c! R 4 d( M9 K# ]. _- @: y9 B
//RESETn,L138_SHK2
/ r& ?) e3 C- u. r& d' | PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. [ o# z8 }* y% L% p PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
& L. R" {( Q' D ?& q) m. m. w writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- ^$ W$ p& X- G1 B/ s
% Z2 j1 }' V' V6 J8 i6 s( S: C/ Y
* i- x+ w- L( H3 v$ Y //SPCR Register+ U4 ?6 q6 Y( V B
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
/ z* N \- E$ I9 y2 f1 ]- j/ u temp = 0x03000000;//(DLB=0)
7 V& Y5 S. _' ?; t$ f // temp = 0x03008000;//(DLB=1)5 _1 o* i# _7 _) y3 U4 I* g
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
7 u* Q6 O; E: l9 y w5 n temp = readl(IO_ADDRESS(SPCR_ADDR));2 Q# H! U! Q3 S7 m6 G/ W* J
printk("temp=%x\n",temp);, Q. O$ o" n) v# {- k% H# _
$ [7 A" r0 T3 m# l! o
//PCR Register
* R9 X6 F5 L3 M4 w! l: b //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 c' m1 a" D, @% n& ?- C2 F
// temp = 0x00000F0F;
$ \: C5 B2 z& @; l0 r temp = 0x00000B0F;
# s' K8 e5 m- y1 d writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
) [- J0 @3 @! j- g5 X2 q temp = readl(IO_ADDRESS(PCR_ADDR));
0 S/ m: |2 N& g# J printk("temp=%x\n",temp); # M- O d. f0 ~& a3 o u
//SRGR Register4 c+ g* Y% m' ~3 u) C
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11. y9 {, ^+ E4 ?* h9 A; X9 j
//temp = 0x301F000B;
! T9 Z, [4 e! E+ E0 g- @! K: n writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
7 G9 x/ g$ D% m temp = readl(IO_ADDRESS(SRGR_ADDR));8 M- C9 g8 Q5 Q" D/ [8 ^4 I- W: N
printk("temp=%x\n",temp);
2 p& q" F) n, f7 `& g0 z //RCR+ g3 Y8 d- L6 c& k6 r7 t
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
0 [, i% V4 Z5 I) F/ v4 G //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 l0 M1 w x" l
temp = 0x00440040;
O* B& W- N0 u writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized - L: `0 U: y3 J% r F
temp = readl(IO_ADDRESS(RCR_ADDR));8 Y8 }" `2 ^2 O% y; L% I% f
printk("temp=%x\n",temp);
% Y" P7 s) r8 y //XCR! o; c# I) U$ K
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
I$ K: p; a& g- L //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-06 ^ }3 j& _2 i5 S5 p( t) c2 e& W
temp = 0x00440040;& {1 T2 n& d& |
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ; j: E f: W" @% [
temp = readl(IO_ADDRESS(XCR_ADDR));( w( f) ]' X, o/ n9 @4 K
printk("temp=%x\n",temp);
$ p7 Z' L$ S- \! I udelay(100);
( ~% Z) p& |) O/ g) F4 ~/ |# ~7 v1 i //SPCR Register
$ I/ o* y6 i+ \3 P //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; c' J! v! G; ?2 ]( [ temp = 0x03C10001; //DLB = 0 VS DLB = 1
' s4 Y6 U# k J writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
1 u3 }3 f' C N# G temp = readl(IO_ADDRESS(SPCR_ADDR));# z" m) [* a0 F5 U& a6 e5 T
printk("temp=%x\n",temp);
+ p* W! Q5 [9 n- C% [2 U+ q udelay(100);
) N' s! r" |& j/ X W$ ~* E4 m) d
//set GPIO direction
: A& }9 V4 O1 V9 ?. Z: Y temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));( r6 u! D: [- x4 `, W6 i; }% N
temp = temp | 0x00000100;//EPR----input
! C: G1 k; t9 C3 R5 Q) a) ~/ a temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
3 X& R& D' Z( i __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
: M+ Q# U" a1 `7 q) X 4 Y4 t4 a% H0 `
return 0;
' l; e9 g+ l5 j1 k3 G}
3 Q& L. v; {3 n6 H( I" {% ystatic void __exit MCBSP_exit(void)
; b9 f9 r1 g+ S0 Y% S6 N- A# o7 F5 \{ t, S% ]% J' ~+ x' H6 \# V$ T4 O
printk("mcbsp chrdev exit!\n");
U& }5 x, S. P( v) t cdev_del(mcbsp_cdev);0 j2 g& Y( v* C$ {2 @* Y+ G
unregister_chrdev_region(mcbsp_dev,count);4 n `+ \. F# H7 D1 Z: v5 b4 w- v
device_destroy(mcbsp_class,mcbsp_dev);
% h( S! A+ f0 m2 \+ u. r: n/ ` class_destroy(mcbsp_class);1 z! E7 Z8 d4 n4 W
}
( r4 ^$ \9 S/ q9 G6 omodule_init(MCBSP_init);
7 \' q4 G/ j& R& k: ?module_exit(MCBSP_exit); O, C0 Z6 _% n; D7 x G
) g! f3 v4 I( |9 [
MODULE_LICENSE("GPL");
% l2 j; I9 O( a: ?0 A
" D( n; k$ S2 y. F5 g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. W! y/ u, j4 z3 R
我的应用层的测试程序如下: a1 N$ v+ W2 }2 n3 `9 B$ k, Q
#include <stdio.h>
/ u- o7 ~; p: G$ s" q0 [#include <string.h>
" i* r* h; u1 p h0 @4 X' ^9 I#include <fcntl.h>
4 E2 j2 Y1 F6 ^2 P s( @" k* V#include <unistd.h>0 \8 |* C/ q' u) q' m% Y0 B9 G! u3 G
#include <signal.h>
' C& x( ]. j! i' M#include <pthread.h> //线程
/ k+ M+ U4 I# N#include <stdlib.h>; w" C8 A* a7 r' V _$ d
#include <pcap.h> //捕获网口数据2 S0 M' I" E3 c
#include <semaphore.h> //信号
: d5 X# h& v9 @' O/ g- R#include <sys/types.h> //消息对列
; P8 U' m3 X( u) N' q, r9 x. x) X#include <sys/ipc.h> //消息队列
) W- ^9 O; e8 |* n; @#include <sys/msg.h> //消息队列6 M; ]8 ]' |8 Z) w& K
#include <sys/select.h>) T4 g) {1 T' L! ^5 E3 _' `
#include <sys/syscall.h>0 {' }) J9 n: f5 R) S( Z6 g- m" V/ W
#include <sys/stat.h>
0 t. F; u5 q2 F q, J9 u: r#include <sys/mman.h>
/ ]: u- u( R' B1 y+ W#define msleep(x) usleep(1000*x)
0 y5 |* v" Z' ^4 S$ R8 f* l% y' K" ^
int main()1 ~/ X i8 E+ l# \$ p# a* V
{
% P! @+ m$ x$ p0 f5 f+ h+ Y; X //MCBSP,ARM与AMBE2000交互设备4 j& q$ \% ?) d$ |3 p8 {
int fd;6 I2 M* q' U! @
unsigned short data_write = 0x5555;# L1 G% [) L7 s- `
unsigned short data_read = 0x00;! Q* U1 m1 [* j7 j
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ ]4 G$ Z6 h& r- o5 D% u // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);) _; k# C0 }4 h1 t- x" R
' b& A( p" U/ u7 }4 e' L# d( |+ M
if(fd < 0)
& s0 k b5 i% C# V {
4 l* M0 f0 m9 q. L1 @% y perror("open failed\n");
( ~# O# G7 `+ M4 g1 D' p return -1;$ l" `. n9 S6 h; b* C2 B; t8 S
}" M4 s1 m, t( j" F; x8 p' Y
$ A# q8 r+ u, ~& g while(1)
. K* t+ i; s2 ?7 j( K! o1 w {
, q1 i D% d2 H, L ) g3 f) E2 ?+ v5 @6 ?' @' _
//AMBE2000每次读写是24个字为一帧
6 P& { \. n( n$ F# Q //写数据时将数据在底层存储起来,等到中断的时候再发送
* L4 j) M; i$ R( z V, G2 J3 c //AMBE2000输入数据是以0x13EC开头的& q7 {" N- X+ Y7 }
write(fd,&data_write,sizeof(unsigned short));8 `3 }, A, g a' e! W
3 |- o0 ~) I" N3 O6 C //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
4 e$ N9 v" H+ F! H. y- z" j read(fd,&data_read,sizeof(unsigned short));
1 }5 `+ [) U3 Q: n! J) q" {
# O: ?2 s1 X& x- o if(data_read == 0x13Ec)( @/ p8 h( H; X8 d& V w" A
{
+ e/ P' O' \+ h; g$ d$ { J
8 |7 Q' a+ l4 I. H& M printf("data_read = %x\n",data_read);
9 \" J \( p2 T1 @3 B$ {( z }8 z5 n4 [* o/ T( K* O |
0 X5 H' e1 W- ]% J! g) v5 G msleep(10);
7 u. X) O# w6 i; c; ~ * n6 J0 o4 b, L8 `; g U7 a
/*2 u9 C; D) S+ o a6 z( [" R
ioctl(fd,1); + m Z! |, G) Q) W+ R9 j$ p
sleep(1);* x' K9 z% q1 e' s% j/ G+ ~5 {
ioctl(fd,0);) L. V5 y- Y. v1 n
sleep(1);& ^- w1 x% L& I2 e
*/
% K& D8 ]1 n& ` A0 j' M }
# [6 x3 Z4 C- N% A# a! \ return 0;0 \6 R0 T' J5 i" T" D
6 \0 W, j- e1 Z. s) y
}0 K' N) n+ k* ]3 J( o* U5 e
2 q& X$ M! S0 J# m; N9 K$ ~
多谢各位指教,谢谢! 急. H0 H0 w! ?4 ]5 b. g. D4 M0 \
, ?+ V* s3 F, Z1 W( Q% F
5 }' E/ j! D0 ?. ]& W+ a5 I- v2 ]( I% r4 b B/ E. a9 `+ l
7 h; C1 h, j5 N5 v. n$ e/ X/ N2 R( O& p
6 }/ B1 Z E) N! [
|
|