|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) x. c; T$ G2 `/ p9 B$ {/*4 j l4 Q! M5 m
* Copyright (C) 2009 Texas Instruments Inc X! E7 p; r, j9 U+ ^! d" f
*
7 P4 K+ O- G% S' ^ * This program is free software; you can redistribute it and/or modify9 T: H' t; @1 r- B/ X5 ]7 g
* it under the terms of the GNU General Public License as published by
' N4 ` ~5 G6 J. x4 X) F * the Free Software Foundation; either version 2 of the License, or! |1 V4 P* S. [; X; X* S- b
* (at your option)any later version. B7 _+ e/ V. x4 ~* o8 E" r
*+ D" F+ I& u/ @* C4 [( ]% j
* This program is distributed in the hope that it will be useful,7 M( [2 p$ ~# P- w
* but WITHOUT ANY WARRANTY; without even the implied warranty of# n7 }7 f5 b2 B2 D
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
. k5 e2 G2 g1 _6 v( _ W * GNU General Public License for more details.$ d8 J) m ]+ e
*% w' J8 E: B2 k1 ]( X3 I! t
* You should have received a copy of the GNU General Public License% P. s ?$ q- `2 G- J9 K& K
* along with this program; if not, write to the Free Software4 W4 I1 \6 v# B W
* Foundati
# l; v0 Q C. Y! s! ?4 Y+ i% A*/
0 @9 g: z7 `. E2 U7 W3 M4 f#include <linux/module.h>
4 @7 q% H3 [, C& n#include <linux/init.h>% S4 C8 P q/ j0 T' S
#include <linux/errno.h>; {( \: [. q' ]5 m6 e" L
#include <linux/types.h>: U/ f0 V+ Z! x% P
#include <linux/interrupt.h>
+ ?4 Q0 q6 F: E3 c' F" q& V#include <linux/io.h>" i) r5 u+ a) \) h6 h/ r
#include <linux/sysctl.h>: [' v. T. E# V4 w' K. ^- k( ]
#include <linux/mm.h>
* u: g: Z2 G2 U- U; p% W* }+ j#include <linux/delay.h>
7 G7 l, J# e) Q2 r. L0 W$ c#include<linux/kernel.h>
% R3 L+ F6 T$ u1 M' t4 I4 c#include<linux/fs.h>
& v: |! F% F0 ~! O1 D3 t#include<linux/ioctl.h>! ~* e! b0 ^- L6 k) r
#include<linux/cdev.h>
. s5 G2 z* h5 k#include<linux/kdev_t.h> ?4 ?! ?6 ^# I5 R6 E) @
#include<linux/gpio.h>
& i9 K7 X9 w/ p$ @' p#include <mach/hardware.h>/ M) X/ P9 P/ o- z9 b" G
#include <mach/irqs.h>. \" p# [3 D1 ~& U6 x2 G
( T6 w% ~' i4 ?' o. ^#include <asm/mach-types.h> G+ k+ v. J1 W( D& G
#include <asm/mach/arch.h>& J( D ?& h6 g7 G
#include <mach/da8xx.h>! S* Y5 ]( }8 D/ Q: g1 K5 C$ ]+ B
#define SYSCFG_BASE 0x01c14000
Y' V7 Y7 U; x& n#define PINMUX1_OFFSET 0x124
) x/ ?$ G3 ?( l0 v# {% V( }. }#define PINMUX18_OFFSET 0x168 5 i5 H+ E5 E, x$ F- {5 A$ m& f
#define PINMUX19_OFFSET 0x16c- b8 q! J' o! Z, [! `& W4 b
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
3 ~& e; ^) S- c#define RCR_ADDR 0x01D1100C //MCBSP1_RCR2 J) j( M/ b, K
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR' e/ T: Z$ h: o& L
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR" p8 w5 ~3 F: Z* X s) A" h
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR: N1 Q" w% B" V4 B7 g
' n+ v) w3 x1 F* {9 i3 ^1 I#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
3 f) H& @, U) X) y; a#define DRR_ADDR 0x01D11000 //MCBSP1_DRR, h* `1 I7 @0 I5 a. u. W) t
//PSC
0 Y/ p+ ^/ c6 ]& G0 D* x#define PTCMD_ADDR 0x01E27120
* ~# ]3 @, _" j#define MDCTL15_ADDR 0x01E27A3C
8 |0 ~3 F. P( c( p#define PDCTL1_ADDR 0x01E27304
* U) o, u+ j. T0 x+ _//GPIO8 direction" F( a, C8 K& z" f+ H; u7 b. j
#define GPIO8_DIRECT 0x01E260B0
' f' n' t, i1 c, g- _#define GPIO8_OUT 0x01E260B48 h+ {9 |9 Z# h! P. M
#define GPIO8_IN 0x01E260C0
0 R+ O# v4 [5 J* v1 x, `) E- @& M4 a$ k* T4 [0 W- I4 W
//#define MCBSP1_RINT 99
2 J1 V3 f& }" }, k4 u9 o H. z//#define MCBSP1_XINT 100
* I1 g" g2 }) H/ h; ^static int MCBSP_MAJOR=239;
) I& I% b5 X7 u4 |static int MCBSP_MINOR=0;
* Z6 u) W" `% e7 x4 Hstatic int count =1;+ u& d+ p# [2 N: {
5 ~% v9 y4 ]- x#define MCBSP_NAME "MCBSP-device"
" }# p7 g, ~ N7 T1 B, e
5 g3 a7 g7 J4 C0 P. Ostatic struct cdev *mcbsp_cdev;# C7 P9 B$ }7 F" D
static struct class *mcbsp_class;1 ^8 d8 U& I7 y$ t
static dev_t mcbsp_dev;% ~$ h4 J: }5 N8 \+ c! o- Z/ X
unsigned int DRR_data;# {0 M. @" i7 Q ?
unsigned int DXR_data;
5 B5 A' Y: q2 A4 D- a& fstatic int mcbsp_open(struct inode *inode,struct file *file)
" h+ `7 q& C, \ a{
4 v8 z/ R- T B* w9 c7 \% ?
1 M# e1 K6 V/ q+ R3 |* \, ] //interrupt enable,initialized
3 I+ V( y* F; f* e5 g/ P0 W7 U unsigned int temp;( K7 z! |( r, h
//SLEEP_EN(GPIO8[10])---0: {) r9 z5 C* D: u3 k" ^& f
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- R' Y7 k) k( w0 `6 \% K0 a temp=temp&(~0x00000400);
3 e, ~ I* B: K1 p, N1 [8 B- o6 y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
2 z5 F6 l, N' K //RESETn(GPIO8[8])----0----17 {; d1 p. l# u- y D1 e4 Z' F
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ l4 `+ v7 w# B9 I# J) p( h temp=temp&(~0x00000100);; u ~4 u2 @. H# a: k7 d$ L
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---09 u9 B0 O4 S" \' K7 ^6 Q
udelay(100);5 z. s, z+ p3 ~
temp=temp| 0x00000100;7 G- K; @! m# | D9 t; }
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---16 a. K2 ~/ K) k V5 `9 t( X5 Z
udelay(100); _8 E/ l1 S3 T) u' {2 q
printk("open success!\n");
$ g ~0 l D- F3 x7 y return 0;, Q! H5 O* c7 ?0 v" R* h4 ^! G
}
2 q/ T2 C2 w( ?" w; S
( A! ?7 g( o+ |- ostatic int mcbsp_release(struct inode *inode,struct file *file)
. t9 R3 }% p" o; k$ ?3 N8 i$ i{! O; l% ]$ k' G( ]
printk("release success!\n");6 B- X' j2 Y( s) Z7 T1 k' ?
return 0;- T9 A, y0 o! }' @: ?9 b. e
}6 @ `2 A/ e: U. }9 y$ ?8 }
! ~9 h O* S" a1 istatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)+ _8 u! M5 z2 C/ a; r- s
{9 P5 T, A) V. X% L( }
copy_from_user(&DXR_data,buf,len);2 y, V3 ^2 B. ~8 L6 Q) w' O
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
6 w9 g, Q8 W! V3 t! L+ V return 0;
. e& _( F1 `# d& H% `) \3 C % V, C" P9 \, t
}: [: K# q9 H3 J$ G
! J5 p5 j( J: F7 B% \' ]; Q
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
3 w4 {4 k( Q: Z( G( E2 v{
! R k' ~+ n) T- u1 _ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ U4 D4 r2 V: p0 x) b1 |9 v
copy_to_user(buf,&DRR_data,len);
: C( V* C3 c {* Z& z% }0 ` return 0;
& P4 f3 F* U/ w- q7 S( A}9 `. _ P+ [* i7 U+ l6 ~
+ F5 d5 A3 M# |7 m, ~, p
8 n8 V: a7 L' C' W' i1 mstatic struct file_operations mcbsp_fops=, R2 H# d" ~. j
{
8 L; m# Y4 U* o. \7 \ .owner=THIS_MODULE,
p" }1 \+ H# M9 |8 W .open=mcbsp_open,
9 u1 _4 @4 @ g) D( A. B' F6 h .release=mcbsp_release,. f& L! y: h/ f
.write=mcbsp_write,
0 k- Q0 e p2 N2 ?# M3 B. k3 f .read=mcbsp_read,
( P4 j: F$ P8 [# J3 I" T};: E! z4 I4 A0 Z! m3 B) N" Q
static int __init MCBSP_init(void)% p& X7 _: ~; H5 a& B$ O, Z
{0 ~! f& a3 Z# v) {+ K$ {0 j5 u
int ret;
# n$ ]6 z/ t& @4 R. x; I7 e8 z unsigned int PINMUX1_REG_old;
) B/ R- Z9 [4 N8 z, Y2 K unsigned int PINMUX18_REG_old;
r1 w* r6 p8 j {8 ^5 M unsigned int PINMUX19_REG_old;- [: n0 ]: |4 [9 }
unsigned int temp; # r4 B \& S; U
if(MCBSP_MAJOR)
2 [# }* S+ E, y3 T {2 p$ a6 {" M6 }5 ~ S% G6 N
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 \3 M d; C" y# x3 S ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 k' X# P" @3 r% W
}# t' A2 r5 |; F9 A |! l
else, R4 q4 \5 R, _" c3 B: N7 y
{' i) [' m" M. d5 F7 O$ _
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
6 T1 n6 w" ^+ F9 t- G MCBSP_MAJOR=MAJOR(mcbsp_dev);
2 i; ?& d9 Q, S: M+ H: _6 [ }
6 f! o+ [3 M* U( Y) Z' |) d
8 c* ~7 [: V% a* E if(ret<0)( \, Z1 ~8 f) K4 [
{
& H0 l; f; J6 Y [) l6 W& a printk(KERN_ERR "register chrdev fail!");
) v" `, `# H* B( Z return -1;
/ | _& f$ S% v$ p0 } }
3 `. F% b& m6 n3 G
2 b3 U( Z9 A$ B* {! |8 ~1 g* Y mcbsp_cdev=cdev_alloc();
' w) u. m Z' o9 A8 _# V4 g & \( c& T% }1 M4 i* [, V
if(mcbsp_cdev!=NULL)
+ f: Z% Q, _4 {/ G* Y {- M) z, H0 ?' D. A8 l6 `" O
cdev_init(mcbsp_cdev,&mcbsp_fops);1 S3 C) Y8 c; K, c( }. x. R K" w
mcbsp_cdev->ops=&mcbsp_fops;" }- c: v" [7 `1 \$ s
mcbsp_cdev->owner=THIS_MODULE;0 b6 Q/ y; Q6 ^# j
* Z, {( v. Y& H
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
l, i" M9 I: i3 u0 b3 U& H printk(KERN_ERR "register cdev fail!");
9 n1 ?1 Q/ v# D' `6 l# S) O+ n else
) [7 g' J' S! T! f printk(KERN_ERR "register success!\n");
, e0 Y0 Y* y I/ X2 k: D3 [ }8 E- T O, v; _6 D! d6 G* m
else$ y5 j/ q* T& F |# t
{8 ]% m. U* _5 C% z; B) |
printk(KERN_ERR "register cdev err!");
# n3 a7 i! J1 I0 k0 J9 Q" } return -1;+ a6 U" s/ W- \0 W6 R
}
6 h7 D8 F+ f( [( a a* v+ E! @ 8 R# s$ @1 w5 k, n7 Y1 \- l
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);: e/ x: d4 R* c' E
if(IS_ERR(mcbsp_class))( m2 S: p5 m+ Q
{5 w/ [2 I, P- u6 t
printk(KERN_ERR "register class err!");
9 `6 X- i E5 U4 u0 p$ O7 l2 \; Q8 Y return -1;% B1 B0 V- t, R0 w; y |+ t. f
}6 {6 H- M# @" s5 h
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);+ V0 ?. p6 S3 ^5 Q( `0 [/ y; ^
0 i# @! O3 [# t" l //PSC
6 s# D5 c" l- E //add Enable MCBSP) B8 I/ Y7 Z' d
//test
4 O1 d/ p! P8 n7 k Y! f temp = 0x80000003;$ C2 g# A* y; {( J; }2 R0 p
writel(temp, IO_ADDRESS(MDCTL15_ADDR));$ y+ p3 S9 p& ^+ F+ x
temp = 0x00000003;
" u! b4 m7 m+ `; A" F- I/ P writel(temp, IO_ADDRESS(PTCMD_ADDR));$ n$ `& R2 t% o: G4 }6 {; O+ F0 K
9 X1 z& Y. f& K, u2 W
temp = 0x001FF201;' Z6 T+ B; N- V, N
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# W4 } `) j+ J! r. E4 a l
( K1 t% I4 m% E. }- W4 u //PINMUX
0 ~8 ]. P' o2 q) w //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,# D* }8 r/ N( T
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 1 T* Z( V2 ^# Y- ]: l$ c4 v
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
; N* {+ j7 C2 }, O6 a writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);% C/ l. J. ?- i
: _6 v, W% U) X5 b8 \7 U" T. v1 l
//SLEEP_EN,EPR,L138_SHK1,L138_RC
: L+ [5 l6 r* w, g/ N PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); , a9 @) A9 e& ~' |* V4 \3 y6 i' \" o
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; Y: D# @2 N' k$ Q" d
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);& W( @+ L: J) J% H" m& z: I3 o
+ b) R* x- {( p# f/ T //RESETn,L138_SHK2
4 G7 Y+ ` h4 j! T+ `6 H1 y6 Z PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 3 y: f* M: c7 _( [
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
4 L7 r' d# G( A( x writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 H+ v8 B9 ?8 b7 q% ?* Y4 ]/ l
8 h2 {+ w. n( t& x& Y2 q& l% r
8 ] W) p( L- | //SPCR Register
0 [5 n6 l6 }5 R5 Q //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset3 u5 C6 | v" z
temp = 0x03000000;//(DLB=0)$ M1 q* [; V+ ~; d
// temp = 0x03008000;//(DLB=1); ?5 H& k- l" D! Y" O3 c) C
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
- e* K0 L7 c0 L$ r temp = readl(IO_ADDRESS(SPCR_ADDR));% R9 r/ a% R0 W' S d$ a
printk("temp=%x\n",temp);
7 X6 j8 j% f- I2 x. k5 t
) J2 i. E, a5 [5 T6 P //PCR Register
% {3 ~2 K* E1 z$ A0 y; z" f //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( a" Q& p2 u/ y9 x9 g9 u // temp = 0x00000F0F;; L& E8 p. L2 S1 R
temp = 0x00000B0F;
# s1 x& ]6 e) u) e& H8 Q- P# r writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
! f: R; }6 _" ~; g# J temp = readl(IO_ADDRESS(PCR_ADDR));8 ]7 b+ ~: E! y6 O6 V0 L
printk("temp=%x\n",temp); . E; c9 }. T/ S# J1 k1 y% z
//SRGR Register
( h) x7 e4 j' O. O$ b6 d& E% [ //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
+ C# z7 {) L4 f5 [! g //temp = 0x301F000B;
1 [' T6 p p7 x1 Z5 d* m- r! g writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized # M( {7 E, G6 ? x+ s( M
temp = readl(IO_ADDRESS(SRGR_ADDR));
8 r/ ?7 O9 H$ N2 E, ~" b8 _" g! Y printk("temp=%x\n",temp);" C/ \( W/ y' u) q
//RCR
$ i% |4 V* a4 r1 m' T //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,) @2 @; B' k8 K" k
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
7 q2 |- L( _& L: @. e' H, N temp = 0x00440040;
- H3 }# e: Z% U) o7 Q6 ]8 z writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized - U3 c- k' W: b- [: a/ _* G
temp = readl(IO_ADDRESS(RCR_ADDR));; J8 l% V2 v ~- x' c- D% r
printk("temp=%x\n",temp);" Z5 a/ h& _; c. q f
//XCR5 U; z. f$ ?$ z6 F+ Z
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
' T( }' T- Z5 O* `7 l //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) O" m9 B. |* Y8 l: z* I
temp = 0x00440040;
3 E2 j" z- E7 r* V* N writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized . R( d: b& A; x4 X e) g$ a
temp = readl(IO_ADDRESS(XCR_ADDR));
- L7 e# W% \9 Z; ~1 \; ~- X+ o+ { printk("temp=%x\n",temp);; D! D( C. U$ q
udelay(100);
( C7 g5 l; u4 r0 |5 {+ J; p8 q. m" t //SPCR Register/ Z3 B* `/ p5 D. r6 ]. P8 U
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
* n- y; J2 ~6 O0 r* C% t temp = 0x03C10001; //DLB = 0 VS DLB = 1
( B. T" L- x$ ^' |2 g" K writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled [. C: b- J* Y3 g$ k) ?
temp = readl(IO_ADDRESS(SPCR_ADDR));' ?* R, E; P, b; H& |
printk("temp=%x\n",temp);2 g7 Z- O3 @1 m' |6 @
udelay(100);
. o) c# |8 {9 g( c" [; E5 N1 M+ s, ~; o t8 I# D+ G
//set GPIO direction
9 n! |! {4 w0 Y c4 m temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 h# P1 A; x, M temp = temp | 0x00000100;//EPR----input
7 Z, Y5 k+ R5 k4 t temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output: {9 f2 `0 P$ B0 I% m. P6 O
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); , |$ g% R# W3 r s2 k8 H" Y
# j z4 x- n6 @" {* s) `
return 0;
, b3 Y" I# r* h: C. `}
3 t7 I: Y/ l3 w8 Sstatic void __exit MCBSP_exit(void)' M- k* `" J7 d+ p" r9 C" d
{5 d- y& c$ w' s2 S/ C+ M) ?: @9 P
printk("mcbsp chrdev exit!\n");
0 I1 Y! q/ S4 P; n" p$ o* w0 Q cdev_del(mcbsp_cdev);
$ z9 z/ u$ J& G2 L F% j unregister_chrdev_region(mcbsp_dev,count);
" A6 |. g% F# _7 v* t device_destroy(mcbsp_class,mcbsp_dev); V1 | z1 x4 `" U) E
class_destroy(mcbsp_class);
! g F7 h3 x, f, x" h. o}: Q U3 ]1 \, ], Q. r k2 K( u
module_init(MCBSP_init);7 z* M" p8 m* N. |7 l) i4 s2 u1 a
module_exit(MCBSP_exit);1 r6 }. x# }- V% |" Z
7 g' q% o g# s+ O
MODULE_LICENSE("GPL");
- T" k) M7 r1 i2 Q. q. m% B c u: i) P- H1 h4 Y6 V( r- M: V
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ h- `3 _0 P8 D' }
我的应用层的测试程序如下+ a! h4 @0 x9 V5 F! v
#include <stdio.h>
" C+ G3 I0 o3 L# x; k2 t#include <string.h>
4 s5 ^$ A& I9 j4 R8 m#include <fcntl.h>: e9 ~5 d: M" V/ ?$ D/ [
#include <unistd.h>) R' w6 V$ j3 }, X) F5 x/ U( ^
#include <signal.h># L. V* \/ J0 X5 @9 _! u( U) b6 P# B
#include <pthread.h> //线程
$ g0 J, K; z& ?6 c( W% V6 D" L6 i#include <stdlib.h>
- J2 f% ]4 d C#include <pcap.h> //捕获网口数据
' L3 S( v, } a; c; @#include <semaphore.h> //信号* e) [1 W* \4 ?' H, e) @* d3 W/ U
#include <sys/types.h> //消息对列
" z4 V* ~! R- i$ @0 L#include <sys/ipc.h> //消息队列! q w% N; X$ X# j+ a
#include <sys/msg.h> //消息队列' {, [: A r( ?0 R- Y
#include <sys/select.h>
# Z/ m6 I( T( u#include <sys/syscall.h>
% ?9 k6 X5 b1 g: b& b3 }#include <sys/stat.h>
" d* N# p4 X e" n! X#include <sys/mman.h>. P; I6 e* _ v' Q$ T& b5 l# |
#define msleep(x) usleep(1000*x)
/ Q. i% C2 N3 p3 {+ y6 X: z6 U B- X9 ^) O
int main()1 }! W! x1 ~) x
{
; N# z+ R% i9 A5 t' W$ `' _ //MCBSP,ARM与AMBE2000交互设备4 p# N; s n7 r+ v
int fd;! H$ _" c# f5 g$ V3 e; q: K
unsigned short data_write = 0x5555;
9 C' s. ?! J2 D; o$ q: A1 u Q1 Y' Z unsigned short data_read = 0x00;
, L) R2 h4 A& ^1 B9 f fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: @# E1 z& K" ^2 R d
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ x D: _7 J1 ?+ G* E, l& k
$ T- f$ Y7 q5 V# N) M; r
if(fd < 0)
0 F4 T# z" Q8 K3 A( l. i% k& ` {
Q, a' k( Y; g& t: @ perror("open failed\n");
% L" T I1 f/ V* v* ^ return -1;
* N/ z) y/ ]8 u) @ }
7 F4 Q! m# z* B& ?7 l4 x9 o
: b" Y3 w5 q, w, {* a while(1)! Y; r% l+ e' g ^: z8 a% V
{* G2 ?- a Y( Y4 j# X
& p: X2 W! \/ `. u& ~' a //AMBE2000每次读写是24个字为一帧
+ k: H; q; {5 \# `) W5 I# A$ U //写数据时将数据在底层存储起来,等到中断的时候再发送2 ]& G; z$ M& ?# m [. G M
//AMBE2000输入数据是以0x13EC开头的
8 s# v4 m. D u write(fd,&data_write,sizeof(unsigned short));4 A- T) |: Y* ` x! _' X
; H" t1 A% s& O7 j& B5 U //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
( P" t$ D$ { T7 S/ i( l read(fd,&data_read,sizeof(unsigned short));( k8 m1 k) c9 ~5 j! F. [
8 d) l2 @' O8 Z+ O8 d5 ]
if(data_read == 0x13Ec)
3 I: ^( b3 n- ?( [ {4 E. z2 L/ y1 G; G, C. C
. n% {$ f) ?) M3 j. e printf("data_read = %x\n",data_read);
( U2 p% p y' Y2 A) q) S( C }3 }3 b2 e) Y3 G" E; Z2 x1 |8 D
- s% Q% l) I! ]6 H1 }5 S! Z msleep(10);
9 z# j) t* u$ M- G. _# x) C$ n
B2 z5 B/ q# v /*
8 R1 E7 D& ~- Z- G! H ioctl(fd,1);
9 [4 v5 b* Q2 X: D5 C sleep(1);
; b* c0 m- `3 {+ N ioctl(fd,0);
" m1 @/ |$ B% n; i( J sleep(1);* r) M w6 o1 t# R* n% y- l; I
*/ 4 C p3 f9 o# p6 n# @
} 6 i: V; R; R4 g: w$ G
return 0;
! x! V, |& q% c6 `, j9 w
' z/ t" U) z7 ]}4 s; ?1 h# N( q0 L" P
4 Y6 ]0 l( v9 ?; R3 }5 |多谢各位指教,谢谢! 急! F/ `* r; T8 b( \$ _
9 _5 n8 H! J0 x9 d/ x- f4 P9 _ Y" X7 r- O
+ s3 V- J/ D5 Q5 U1 w' P
. N0 y# O1 S- k4 M9 t7 f' U# A0 I6 L; S7 t) f
|
|