|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
3 X1 C! }1 ^/ O1 l3 [/ f# n; N- I/*0 l2 \& a7 l* g
* Copyright (C) 2009 Texas Instruments Inc
4 c1 `$ y( [- g {' O {% I9 ~$ H *
+ q- k% I* N6 R! D& V, I9 @5 @$ K * This program is free software; you can redistribute it and/or modify4 p0 q5 E: O3 N u
* it under the terms of the GNU General Public License as published by
v9 i. j6 A! \1 z7 ^% t% W- j * the Free Software Foundation; either version 2 of the License, or. F- K1 q+ `0 o5 u
* (at your option)any later version.
3 G4 K# ]; f4 o$ \6 D+ R/ T *2 E; }, {- j% c1 m* `0 P
* This program is distributed in the hope that it will be useful,; r$ y9 I4 k$ y) N
* but WITHOUT ANY WARRANTY; without even the implied warranty of
$ A% F: `! ^2 C% e * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ m7 i+ Y% [% C+ N$ N3 \/ V% [- i
* GNU General Public License for more details.
$ t9 |- V$ |# a0 O! j *
+ l8 N# O Z" e( C3 Y * You should have received a copy of the GNU General Public License
~ l7 {# Y2 m7 i0 o, @: N * along with this program; if not, write to the Free Software
- \6 B4 f; c0 k* u r$ t- z9 [: P * Foundati3 ^/ T' w9 f8 Q- g
*/4 K0 ^6 `' x) K" \% Z$ a! U1 V
#include <linux/module.h>0 n6 R `+ y, ]. c
#include <linux/init.h>
/ j E' d& d/ H$ q#include <linux/errno.h>+ d x% ~; Y& ]/ u+ ]- ~
#include <linux/types.h>7 _9 r7 W; S4 w9 W5 X; p' k
#include <linux/interrupt.h>" g Y8 ]) w0 n; f: T2 c6 V2 M$ b
#include <linux/io.h>
9 Y7 Y) @ h3 e: @/ H Y#include <linux/sysctl.h>' j% j( ^2 X+ l
#include <linux/mm.h># G- `$ m0 y: Y, i E# k b
#include <linux/delay.h>( @+ g1 S, m" S5 I- ^8 l0 a L
#include<linux/kernel.h>& S1 r+ m1 @! p7 ~/ V& H P3 c
#include<linux/fs.h>
, q7 h8 S' ~$ V5 ]& {! J$ {#include<linux/ioctl.h>
- ^' ]* _ R- y: W9 a; R0 U#include<linux/cdev.h>! @) ?- k U3 Y* A$ h0 K0 a/ ?
#include<linux/kdev_t.h>" ~! w8 w7 h3 M8 N
#include<linux/gpio.h>
) T; \! } H' _( S7 b% B) ?#include <mach/hardware.h>- x3 ]1 I7 ?! S r7 e( p, I
#include <mach/irqs.h>
* i/ [2 u/ ~5 s1 U* |! u1 p/ C$ E5 z2 ]
#include <asm/mach-types.h>/ B0 Y+ A i2 L2 Y% N6 J. C
#include <asm/mach/arch.h>
; W& i* }/ h. i( @#include <mach/da8xx.h>
, u$ u$ S1 M+ K$ S3 M#define SYSCFG_BASE 0x01c14000
5 n8 T% L5 @; b6 w+ g7 ~' E. B5 s#define PINMUX1_OFFSET 0x124 / A# j8 {! Z/ p5 z/ s% }, k: B
#define PINMUX18_OFFSET 0x168 6 z$ q/ s) ]3 E1 U7 T, }- q( \) G
#define PINMUX19_OFFSET 0x16c) w" l) k8 v& \0 j0 R! O
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
$ S+ e; P. K9 m#define RCR_ADDR 0x01D1100C //MCBSP1_RCR, \6 V6 ?: f- L) T' c3 i
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
# g9 L/ A6 F' i! @5 _9 e#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR" ~+ m t) f7 j* A$ c/ R
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
) s9 p. L8 |3 Q: @
. E# @& W, b# g#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
7 P3 [: Z1 [8 a( u0 O#define DRR_ADDR 0x01D11000 //MCBSP1_DRR" y5 @$ Y7 G: Q6 X; T, c. @- V
//PSC4 n2 o- \( g8 q
#define PTCMD_ADDR 0x01E27120 ( {" F, s0 S6 H$ O: w
#define MDCTL15_ADDR 0x01E27A3C
! Y2 u1 e1 h0 O" h#define PDCTL1_ADDR 0x01E27304/ E6 n1 ^6 a2 H' E# T* `3 c
//GPIO8 direction1 S" k. ^+ Z5 O9 Y
#define GPIO8_DIRECT 0x01E260B01 a1 j3 L4 ?- s4 i! |7 u% v$ M) X
#define GPIO8_OUT 0x01E260B4) {- F# J4 P3 c* F
#define GPIO8_IN 0x01E260C01 r& y- m0 W, k6 |; a5 m
! H* Z7 a* [- P0 }( c//#define MCBSP1_RINT 99
: O8 n. X3 _( ?$ _( q+ B% L% V//#define MCBSP1_XINT 100
, K/ X& R' s7 C; p* Vstatic int MCBSP_MAJOR=239;' ^* _; f$ h7 O0 h( o, V( S
static int MCBSP_MINOR=0;1 _+ v/ }; }2 s' a- T3 w
static int count =1;( X: H6 M/ s/ ~5 g
3 j$ o' }7 G. g
#define MCBSP_NAME "MCBSP-device"
- U; {/ Y9 k1 c) P- b& ?3 o! D! Z5 Q) G, }0 D% u
static struct cdev *mcbsp_cdev;) N* n: u# ~0 h0 u9 ?: J! B& F. a
static struct class *mcbsp_class;9 x7 n" s* q, r {8 J
static dev_t mcbsp_dev;
& H# n* ~$ q1 \' b( wunsigned int DRR_data;# c9 K# Y6 C1 z' x
unsigned int DXR_data;4 k$ b9 t' P, V6 U
static int mcbsp_open(struct inode *inode,struct file *file)9 X! I* J7 z& \* S, h2 Q6 ]- G8 |/ S: K
{( V5 }. U) s+ }0 k: n; S: Q
5 P+ O$ o, z2 O4 I. q) k, Q9 c //interrupt enable,initialized( m' T8 T9 Y2 n, X! _3 X
unsigned int temp;
% l- F% `" e* S* F' T! Z' k7 M- B //SLEEP_EN(GPIO8[10])---0* h1 E. h/ }: V- A, _; w
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 S; W. B; D Q1 d1 H4 [; C temp=temp&(~0x00000400);& ^$ H9 b8 y# a9 z" x
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
. J9 T% g" P8 G1 r //RESETn(GPIO8[8])----0----12 q. l+ m( ~& G' ~
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* j1 L$ O: u# Q8 C$ j
temp=temp&(~0x00000100);
7 Q5 b, Z$ |* V- c# ? __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
! T: ]. g5 \7 U4 _1 w' }! { udelay(100);
w6 y# x- f% Y! O3 l temp=temp| 0x00000100;
- n* s4 r" R2 M+ U* F" k5 P __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
( z$ [; |: _4 d" { udelay(100);% A, X) _, u0 B( j, u S3 O+ O# y
printk("open success!\n");
- \# M) Q l- U; }2 x return 0;
1 i. a( ~5 R: b! S}
! n/ Y6 ] `3 N' }
+ ? `4 S+ ~7 bstatic int mcbsp_release(struct inode *inode,struct file *file)" ]4 t1 d- j8 g2 }) | v5 I
{/ H$ i1 P7 P3 {! K' n# x9 z
printk("release success!\n");
4 r# P8 S; ^$ i; _& e return 0;' y0 Y2 p, v6 W \* T+ R$ S
}+ x7 Y% p! H5 W- ], W& [* a6 C6 Y# o+ a
% k) u2 q9 g9 v( w
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)- T; j( d3 K+ J% E k* N
{
0 i5 ?, n4 O3 t m& Q% H/ Q2 n copy_from_user(&DXR_data,buf,len);6 m" }3 \/ ], Y( X6 L0 m. v
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
1 L" N" Y0 t; K+ T1 { return 0;" ^3 ^9 Q" b/ V9 M% {
! r$ C$ M2 k# n6 d, M. \' n
}
5 r( D9 L2 B) a: n5 h
/ h9 e; Y# u# W$ wstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 a( z: [2 W7 n N{
8 t! ~% [" u7 X4 ^ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# h/ X! @" Y7 ^* G0 |$ } copy_to_user(buf,&DRR_data,len); 6 {) V8 i4 e3 K0 h/ I
return 0;
4 l- Q: M% V# o/ m, E. `0 ~ P}0 m& |! @' j1 x7 F; |: ]: g' d ?9 O
4 q! t |3 v$ T1 n% A! P! f* {* a; M: P4 N c5 S% ^# @
static struct file_operations mcbsp_fops=0 |/ w% `' w4 z0 U4 E
{) s& y9 X3 e% ~2 }0 O
.owner=THIS_MODULE,
9 X! ~5 E) b6 X4 Y9 P .open=mcbsp_open,
9 g" K3 n6 Z$ R1 S7 d) Z5 Z .release=mcbsp_release,
# h- u# X$ g- Y" ]1 F# Z .write=mcbsp_write,! c R& x, z: C' `: e! ~& X! d, M4 A# M
.read=mcbsp_read,
/ {! E. K' p: f }/ S" O u3 U! `};4 ?1 z5 T( G/ h. E& d+ T
static int __init MCBSP_init(void)' Z; z% ?+ E3 M( f8 u' @( l
{
: [$ e1 c/ r& L* Q, \ int ret;
Z$ O7 N/ @( s/ e6 V1 @, M1 k* \ unsigned int PINMUX1_REG_old;
% v. C. t3 c. Z& S Y9 E unsigned int PINMUX18_REG_old;
3 ?7 X5 C- ^; y/ w) {- n A unsigned int PINMUX19_REG_old;
/ T" J0 n7 a0 F( C1 @9 q! V, y unsigned int temp;
0 p. I+ a0 \- B+ E/ ^ if(MCBSP_MAJOR)
3 `5 p9 _. _; [) V {! a z' [ }, M
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);8 ^9 N, |# a3 T+ C! P1 Y% s
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);$ Q& o# w. D! V Z
}
3 T/ A1 {& `: [ else
& v4 I% A' e, d4 E7 x x Y# ^ {
* d* Z) `3 l% i' r# I) {$ W ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- _8 e: \5 B+ X5 A3 h8 s MCBSP_MAJOR=MAJOR(mcbsp_dev);+ o. F* d: j& \" r; W% K
}
) D* m/ a" M* X
) p7 T- E) u6 ^6 J if(ret<0)# }. u7 F; w; k
{
% \2 c+ F4 ~) p; p2 J1 \ printk(KERN_ERR "register chrdev fail!");
, \7 g& b3 L+ R) B, [) l return -1;
4 ?% w3 V. ?5 m2 ?) B! Q }- A5 N! u) Y/ P" s: a1 A$ S' R
/ Z% m2 S: R4 H, L3 U$ D mcbsp_cdev=cdev_alloc();
0 W/ S% k% f+ `8 v( J2 U
+ a7 N" B0 a7 R, Q2 v if(mcbsp_cdev!=NULL)
2 ]7 z6 {8 W" N: @1 ?4 ^ {
, M9 I O( t- Q4 D; X cdev_init(mcbsp_cdev,&mcbsp_fops);% _' N' v. S2 X1 ~5 ?2 `/ B
mcbsp_cdev->ops=&mcbsp_fops;
3 l- p w) `$ | mcbsp_cdev->owner=THIS_MODULE;
8 L2 q' ~' o6 I* }. P* h
" l6 P% J/ ]: H! ~0 N if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' y( s" V. u6 x2 x printk(KERN_ERR "register cdev fail!");4 X& c: F& X4 H
else
% `$ t8 `3 k$ @ Q1 T printk(KERN_ERR "register success!\n");( _5 v1 z0 u/ m& T' ^" u, X# n
}
8 m" m+ o# n/ ]" c6 b. J2 i else
, c( f. ]: B" c# ?1 r7 x {
* h* |5 T' R6 @/ M7 w printk(KERN_ERR "register cdev err!");
, k( ~* U4 H) Z3 g return -1;
) v9 ?$ U' d, g' Z1 h1 F2 I }7 z& b* d: U# p4 ]" G
" V8 i5 V- ?* W5 A
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 P& `0 S c- f. w/ `
if(IS_ERR(mcbsp_class))
* w1 f- A' Q+ L' O$ s {% n, Y& @! T5 _$ }+ [0 ~ s/ X
printk(KERN_ERR "register class err!");# n, z' g$ U( q9 f
return -1;7 B% m( g( P& l- @
}
9 `6 n3 N; o8 U/ n device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 n( M. b$ Y: N; B/ p' F& o- I! \
//PSC. y5 ^$ Y* A) r: s; A: r. u
//add Enable MCBSP g+ r, \3 ]6 w/ L* \
//test5 R, ]. X& S: S' z9 R
temp = 0x80000003;
- c1 I1 y0 I7 a8 V writel(temp, IO_ADDRESS(MDCTL15_ADDR));, o: s* F; B- O8 X. e
temp = 0x00000003;6 i& ]* f' J2 m( I. p
writel(temp, IO_ADDRESS(PTCMD_ADDR));) ^7 f/ j! V$ a% K
- P$ D7 A" O/ ? z
temp = 0x001FF201;; A: m3 T9 u2 M. |8 ~: ~, d
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 c2 b( [2 p- i7 }, R
A: p Z u! n# C, \/ |/ r* w8 L //PINMUX
, j- A1 p5 Y( Y. @; g7 K //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,5 a. u% }5 u% I+ X2 z2 l2 N
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); " Y: Y5 A% I: |" f8 i' N
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 3 d2 p& D, @8 e2 P7 }
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- B% Z8 \0 i. U$ e
" K' E, @5 Q% ~' Y* z //SLEEP_EN,EPR,L138_SHK1,L138_RC2 e8 i7 P, x* B( T+ R6 a
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 l1 C9 k4 G% }/ s% h# u$ z PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; * o! {3 t# j u& t0 X6 U, S
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);% f# R: a/ H( D0 i' r# L8 ~2 g8 P5 {
! V8 }0 Z1 L2 b* E6 Z" y //RESETn,L138_SHK2
8 K* S3 N* G: O% K PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
$ D o, y9 P) j( w0 K PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
+ @) i7 ~& p; }( J/ A writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ _% Y; D8 `, f' J4 i" g
- k- m; U+ w. l7 N8 }
& o* _5 [0 |8 A4 m u //SPCR Register
5 o+ m% g7 L j, {5 c g //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
4 Z# ~: ~' q" L% W! K) F temp = 0x03000000;//(DLB=0)
! }* ?/ p3 U! |+ E/ F; }# ?& p! {6 p // temp = 0x03008000;//(DLB=1)
& o6 ^' V( \1 @8 ?5 E8 Z writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% t! [+ b' P4 \ temp = readl(IO_ADDRESS(SPCR_ADDR));
2 _: n$ A A& ~5 O; r printk("temp=%x\n",temp);. P" j1 X; W( z9 K8 ]
# ~, l. W4 ?' T2 [" F
//PCR Register
7 `7 M# W. h5 u) G# _ o8 e //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
0 M, t/ l% i; S9 Z$ W+ L2 T( P // temp = 0x00000F0F;$ y, }2 Z0 W. @5 \4 K! |% y/ p
temp = 0x00000B0F;
$ I9 K% a7 b+ U0 g" w, G writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized . m& I/ d0 W# ~5 R- x/ W
temp = readl(IO_ADDRESS(PCR_ADDR));( l* ?! }3 k! U( b. [
printk("temp=%x\n",temp);
2 L1 e8 ^7 w4 X //SRGR Register1 a0 r( s; m* ^( l) I
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( I2 g! U, w% p
//temp = 0x301F000B;
7 b. Q: O& i1 n6 Y; l, t& a. X: @2 o writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ( r" k8 P, ]& R
temp = readl(IO_ADDRESS(SRGR_ADDR));
! J7 b- ^& @8 _) Z printk("temp=%x\n",temp);" j" b, W, H2 M2 T) L8 N
//RCR% C) m: s- ~2 r( o4 R( C5 v& V
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
3 O+ B: B% A: ~2 E2 i( D8 i //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
7 L4 U$ N' A* E" T1 k H temp = 0x00440040;2 e; H' O; l; h/ l8 w' U% U2 C, ]' r
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
& ]- T1 ], a1 I. c7 G! K& _! ? temp = readl(IO_ADDRESS(RCR_ADDR));
$ I# @7 N: r6 q" K6 I i! b printk("temp=%x\n",temp);
2 q H) g! T) O h8 X' o. B //XCR- m, Q& z/ z: H: v
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
: f1 r0 t- m3 A //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 K$ d+ |/ O ]9 B9 S temp = 0x00440040;
& c X3 J2 C- K; F2 i/ b writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
) z( x9 @: ^+ O2 f5 Y1 h temp = readl(IO_ADDRESS(XCR_ADDR));+ L4 j; B1 w) H. V
printk("temp=%x\n",temp);* U. V, m1 m; ?. J; h* }# f
udelay(100);
* [, [4 Q& k4 l- w& ?; b6 \, h& M4 S //SPCR Register
/ |( S" s; K+ X# y7 W' S //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 p* G. o( R: F$ Z, l) @ temp = 0x03C10001; //DLB = 0 VS DLB = 1
# l6 _7 U7 A2 F& J( ~1 y writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled: U( P" K4 w% O7 v' T
temp = readl(IO_ADDRESS(SPCR_ADDR));
) I+ I C+ u, p) j- X7 T printk("temp=%x\n",temp);+ K9 ?) h& y9 p/ b ]8 y. c
udelay(100);7 Y$ N( D4 d; ~" h
7 ?! W- X' N. e7 ]6 Y) J) @( W
//set GPIO direction
$ V: \, q5 D4 m temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- J( C2 _6 Y* ^3 x* x* H
temp = temp | 0x00000100;//EPR----input3 B. @8 L, |! P+ z$ N& g
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 C6 _. }: ^2 l( S
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
5 \; V% Z$ @+ S0 P3 ~5 I 8 ~5 B& j( V' u$ J. o0 W0 D r
return 0;
& p; t* l6 `( k" s' L}
" r+ g6 s# A/ R5 m+ d/ ystatic void __exit MCBSP_exit(void)
8 J$ {# d: U' |& b: [/ m; |7 t{! }# g( M9 r u* b' V
printk("mcbsp chrdev exit!\n");
+ e9 O" o# p3 G$ L cdev_del(mcbsp_cdev); G) J% K$ r& O) C' E' t0 p8 y9 P& T, H# u
unregister_chrdev_region(mcbsp_dev,count);
2 p$ i$ l$ B6 N3 T5 R n device_destroy(mcbsp_class,mcbsp_dev);& ?3 a! y& B4 Y- u( y/ i& h1 G
class_destroy(mcbsp_class);! [6 z# {" D; ~+ k
}
% Y9 N+ N+ i) H4 Umodule_init(MCBSP_init);
4 m2 `/ v0 u6 p, S) _9 t1 m cmodule_exit(MCBSP_exit);
7 T5 M3 l% b8 o7 x0 w: N: h
7 q! X- Y* p# \. u5 }- J6 A9 SMODULE_LICENSE("GPL");: o: l- K( l1 [7 y8 O1 v
5 @* Z; I+ i' Q3 i9 r, `' F
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 P) P. G4 L* l
我的应用层的测试程序如下
5 w. l* t1 v! e1 S#include <stdio.h>
" C8 t F+ M. Y5 D#include <string.h>
* V$ Z/ {8 E& p#include <fcntl.h>" g0 U7 h( _; p, s6 i
#include <unistd.h>
4 {6 Q+ ]7 ?9 ]5 w! l#include <signal.h>- \6 H \- ^" k' m( a2 u
#include <pthread.h> //线程( C) h) e$ G8 Z8 y
#include <stdlib.h>
3 f4 F* s1 H) g+ O7 X#include <pcap.h> //捕获网口数据
. W' i% W, q$ Q9 r" }+ S; T! M& R#include <semaphore.h> //信号
7 ~ F( H2 k' L$ t: g" r#include <sys/types.h> //消息对列) C; |; F2 ^. d2 `1 i2 {
#include <sys/ipc.h> //消息队列1 B G- l6 b m
#include <sys/msg.h> //消息队列
x( `' }, _" J#include <sys/select.h>& c9 `& v7 I. d- Y
#include <sys/syscall.h>
; l$ Z }8 ?# ^+ n9 v#include <sys/stat.h>6 a9 z4 v5 W, I* U9 D4 M$ w1 Z2 P$ ~) t
#include <sys/mman.h>5 u1 m b9 V/ ]9 Y0 q
#define msleep(x) usleep(1000*x)
& z& A5 R1 y. C6 n7 M+ _+ p. X. l+ S+ O# ^% j/ f0 }6 U; F. d
int main()4 C) q8 Z6 V0 r4 U. a+ y) X
{ % C; x) H) f7 Z$ N- A4 o
//MCBSP,ARM与AMBE2000交互设备
8 ^/ P$ }# \3 J+ x6 V: y int fd;
! k) \6 {4 I$ Y0 k& z unsigned short data_write = 0x5555;
. X! u3 ^3 U8 \: P unsigned short data_read = 0x00;. _% ^- t# `+ L5 V0 m; m
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ b5 s7 K' |) I! n0 F/ c; Y // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
# R+ w' `" [, z- J* ~
" C. F8 C Y s: v7 b8 j/ j2 u4 A if(fd < 0)
# f4 p& n; E* o% { {
# C- W- e. W4 T; e. N perror("open failed\n");/ G) D1 a' S" V
return -1;+ `: e) a) K& I/ a3 o9 k6 Z8 m2 D
}5 _( h* c! a+ r3 k1 y
( |) [9 w9 \6 B8 i8 ^- x( W while(1)' i8 e) d, R: i7 l, k# `. s
{
: V. l" x3 z; G5 F" w
; \ I1 P) C( b- P& r2 ~ //AMBE2000每次读写是24个字为一帧
0 G6 {1 z3 z+ O //写数据时将数据在底层存储起来,等到中断的时候再发送0 X/ h" Q! ~: E/ ^/ {; ]) J8 @
//AMBE2000输入数据是以0x13EC开头的6 P- |% t; y. E# K! `$ \
write(fd,&data_write,sizeof(unsigned short));% V# a4 ~' k; B1 k- s: _7 E/ j( \( ?
! d# G; i1 Y7 m, k: s5 q //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
* K3 v, ?0 T- x1 ~, y! L# E read(fd,&data_read,sizeof(unsigned short));
. R% }1 {6 t+ t# N; i1 Q ) I' X- F; p; P9 ~. H
if(data_read == 0x13Ec)
9 y0 s- [0 S8 H7 J {
; [) E( g9 p4 ^ T% T) f 9 u! L. M0 H4 p+ e; q
printf("data_read = %x\n",data_read);
& x2 l6 T3 O8 A+ I% o/ u4 g& i }
4 E/ ?8 a/ ~4 J* y9 | 7 }- J+ x- D) K6 Q9 F9 e2 n
msleep(10);
4 I7 Z# H4 |& F# @/ H+ I7 |% I
( x' r* d v/ E; `: p. H2 Z /*9 |# e$ @: x' ~5 ^' b! s4 F8 J
ioctl(fd,1);
, T1 U6 j6 ?+ M8 e9 Q& X# }+ f sleep(1);" l: m+ g+ ^: m+ @5 q! T
ioctl(fd,0);% s1 L( H3 N4 o& K
sleep(1);- a/ g+ X0 {$ x+ B0 @
*/ , i. {- X, J) x/ @& ]" j
}
9 U) s5 ?0 i' D8 }" O* D$ J return 0;
2 O1 c. ?4 x( F
, k4 ]- a! f: d- C}
. y% n5 Z) F; o+ X5 V% Q( w' T) d% H4 g9 i: m: W0 ]
多谢各位指教,谢谢! 急: Z+ S- X5 U8 \# r2 X/ j# j
" x6 T- u* s! K- w; _
8 r4 Z/ a" b+ w1 b- I+ U- ]3 u5 O" e% S$ C9 M
+ u# d) X9 D7 f, U% I! l
4 m9 ~7 j/ ]" `0 Y2 ^ |
|