|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 1 A* R) g8 |1 |9 q' U
/*6 l' [. _# B8 U; T, n2 ]
* Copyright (C) 2009 Texas Instruments Inc
/ J8 y3 _- A1 }- L0 u3 V *
) r( ^3 Q m8 Q. f * This program is free software; you can redistribute it and/or modify! e2 D. p- Q1 L7 z
* it under the terms of the GNU General Public License as published by( M% R0 r; c& X. O
* the Free Software Foundation; either version 2 of the License, or
: ~6 u$ A3 }3 W( A! E * (at your option)any later version.; A$ L7 i7 r1 a$ B$ S
*
! J! e7 H1 l4 H8 D% h6 y, W# u * This program is distributed in the hope that it will be useful,
1 Q$ y J) j0 L * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 t; y& c1 n+ @" c * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% X4 Q7 U1 f) t _3 ]2 @ * GNU General Public License for more details.
; T8 x5 ]$ q- I/ _ *
8 X d6 X( g4 p1 q: }; M1 M * You should have received a copy of the GNU General Public License
+ r* ~9 @3 ]7 D8 p- u" z& [ * along with this program; if not, write to the Free Software2 ]( z# Y8 B& S5 B9 D
* Foundati! e+ o8 J# p1 g, F1 c/ n
*/+ g4 N$ T7 U, ^0 s+ P" O8 h+ N
#include <linux/module.h>; P+ Z! I6 ]9 G4 ~ B6 t, j
#include <linux/init.h>
[: }; I0 O$ O% a. j8 U#include <linux/errno.h>* W$ R7 D1 Q# C/ a
#include <linux/types.h>
8 a" z$ }% W! F3 L! V' C0 y6 d#include <linux/interrupt.h>6 F- y! y' |7 I. Q( ^' ^' S% |$ D
#include <linux/io.h>
6 p: W" W0 e4 E#include <linux/sysctl.h>- u0 T1 D. y. s+ ]4 f- `, J: v8 }$ X
#include <linux/mm.h>
# ~1 V, N5 ~0 ]- ?" A5 i2 f2 f#include <linux/delay.h>; o, e7 l7 i2 D5 D# r9 h; F5 a( K
#include<linux/kernel.h>
- v7 \8 x G7 T& X4 L A, T! o#include<linux/fs.h>
2 s! G5 o f8 a ]( R#include<linux/ioctl.h>" Y- t- Y8 Y! d7 C& N2 I; Z, {- [' h9 e
#include<linux/cdev.h>; c% I5 y' U. \5 i+ ?
#include<linux/kdev_t.h>
8 F: g( g: F' }. P. ]- i1 e1 t#include<linux/gpio.h>
# o$ v" \; p" ~7 z#include <mach/hardware.h>
* E( I) u6 h6 L5 i0 L, ~#include <mach/irqs.h>
$ i# B4 T. Z3 F- g% b$ n" t) i2 Q3 _
#include <asm/mach-types.h>
8 O# O% m4 W/ x9 ~#include <asm/mach/arch.h>9 G# ?) J- s! d: d1 F
#include <mach/da8xx.h>7 W1 A! x) e" g# u7 ~) c- Q+ W
#define SYSCFG_BASE 0x01c140004 H7 M! x% t% k" O* a" A- O
#define PINMUX1_OFFSET 0x124
( f3 e' o* A. \; r& ?: c#define PINMUX18_OFFSET 0x168
- L) a! G' S" m# U% E, v#define PINMUX19_OFFSET 0x16c0 ]* y ^9 J4 P/ \6 o! X
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR4 y& o$ \) P3 d& ?( G2 G. @
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR3 F0 ^/ I& P6 K* c5 M4 v
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR& A9 Y; S7 ?! e" Z* }
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
, M& T8 G5 Q+ I7 W+ X7 N#define PCR_ADDR 0x01D11024 //MCBSP1_PCR% P4 ^8 R% T/ r
1 v4 A& C5 s0 r( T: x
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR& j/ i. Z* |# R) k1 i
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR6 V9 o; y3 v% U$ L5 N4 o( R* h% P4 N
//PSC$ e- T8 a7 L* V% l! y
#define PTCMD_ADDR 0x01E27120 8 j8 g' X/ e8 e' C' ~3 i
#define MDCTL15_ADDR 0x01E27A3C8 K! P6 G E( v% {" N) w7 ~: Q' O
#define PDCTL1_ADDR 0x01E27304+ M+ {# L5 L# x
//GPIO8 direction$ n# u3 B, g6 b; s+ Y
#define GPIO8_DIRECT 0x01E260B0- J1 W' x5 I, |; R9 M
#define GPIO8_OUT 0x01E260B49 c9 P: w; o6 y2 \7 z% _" D
#define GPIO8_IN 0x01E260C0- Z) K/ w1 S2 q+ B Z
C( ?. Q: `2 ]' u/ z
//#define MCBSP1_RINT 99 2 r/ O( z& V( u/ N
//#define MCBSP1_XINT 100
7 ]. l$ N- |, e: c# Ostatic int MCBSP_MAJOR=239;
3 o2 m* K$ N+ _ D) [9 Xstatic int MCBSP_MINOR=0;
- Z4 ^; F/ C" H% mstatic int count =1;- q9 W/ }5 A. Y! ^/ u! e
4 |6 Y. O+ F# ^, Z; T: s#define MCBSP_NAME "MCBSP-device"6 @- I; ^. _! G. G7 s0 n' u' i
" I% v3 R( e: ?4 s. u/ c! N
static struct cdev *mcbsp_cdev;) i# a5 i9 M# G1 ?4 V: x
static struct class *mcbsp_class;
1 ^* z: Q( G# h* y6 ustatic dev_t mcbsp_dev;
* i) T- `3 f; F9 \. z' ounsigned int DRR_data;- b5 ~; ~/ l9 f, h3 H& }% f
unsigned int DXR_data;- r% q# d4 e9 E6 v/ J1 {: J
static int mcbsp_open(struct inode *inode,struct file *file)2 {+ g& J& s+ z5 M! v$ w
{' b: o# c x5 C: a" @ j
: ^! f; H/ s# l8 q. r //interrupt enable,initialized* H9 H: [9 T3 H0 \9 Y! {- f. f
unsigned int temp;
! R( V5 c! t8 x //SLEEP_EN(GPIO8[10])---0 T9 P; r) _/ ~" ~9 q$ n" D0 D0 O
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, h- I+ s ]. {+ S, `! O& r, T
temp=temp&(~0x00000400);
j; M/ z( _6 Y& t' `8 V9 X, Q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 X# F6 f, T7 p; o7 P* F //RESETn(GPIO8[8])----0----1
* i7 u3 N; e8 `4 \& m2 [ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- d, {; H: s2 p3 u1 t temp=temp&(~0x00000100);
% G- x/ u, a, _+ ` __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0: ^8 W! _, d: b- A4 M
udelay(100);
* @) t% e* g, G ? temp=temp| 0x00000100;
9 @, {+ U: I+ H1 t$ z$ U5 H1 _ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
" G. z- K5 F% X. D' o udelay(100);% x( o# q+ k- |+ A- o* T. A; E
printk("open success!\n");7 i+ s& Z) {9 g* ~
return 0;
8 Q1 C" H; T Z# C! m4 u- ?3 r}
5 \4 N* |& M/ d/ N6 l
/ J8 h% }5 n) S d8 Qstatic int mcbsp_release(struct inode *inode,struct file *file)
' B3 P( O# b8 a# Z, a/ ~{# i9 N$ v6 O+ i& x/ c$ h" l
printk("release success!\n");. c! x) b: l2 v2 l4 Z# p3 G i) p! s
return 0;
' e7 M/ H9 c" P1 P& t" Y3 z1 P}- H% `. W2 n: f6 O3 ?
- n1 k- S* G) v9 L- S5 j8 Astatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
* H& R3 T, _& X* {' [4 h7 T{
! f, {& \; P+ l* S" n; C5 R copy_from_user(&DXR_data,buf,len);
6 R2 \3 b0 y- y4 X( |9 `/ r) H iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
: T; {. U \& K; [3 c/ `2 v4 b y return 0;0 R! k2 Z8 [' r! ^$ ^
: x0 }2 S' B* K% F s}
) i/ \: Z$ Y/ J1 S* }2 p Y3 v3 ?& j9 ]+ W5 J
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)6 t+ u% j1 m2 x
{
" o7 q+ i1 y' d# c/ {8 p DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' w3 U; J1 N7 `" H copy_to_user(buf,&DRR_data,len);
" R% E" ~+ e: H3 n+ u u return 0;! z8 z: J6 H% L- E0 W0 j; B# j
}
, o0 p: l0 o9 D: W) a! x
/ S; Y9 M+ @ S- i
, `1 y1 l$ R! P% l( S9 B+ rstatic struct file_operations mcbsp_fops=
2 i C. n) F* ]% ~# U0 F{ W* f9 u. r* p5 {# Y3 r
.owner=THIS_MODULE,
6 e3 @' g5 I& O+ I! C9 q" i .open=mcbsp_open,
2 [) U& ]2 c$ n2 h .release=mcbsp_release,
. `- O A% _, ]2 z4 o* D, ?/ d: a .write=mcbsp_write,/ }9 j$ H1 w3 r! F9 ?5 s
.read=mcbsp_read,
8 n4 K/ Z0 `, y& ?, }};
- I. Y) r! k3 W( m1 H1 y4 |static int __init MCBSP_init(void)
. c h, l8 n1 N- A$ x{7 T" i4 p3 o: {1 u* b4 z( i
int ret;
5 v6 ^5 a/ w/ w- b unsigned int PINMUX1_REG_old;
* ~' l/ ?! p7 W, t unsigned int PINMUX18_REG_old;
& y9 B2 F: t7 q1 W( Z unsigned int PINMUX19_REG_old;
0 {$ @3 f3 y1 h unsigned int temp;
$ Z: n0 E0 h' c, N' [# v9 ~ if(MCBSP_MAJOR): r) B& ?: d- ]
{: D- U9 K3 u1 _- b# G. W
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);! v# O( A) `/ n. N; r: U
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME); V0 w. `% q) }1 i1 r& E" i3 C
}
; }. \. Q& C. m1 B$ g8 H# E else. S& N9 @+ n! _7 V) J/ e( a# `: j
{5 v: J) G1 |4 ?) U
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
* t* n) w" s) X6 H# q MCBSP_MAJOR=MAJOR(mcbsp_dev);6 b4 X* ?, G0 z6 Q/ d
}% u( ^+ k, E6 h) t1 w9 ]
( V4 Y. r: x; |1 u if(ret<0) ?) V" t7 D' i: l. s1 T
{' y' i G% L+ L8 \3 }4 _5 P
printk(KERN_ERR "register chrdev fail!");
# d* y( @; j# K return -1;
4 _1 ? ^" J: D8 ]: n' D4 Z }
- d3 a) ]1 @; f" C' r3 }4 A
. B3 U+ Y1 i3 H% B mcbsp_cdev=cdev_alloc();
9 v+ ~# z6 w ]! F
+ h1 x3 ~0 O0 J- F$ ] if(mcbsp_cdev!=NULL)" [+ R. O; i8 O+ s
{2 }8 ]/ c. M% P) }/ J
cdev_init(mcbsp_cdev,&mcbsp_fops);
$ E3 k- }3 G/ {- p$ p9 V mcbsp_cdev->ops=&mcbsp_fops;
: J7 H8 M9 d. j9 t! `7 {4 v mcbsp_cdev->owner=THIS_MODULE;% K7 |, e) d8 I% l8 K; C
1 H' u. y; A6 s% W if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
k% f$ \; a& p2 V6 Q printk(KERN_ERR "register cdev fail!");
0 y* H% G3 N6 H1 \ else
' p; \. L3 `6 g4 @& U3 N' n7 J. N printk(KERN_ERR "register success!\n");& _6 W' X' c* R
}
/ k, o6 ?, Q# Y, T# u7 r8 l else
: E. ]8 k9 L9 K. l6 m/ O: r5 P+ F; R {$ x4 ?( ?( @" L F
printk(KERN_ERR "register cdev err!");
/ f- ]( D( O7 k$ }+ b. s return -1;6 b+ q2 s1 Q: i7 R& f% @" T
}
% `3 U1 J' B2 S" s! s
) \ K' V% [6 D- Y9 c9 l mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* _" R. v& I, X
if(IS_ERR(mcbsp_class))
' r9 @8 u7 S2 C% b {+ W! H7 u& L2 ~( N
printk(KERN_ERR "register class err!");
# g& |1 W% f: p1 J return -1;
' N. `5 \. g. M7 {' Y7 i }& u2 ^; c- n; ]6 ]" P1 H
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 P( a/ \ t3 ^
# a2 A& h6 [& ]/ E' x
//PSC# z* x4 _" G, D/ K& l& j/ F% b
//add Enable MCBSP& Q& W1 q$ [6 `, w# P5 \
//test2 z R$ ~7 f2 D/ p6 x
temp = 0x80000003;/ v5 b) X! G' A
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
8 G0 Z9 D3 [9 h0 W1 |+ L temp = 0x00000003;
( M7 T6 K; D- U# r0 x: P writel(temp, IO_ADDRESS(PTCMD_ADDR));
" y z: h/ A3 t ) m$ Y, s% \4 U' W
temp = 0x001FF201;
: v+ U& s& N" B. H8 r writel(temp, IO_ADDRESS(PDCTL1_ADDR));7 o. U2 R! E8 P% Y7 a+ l5 e1 Z
/ V' D6 k5 z5 t( |9 f
//PINMUX
& g( a0 x/ T7 w8 q //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- i6 W: r: p; i/ G: Q PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ P5 }2 W$ ~9 m+ @6 n PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ' B. c0 Z; q/ O# @) q) o2 d' j
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);. B3 r- R9 m. u% D
1 }! G: Z$ v' i: r
//SLEEP_EN,EPR,L138_SHK1,L138_RC7 q5 q7 i. E! ~7 {! ]4 U! w/ |
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); , Z J! Y+ K8 F1 f( f7 R' S ]
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
' b! ~2 j, H# e J& ?. @+ O8 _ writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
D% W) I, @, w; h+ h; \
$ s1 Q0 ^# Q, G2 K6 ]/ g- I //RESETn,L138_SHK2
/ w4 t' u; P3 P' Y9 } PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 a+ T2 V6 r- Y9 |; n3 I+ z PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; $ [; D. w8 R. {# s6 U+ D
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- R; ?2 q! P9 w9 ?7 o5 p& S. e5 m! `
+ P- @+ Y4 O& I3 Q6 ]* b0 ^9 d - l, ? Y- }' j( x I
//SPCR Register
& t( M2 ~/ K. Q; J$ j //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) k% @; L& y" Y4 l
temp = 0x03000000;//(DLB=0)! I; W; ^- ~& a! A2 i$ V( r
// temp = 0x03008000;//(DLB=1)
; K# F% A9 x! f, S writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset/ Y' c. @! U, c" N& z# H
temp = readl(IO_ADDRESS(SPCR_ADDR));
9 ], [. B. p! ?# i: o- \+ }1 n8 _ printk("temp=%x\n",temp);- E2 a9 y: ?8 Y3 |( ?& j
; A1 [( O* a8 k: h U W
//PCR Register+ `! Z4 H! ^/ q# r
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% _5 ^/ Q0 W) C! k- i, z, k // temp = 0x00000F0F;7 Q2 W+ H; h3 q3 V7 p- ~
temp = 0x00000B0F;
; t/ l- j. g5 e& ~, h& W writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
. \: _5 f5 Y0 x) ^, c9 d$ C& P temp = readl(IO_ADDRESS(PCR_ADDR));! G$ B" N# R* v- R# \/ D% q
printk("temp=%x\n",temp); + t& ^8 E2 f! e% |
//SRGR Register
; m8 M, C, I u) B1 K //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==110 O' f) K1 r- r3 }
//temp = 0x301F000B;: A1 ]/ R* W3 d. H
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized % |* u9 v" e5 l; j2 j! A$ P
temp = readl(IO_ADDRESS(SRGR_ADDR));- W& B% B- P. [; {, t
printk("temp=%x\n",temp);( u; `( @2 V) L9 z: e [
//RCR% R5 E) I) G! v* |: a. F- W' E
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ k; s o3 [8 M$ A; N2 m
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; U S0 R7 F9 ]. R
temp = 0x00440040;
9 ?* h" t2 E9 U( `0 x9 m writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
# f- _# q4 R' x" L) r temp = readl(IO_ADDRESS(RCR_ADDR));
, G. f4 E( F: l! `' ]5 U printk("temp=%x\n",temp);
+ N& |5 h+ G* E8 ]6 r; @ //XCR
& h* s u6 c- U/ ]1 Z7 i //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 ^1 J. }3 V- F
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
7 i7 l0 m5 P) I7 L7 m, E3 a5 ~ temp = 0x00440040;: k+ X% O% [* C# l" M. U& K, B
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
# }, d+ ^ W; @+ g temp = readl(IO_ADDRESS(XCR_ADDR));
' ]8 j& L3 J% O& W7 t0 r printk("temp=%x\n",temp);9 J! \* |) i! \- {9 S
udelay(100);' p% z4 \3 W3 V, Z I+ T
//SPCR Register
( h( Q# P) ?0 k( v, s //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ z4 w$ a. @% d2 k9 T& W. G) K temp = 0x03C10001; //DLB = 0 VS DLB = 1 Y% r! O) P4 q! u. Z$ {4 x
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled l* a0 y" C4 r7 W
temp = readl(IO_ADDRESS(SPCR_ADDR));: I% e5 b' _8 s; V. l
printk("temp=%x\n",temp);
/ s4 B2 A) z% ~: Q3 m udelay(100);
+ }( d3 G/ F4 g7 O6 K9 f
+ S/ s2 @( r; u6 ]7 p1 _ //set GPIO direction
% J. o _. l% n3 p8 Y+ H* A" ~ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 O* f2 \0 I1 N1 K) l temp = temp | 0x00000100;//EPR----input
2 _/ P ?$ f4 U temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output3 t+ K; r! }' P1 z! e
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); G; O R- \7 A; }
( K1 }+ B/ L" N0 i5 C8 J6 x
return 0;
0 H4 R! v, H9 G}
. f6 C, A- N+ P% x; c) `0 Qstatic void __exit MCBSP_exit(void). i: ]2 C- I/ P% C
{) K: \) [" s% v* A' W
printk("mcbsp chrdev exit!\n");
2 f! q1 i! K4 r cdev_del(mcbsp_cdev);9 b; E: T6 L5 Q0 H
unregister_chrdev_region(mcbsp_dev,count);; k# O5 I- W5 l9 ]2 o- Z5 P
device_destroy(mcbsp_class,mcbsp_dev);
0 w/ s$ f v3 ^ class_destroy(mcbsp_class);& S$ B) i2 y5 `; ~6 Q1 l0 ~$ H
}
$ V' P7 w( m" d' J+ \" {8 _module_init(MCBSP_init);
* B$ g% m9 T' j) M; k9 imodule_exit(MCBSP_exit);- @5 E4 o& c# M; D: y
6 i! S( v7 r! F
MODULE_LICENSE("GPL");4 A5 T- P. Y- K+ T4 F5 l+ K
7 e3 r+ i7 A& L* G' z6 V我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* ~* Q5 J M- c) |, m
我的应用层的测试程序如下' V$ Q+ O( e8 S( ~% l- R& h
#include <stdio.h>) C) D. x/ X$ B7 g3 c. x0 P
#include <string.h>+ }. S e4 _4 c4 j
#include <fcntl.h>" w& {, K% u' A& g4 b' J6 k
#include <unistd.h>1 x5 ?$ y! Z- V3 o
#include <signal.h>% v. @9 y" R6 v5 r1 E* @& H! n: v
#include <pthread.h> //线程
; ^% G I6 O. T" `1 j; K#include <stdlib.h>( ? f* q$ N7 i8 s, [
#include <pcap.h> //捕获网口数据- N+ I! }; g' H% T; P& g
#include <semaphore.h> //信号
2 `/ S, ~6 ?6 r4 P#include <sys/types.h> //消息对列
6 f* l5 u, `# s: h& i#include <sys/ipc.h> //消息队列( U% u+ t" Y6 M! x
#include <sys/msg.h> //消息队列( {" ^, G, O7 S3 w
#include <sys/select.h>
% F2 ?: L% ^3 Z1 Y! W/ d2 o0 J0 C#include <sys/syscall.h>
3 M* R+ K7 u" u; L( D7 V6 C8 o#include <sys/stat.h>" l$ U( `: ^- w& }' i
#include <sys/mman.h>
7 @( Y" W, i: X) }' ?#define msleep(x) usleep(1000*x)/ \& b5 s3 t5 E, _7 s
9 W$ J3 O. p; {% n; x! N
int main()
& H) i2 K6 E! r% f$ G{ 2 u9 N* U/ G- x1 @% |/ f- Q2 J
//MCBSP,ARM与AMBE2000交互设备9 D! \; }3 Y" t
int fd;
" h- d2 j0 b! p unsigned short data_write = 0x5555;( B9 P6 h- I( v3 m
unsigned short data_read = 0x00;
$ U. S% F! N2 M7 ^4 s fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 V* P0 R1 v+ ^: p // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);8 m: Q2 l) T) G2 C/ K w; B( f2 Z9 N
R$ A/ H( J9 g if(fd < 0)3 g5 i( m. i/ a/ T0 y c
{
% U7 N/ G) B) i8 s perror("open failed\n"); e7 z( v ~) b" g8 ]( d
return -1;6 W5 V# ?6 ^8 w# U: q
}2 t7 s/ j# Q, i0 r& _
+ P- L! ~+ d* e( { while(1)
) _( f( U: Q1 p; t- i, i {
6 Y7 d# {1 ^* _1 `. _
' C) |% k: ]3 M6 L. b% J //AMBE2000每次读写是24个字为一帧
3 h' j5 f8 ]& S o6 W //写数据时将数据在底层存储起来,等到中断的时候再发送
5 p+ T+ c' U4 A' l3 k0 P //AMBE2000输入数据是以0x13EC开头的: e- @. w! f2 H! e/ {/ R7 Z
write(fd,&data_write,sizeof(unsigned short));
. ^, g, N d: z" k
; X. I# S0 H5 ~ //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
7 U8 _% T1 w' f% i read(fd,&data_read,sizeof(unsigned short));
D4 w& e; `) a) }7 V' D: ? 4 P7 I7 H& k, X% ?7 k
if(data_read == 0x13Ec)/ Y$ F; y) T3 P8 Q' K% U: P; U
{
2 R/ G6 f- a2 O% s' Z4 v
v: m {& q7 R( q printf("data_read = %x\n",data_read);! @8 f% G4 L- W
}
@6 j* H: N8 E8 k " R! u: J# i: H* g( M
msleep(10);
/ O$ r8 i" u. P _
9 X8 Y9 u7 C/ U! \ /*
6 E5 f1 S; U4 k" `& T {0 `" U8 P ioctl(fd,1); ) N4 I4 q/ o P+ x5 [$ r1 q6 l2 _2 ?
sleep(1);& `7 `4 j: I6 \1 p, [6 y5 `
ioctl(fd,0);
0 G' a3 K% R- ~2 p1 R5 z sleep(1);
; s+ g7 C/ C6 Z8 a */
% J9 N# @ r0 a7 ?3 k) r } % W. t3 O, e, F8 S. S
return 0;( Q# d2 O4 E( W( q
* D1 t. k$ E. ?/ ?4 u
}, b4 O* N0 e" m# x& V$ p
9 ^' n% W* |, W/ Q8 [4 n) k
多谢各位指教,谢谢! 急
# r# ^; U4 D' L2 B' Y4 ~2 v7 @" |/ F* B* `- _
) \5 ?% A; f% ]$ S! X; \3 ]) M- u
" q, m+ G: A! _) }/ ]0 M: }; ?6 r9 S* N" l: E* _1 f$ H
6 [/ ~& t, p* }+ _7 n
|
|