|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: % A4 `7 y6 |4 A3 F
/*- S, o# D }0 {, E) _
* Copyright (C) 2009 Texas Instruments Inc2 t& F ?7 X; a4 ~
*! k! U" b# N" ] g" H. V
* This program is free software; you can redistribute it and/or modify
a5 w4 m4 J3 }6 U b* P4 U, J * it under the terms of the GNU General Public License as published by6 r! i1 Z/ k! a; n, g
* the Free Software Foundation; either version 2 of the License, or
" h4 D; w9 J! H$ p! G * (at your option)any later version.
$ M6 [. o- M9 A2 e) y3 w+ J *
5 A3 v L9 d5 M * This program is distributed in the hope that it will be useful,
- _3 m: S* x9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of& _8 v8 N/ m/ b' }1 A2 k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the/ M/ G5 K% |- C/ {
* GNU General Public License for more details., F+ m! s D1 y7 p4 u4 ~
*
3 }6 r* R! O. q0 n * You should have received a copy of the GNU General Public License6 {' E9 f4 V* @2 i E8 M
* along with this program; if not, write to the Free Software
2 A t4 O0 F4 R) ^# ]% S * Foundati
2 w! T1 ?6 k- l) z$ X2 C6 A*/
' }* d( p7 H4 A#include <linux/module.h>
1 q3 I8 R; V. R1 q$ p% u#include <linux/init.h>
# \+ {% q5 R. j' H2 p0 d& D#include <linux/errno.h>9 U' o( g' N9 f
#include <linux/types.h>
' D) `" a l* I8 {4 b#include <linux/interrupt.h>
- E1 r! U7 |0 g- Y8 f [, g#include <linux/io.h>
2 o& O; U! @5 p5 l1 w3 j( y8 N' `& }#include <linux/sysctl.h>4 c% e# U6 n6 R2 Q* ]
#include <linux/mm.h>! O- }& w& d# i" H/ }
#include <linux/delay.h># g* K2 I' v/ B2 e& C9 y1 [
#include<linux/kernel.h>
5 a- r3 }+ r& z4 W#include<linux/fs.h>
9 S. x+ d7 b2 s. i1 s#include<linux/ioctl.h>" t' c; I1 _" \! B2 G
#include<linux/cdev.h>
W! d& C; c- X- U5 r#include<linux/kdev_t.h>
$ O/ p: a: W' L#include<linux/gpio.h>
6 U6 {3 \5 e/ Q#include <mach/hardware.h>
. w8 I2 i( Q' G#include <mach/irqs.h># z- I* s$ i V; F
) Q* S7 X' n4 T& C9 k$ @
#include <asm/mach-types.h>
2 T' c6 Q5 v9 @& l$ n& q: s#include <asm/mach/arch.h>
* l- N9 k. ^* }/ j* q; m5 q; N* R#include <mach/da8xx.h>
" ^6 e6 j, F; q2 y9 W9 S% W- H#define SYSCFG_BASE 0x01c140002 \7 U5 H! t( B2 e4 E& T3 g
#define PINMUX1_OFFSET 0x124 7 N+ t; a/ F F0 l9 U* S
#define PINMUX18_OFFSET 0x168
# j' b4 v. ^& b$ m* @ I9 ^#define PINMUX19_OFFSET 0x16c4 |2 ?: k, K* u# u& O
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR4 ]. _) x, x: s6 e# S
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR( c7 M% @3 K- ?& f
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR: l- o j4 a y' q1 V
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR* _; z- I; ~0 Z9 z9 F5 F" ?0 m' s
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
2 g' ]5 f' O. X ; V/ ~8 k( o" u
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR# e$ }4 M9 }6 T
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
- U" `4 @5 ~/ C$ e//PSC6 a; E9 H, l" A, `* g+ N$ J! b( \
#define PTCMD_ADDR 0x01E27120 0 H, i; ~) E; p9 a( L$ W
#define MDCTL15_ADDR 0x01E27A3C( C' H( b* M$ g f; s
#define PDCTL1_ADDR 0x01E27304
2 J. z/ ]1 Y$ Y. n8 H3 m//GPIO8 direction% a I- g" D" `
#define GPIO8_DIRECT 0x01E260B0, c% z+ a! G- [8 I
#define GPIO8_OUT 0x01E260B4
, C( G: r7 o! c5 |% y* Y5 q#define GPIO8_IN 0x01E260C0- v0 d f9 z) d; a/ ^4 Q
2 R2 X1 \# H5 Q. c//#define MCBSP1_RINT 99
# o$ D/ W3 L/ Y5 G- g//#define MCBSP1_XINT 100
Q/ s/ J1 R8 Y% o P* _6 Q& |0 hstatic int MCBSP_MAJOR=239;
# P v" o& L! t/ v9 b% estatic int MCBSP_MINOR=0;2 `# L& l' F5 F2 ^, f+ C, t2 _# y
static int count =1;6 j" |6 I- J; V3 Q' o
) q4 {- z+ p! r g
#define MCBSP_NAME "MCBSP-device", b2 A8 y" L: F( O& Y
( z M) g. R# [' o% h, c+ B
static struct cdev *mcbsp_cdev;9 e/ n3 B: R- N9 Z' V! i
static struct class *mcbsp_class;
/ D2 \, d/ _3 F& \9 B4 Ustatic dev_t mcbsp_dev;/ T6 \, c7 R- R8 V% A
unsigned int DRR_data;
: a U" g* G# }3 y" \- \3 U$ Funsigned int DXR_data;
+ H3 V3 V( l; f9 p& z# nstatic int mcbsp_open(struct inode *inode,struct file *file) R4 r! ]1 ~8 | d8 y/ b
{. S! r7 K+ \# U' q7 g- a1 n
# d$ t3 p9 J }7 B% x) _5 n- l) O //interrupt enable,initialized3 l; F( k, S; z2 ?7 g+ J- Q
unsigned int temp;' o/ a4 X* `+ W3 L( z
//SLEEP_EN(GPIO8[10])---0
9 U; R/ Y- t7 r3 r' h- n, ` G- b temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 Z& r- x7 |0 B- B- Q temp=temp&(~0x00000400);( J) W( J% B+ l6 o( v$ v
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
$ B, [. J+ e6 h //RESETn(GPIO8[8])----0----1* e9 U$ @6 L. m; K- N$ _
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ B0 a3 M3 A& ~$ A; k
temp=temp&(~0x00000100);4 d6 A+ U: ?8 \( w! w; V% v
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0' ?) K) b2 | w5 Z! m
udelay(100);
8 @+ e5 A; H" m temp=temp| 0x00000100;
% G# J8 z" m- W5 s __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
% y) b+ S; p! c2 T | udelay(100);/ {- u$ U+ @6 G3 [' K# T b
printk("open success!\n");
8 i2 ~: _6 b7 `9 [( e2 ? return 0;
" X M7 {$ a9 y' a* V' }5 s" i}
8 k0 C$ S+ P( I- U! ?; P
4 U. }3 d# T8 Y. G! jstatic int mcbsp_release(struct inode *inode,struct file *file)
W d/ ?9 y. n1 N1 a& G+ W" M{
/ B3 O) t& d; k7 c1 R6 [ printk("release success!\n");0 ^: G* P: S0 v8 U1 k. z
return 0;; w4 P6 W; w- }- _
}
7 _$ S% J* x: V- _7 X. v2 z' C2 r o7 E
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)4 Y7 R; }: V2 ?& x
{
: g5 ]) M- q0 @- W copy_from_user(&DXR_data,buf,len);
7 r" F+ B; [. P E$ R iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
! z" o! V; b6 r5 u, \6 z return 0;+ A: f6 D: j+ a" X: g! N! ^
( i8 X- v3 \& W& E7 k) |: \8 L}
4 e7 `; ^5 p. k1 l# a; A( L( y4 ~7 Z" C$ y+ K
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)* E# m* _6 b' U7 A
{ ) X% o( n% o- ~2 T. {1 d$ C
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, M7 {. h g$ }3 l ~* s
copy_to_user(buf,&DRR_data,len);
# u Q0 J8 [0 f$ C/ L2 n return 0;
s7 ]+ A: r& R$ R8 ?: v* G6 C s8 O}
( I& E. w" Y$ y- {3 E' u8 ]! Q* m1 G/ M2 s' j7 a3 P
% r5 B7 u: H0 \3 l
static struct file_operations mcbsp_fops=6 x) I0 {9 M, G" K
{
' j1 G Z3 b# J% @9 B. \ .owner=THIS_MODULE,- f1 M2 P n. _# m: [' k! u) q
.open=mcbsp_open,
# k! Y5 l1 ~4 M: n+ R( ^ .release=mcbsp_release,! h9 }# s7 a% M- |/ M# v5 F
.write=mcbsp_write,
. |! x: }! V7 N# \ .read=mcbsp_read,
2 I- i/ w' w: Q& B2 {2 d};
0 f0 q c6 k* O9 Fstatic int __init MCBSP_init(void)& v) U$ C8 t5 b/ g, S! r5 Y# p
{" K3 |, E$ n' ?/ z, L
int ret;
9 x: r5 [, u& U5 v- M9 W6 E2 J unsigned int PINMUX1_REG_old;# V( u2 [8 U% J, f
unsigned int PINMUX18_REG_old;
' E+ _+ f# [7 c. G7 m unsigned int PINMUX19_REG_old;$ m4 f( r& P6 S6 b3 e5 ]3 p( a0 C8 P
unsigned int temp; ' z, H/ e; W3 s5 j
if(MCBSP_MAJOR)
9 l% S/ b; q8 k5 q W {) R8 ^( u9 ~5 ~2 K& H: ~
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 ?7 t2 ^5 M; A, A; ]. X
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);8 l! k& r A/ z% \) Q
}* e9 d' R. f, L4 [7 K; Q& _
else4 _/ B' K: ]3 k
{ |- G+ @& b y. M8 b* h) X1 Q1 u
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 a7 P, j0 s) W. n: @+ q+ |; Z" ^ MCBSP_MAJOR=MAJOR(mcbsp_dev);
! m; F1 V) Z# z; k7 D$ ~7 E4 v6 L6 G7 E }, u Y" o5 }+ s3 q* Q& [0 G
" u6 D( X# }7 g/ S, J; u2 U
if(ret<0)
% H, ^+ c1 X% ~2 Z: ? {
7 n' s) t6 U. t+ w printk(KERN_ERR "register chrdev fail!");
! H$ w' j5 n6 `1 X: D& n return -1;: Y* a$ h3 O+ S& h( X0 R
}
8 s, t7 j; [$ ?7 Q" h) ~% a; F
* I" w7 F# r3 \+ Q mcbsp_cdev=cdev_alloc();
/ ~( O! i: Y9 e. O. A+ r, a : n; w9 c/ |6 E* _
if(mcbsp_cdev!=NULL)' I+ g0 q9 [3 V0 o/ C
{+ s. C& M! N4 g5 @4 l; z
cdev_init(mcbsp_cdev,&mcbsp_fops);, f! J/ ?1 p! M% G$ r1 F& x, }
mcbsp_cdev->ops=&mcbsp_fops;
+ j5 d( Q! j, A$ Y6 R mcbsp_cdev->owner=THIS_MODULE;4 x: I: Z- x2 K% t/ Y) m
0 |4 N" \! N- {# [. _2 }6 i if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
b7 d: R. ^# ^/ a printk(KERN_ERR "register cdev fail!");; [ Z) A2 c: k& g
else
* n, s' M4 t/ k3 f* @+ U printk(KERN_ERR "register success!\n");$ ]8 R8 Y* Q; ?1 x
}4 R: X* U2 u. @# H( Q. v
else' X8 p& c7 h) Z# L L, n) o
{! l1 _' p% x9 q# x5 M3 Y% F( a
printk(KERN_ERR "register cdev err!"); w" @0 m2 n! i7 A4 t n+ X
return -1;
$ w$ ]3 Z0 q( N }
; c$ Y* C1 n4 M/ E1 V; o/ a ) O# N. x* q7 j" b4 b4 X. x
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);: Y+ t: f' ~3 T! B1 @6 b" j
if(IS_ERR(mcbsp_class))3 v0 J7 m+ [; |, [2 ?
{
+ y: D) ?' k d' N printk(KERN_ERR "register class err!");2 \9 d7 {! h& P9 p
return -1;
! C* x. E. F: x* ^ }
p! u0 a4 O; Q4 Z) h2 |, M% d* u! Y device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);, V7 T( G5 [+ K. O! Z, t9 @6 [- p
( t) B- y: [6 a: T% b ^. y, _$ k
//PSC7 p; v9 T! r" V! b
//add Enable MCBSP" n7 Q1 V6 m9 S) G! _5 m
//test- R* {% D/ E v6 S0 [4 Y
temp = 0x80000003;
. C3 f1 E/ W, \6 b, ~, ` writel(temp, IO_ADDRESS(MDCTL15_ADDR));0 o. O- A) \; ?3 W
temp = 0x00000003;
/ _. L4 h- D( z" U4 s* g. V writel(temp, IO_ADDRESS(PTCMD_ADDR));# z7 c! b! E1 u% j& E4 V& C
2 Z. g( [$ f+ f }7 [, O/ v
temp = 0x001FF201;
6 L: G+ T( G+ g writel(temp, IO_ADDRESS(PDCTL1_ADDR));- J1 f; z9 U6 H& Z7 o
+ D, a- c, Q ?2 O9 n F o( O //PINMUX
5 ^* }8 Y8 b" ~* G0 x4 a //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 _: y. M* N0 M N/ b2 r7 ^" X8 s PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" M: a3 S6 B2 y; ~4 k* I/ G PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
& u# m- r+ N6 K% c$ }9 R, {8 v writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 l- g" S) ^9 r# E% e6 ]7 I& u ) x! p$ Z$ _! D
//SLEEP_EN,EPR,L138_SHK1,L138_RC
X3 u. l* [+ Y" R PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" G0 v) C- I- X3 H6 ] PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 3 M. ? T* ]: z( F1 |1 Q5 B0 {
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' y5 i; p4 x: j/ m
4 b5 m8 \) f1 {& H7 m //RESETn,L138_SHK2
- F$ \: n: x: r' G: F PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 i( A( u8 n" D3 ` PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
2 x% m5 v0 i0 l ^0 M$ G) i. P7 I writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);. \* t6 ]4 ?2 K* F3 G
: v7 m! b0 u8 ~3 K0 Q/ Z% w4 p1 _
; W. m8 F( q( }' K3 V9 P3 n8 c
//SPCR Register8 }6 ?5 l/ d# C( a( x6 C
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset: T6 t. e, n" E$ z* M$ h6 V
temp = 0x03000000;//(DLB=0)! S6 q+ r2 q8 e+ w; Z9 L- c
// temp = 0x03008000;//(DLB=1)9 m; y3 c" M+ t/ S q
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset. }, @6 t, O- {$ f, ^% _: o# Y
temp = readl(IO_ADDRESS(SPCR_ADDR));% g% G- \! h$ v% C8 Q) x
printk("temp=%x\n",temp);; q* S( p w, b4 R% @
6 Z% ?. G4 w9 ]5 X' U* g& B8 p" A
//PCR Register; r, u x! Q; f7 P5 |
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) W0 @/ P) V8 l // temp = 0x00000F0F;* p& j8 h# s0 B$ |# d3 t
temp = 0x00000B0F;
K% }6 W1 C0 ?8 \! O/ u0 ~6 p" A writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
( w- J& V$ h4 A temp = readl(IO_ADDRESS(PCR_ADDR));6 t) R6 \: V w: o/ R0 w
printk("temp=%x\n",temp); 0 N& Y. `- |) O: N6 N
//SRGR Register
- m" R. P- o, Y# e; l //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
! y% \ ?, K8 z- l //temp = 0x301F000B;. {/ u5 \% R" A1 F; i
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
% m% ?$ k" g: V/ S1 C temp = readl(IO_ADDRESS(SRGR_ADDR));! Y! T2 [" i4 G8 _' M1 \" g
printk("temp=%x\n",temp);
7 I7 O& L' j" m; A //RCR
+ \7 B& a/ a1 r! i. ~+ L; x //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,. z6 D( @" Y% ]0 V' ?
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0 i' L B* w' y7 V# e: n! z
temp = 0x00440040; G s- K( ] Q O6 W
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 8 o+ h3 k9 Z0 L# b0 R+ \. Q, f1 m4 r
temp = readl(IO_ADDRESS(RCR_ADDR));% F% t- B* _! M; ?
printk("temp=%x\n",temp);
; S }+ g1 k6 A9 H //XCR
+ J5 @ L% B' J' s. `9 z //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ d) _) u2 Z/ b
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) `9 r& }8 J" b0 ?) a! }- [' g
temp = 0x00440040;
. ]3 X$ c; C; h. W writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized . Y* u" O7 a+ f4 m/ E: b2 U D3 {
temp = readl(IO_ADDRESS(XCR_ADDR));2 s- g7 A! y+ l8 d2 l7 y7 G' S
printk("temp=%x\n",temp);3 w3 ]" x5 q- U R# ]' ?
udelay(100);$ Y% X: T* B' g; q7 Z
//SPCR Register6 w: s4 G* B8 J
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1 L( x4 s0 A- Y' C, R0 K
temp = 0x03C10001; //DLB = 0 VS DLB = 1
* U7 j. h; U5 l+ m3 D: } writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled) l- Q9 A) H; P! T/ k+ |
temp = readl(IO_ADDRESS(SPCR_ADDR));6 Q2 J' C, ^) h4 x5 H+ P& G1 f
printk("temp=%x\n",temp);) K% S4 N" s6 s3 X* v2 x
udelay(100);
1 e/ G$ }5 K/ x4 u$ _5 Z9 N/ s- |8 V; M9 [
//set GPIO direction6 j2 t" U F$ j. E7 O8 M0 ]0 f
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));7 f% P" H' p- S+ i V0 [. I
temp = temp | 0x00000100;//EPR----input) h5 `# q: [/ N& H5 H* j U9 `
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 d& w7 M. [* `& R8 w7 m __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); * S6 ?! q2 I, W9 r# B, o
/ [' b# L! g% O& `9 v# p4 O7 }/ l5 A return 0;
7 `1 |1 }& G# J( n}
1 o4 ]% p1 j E2 Z7 j& Y2 Fstatic void __exit MCBSP_exit(void)
t0 C+ z: h2 o{# I% c" q5 ], B, I8 C
printk("mcbsp chrdev exit!\n");; k1 s! r6 S1 ?1 m5 s1 y/ j
cdev_del(mcbsp_cdev);; f! }( N0 T$ I) O9 R
unregister_chrdev_region(mcbsp_dev,count);
! K) j! j- E c3 @& Q5 ~1 ~: p0 ] device_destroy(mcbsp_class,mcbsp_dev);5 p6 d" f* r+ C5 f. p4 ~
class_destroy(mcbsp_class);
p3 N' `) o6 r" M2 m# m}7 {1 O% ~4 q3 e) k5 x$ X
module_init(MCBSP_init);: X) S1 M2 P! c! r, O
module_exit(MCBSP_exit);
( y0 M/ h2 R- B& h, |2 |; v. Z1 f' Y' l' B& t/ y
MODULE_LICENSE("GPL");$ l' o2 C. R) r- V* {. p3 r3 D) ` H
+ e. n; }; N- K) M; _. q( h# a
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。: P) F, q6 E8 X' j- }# \
我的应用层的测试程序如下
& T5 e9 `- p: \' Z#include <stdio.h>
% J, Y8 H0 ^. f! m6 f5 a: b1 A#include <string.h>
5 ^# v; y6 R3 t1 x0 d#include <fcntl.h>
" X4 M) e8 F9 `#include <unistd.h>! I- E; ?/ F' t& ?- ]
#include <signal.h>6 d5 [2 v0 u: J# p9 G! N3 W+ F; a( y. M
#include <pthread.h> //线程
! }6 p) |! J! D4 l9 y" F4 z) d5 m#include <stdlib.h>
$ r3 i/ B, G- q7 ~ W% f#include <pcap.h> //捕获网口数据
5 i- [) W; f# n2 l#include <semaphore.h> //信号- [$ A+ [% g; N
#include <sys/types.h> //消息对列
$ v6 Q: ^7 {# ?- V3 c#include <sys/ipc.h> //消息队列
6 T$ _) p# N5 K1 E! u& k#include <sys/msg.h> //消息队列
. J2 B. Z! h* K% u3 d1 W) q#include <sys/select.h>
3 `1 j' @; e9 O. i#include <sys/syscall.h>
, y/ o) D3 O4 C- e" }$ C#include <sys/stat.h>
9 K) l% L/ S, |#include <sys/mman.h>
* o- i5 }$ ?% _1 \2 U#define msleep(x) usleep(1000*x)
8 c6 ^+ n3 ?' P
# Z9 ~. l* }3 @. q& M, `' Vint main(), S" p8 p% g5 u1 y: C4 x# `3 x) C
{
v( Q( q& g- Q' E //MCBSP,ARM与AMBE2000交互设备/ }. A, q8 V9 [( X4 y5 O7 f
int fd;
/ h/ |1 i5 T: X: D \# Q unsigned short data_write = 0x5555;, J( k+ x; S! j# ?* G
unsigned short data_read = 0x00;4 V8 q! L1 K1 F& q
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: a# Q$ e: w5 F. Z% Z- Z
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
, p& a2 L' _* |# f, D' s- _
( X! ~/ [8 w( J& ` if(fd < 0)3 \3 V5 y. V- x8 k5 B
{
. x0 p0 q$ ~( {3 [ perror("open failed\n");
+ D: n" a0 _& j$ H# M; [/ b return -1;( p% F+ ]) x3 c( N2 E7 G
}7 y+ x6 p1 S) |' ?3 T0 v
/ m6 H" D2 J7 \- x0 ?8 V while(1)7 t' u, r" G1 O2 y. l
{2 [7 F5 p% \% x+ l$ h; ]" y
: [: `6 K3 |5 s6 I
//AMBE2000每次读写是24个字为一帧
: e$ ^2 C& O# p# e" R! d //写数据时将数据在底层存储起来,等到中断的时候再发送% c g7 ]2 l1 r! y# A; T+ C- X
//AMBE2000输入数据是以0x13EC开头的9 e7 U8 q# `$ Z5 Y9 q& _: n
write(fd,&data_write,sizeof(unsigned short));
. ^7 W _+ T7 I X / d8 o" H! n8 A6 \
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
; w/ C. Z% e0 c9 o( g read(fd,&data_read,sizeof(unsigned short));
% i* ]( a# _; {" q 4 P1 O! R/ [" I1 Y
if(data_read == 0x13Ec)% v% X% M O$ \: E, I* A9 Y) N+ l
{
2 @! ?# i @* w$ l0 Y/ c7 F + O3 z' c+ d! V# v1 T) M
printf("data_read = %x\n",data_read);
, t/ a; t* h8 k' w9 }; ] }
4 \: H! p3 `$ S4 P2 m5 b) L( w 1 @' ~3 P& F/ m
msleep(10);1 \1 h5 l, w- z- Y
% E. w! [8 H1 G8 O5 T: ~, O) c4 W6 s
/*" A. @ V& [2 `& o" @* m' v$ {
ioctl(fd,1);
/ A, H2 U3 ~- x: l# F sleep(1);# N, t- J4 b+ P' G7 a
ioctl(fd,0);
. B$ r- E" m$ @( U$ Z1 u2 Q, B# v) L sleep(1);
8 ^& k+ ^! ?% A, X" u */ * `6 P* m1 v, M; R O. N
}
( d! Z; l$ [' ~' R5 ^ return 0;
! N# ]+ l/ B3 J* V/ Q4 Y& ^! g
/ a5 H9 u* K7 I8 `; q# o+ E, Q4 ]}
! F0 j y- u* w; z9 H
% `. i3 k9 s2 K% W* a: U" c; E% u多谢各位指教,谢谢! 急0 P; U( Z1 N% f/ Z8 {2 u
! l9 Z$ A; n! M+ u* j6 D2 G1 ~3 `% U9 u
4 \, h3 ?6 S1 L% w$ v2 S0 C/ C
5 u; Z; Z9 S; B" a
; N' [) |! S% E
|
|