|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; K8 z" q& J- h; [
/* U/ p ]' A) @
* Copyright (C) 2009 Texas Instruments Inc _# n4 H: ~! ^
*
& D7 J: {9 |4 r7 ~ * This program is free software; you can redistribute it and/or modify
$ @4 f& Z. I# y0 t2 |- p * it under the terms of the GNU General Public License as published by
5 L" D3 g# z+ X * the Free Software Foundation; either version 2 of the License, or
+ Z* @5 Q$ k; z, f * (at your option)any later version." i1 G5 D; b: G$ n3 t
*
/ k" h* p* f6 q n& \1 a8 D/ c * This program is distributed in the hope that it will be useful,
$ n/ m2 T3 b, ~' X/ J * but WITHOUT ANY WARRANTY; without even the implied warranty of
* h/ v& a. S4 U7 e * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; m" ~! H% Y! w * GNU General Public License for more details.; f: {- w' i- |7 D
*
2 n. v; G; w9 [/ c * You should have received a copy of the GNU General Public License
; \+ l+ C2 c. z * along with this program; if not, write to the Free Software
/ E, W \" \; Y) Y! d/ n; i * Foundati7 c3 Y0 C) o8 Q* F$ k' w, i
*/
3 _- Y% D+ E8 p5 D#include <linux/module.h>
9 P- q( p) ]- V* K! H#include <linux/init.h>
5 a! g& [, Q' l% r% s! M) t#include <linux/errno.h>
- d( u7 M/ |6 o* f#include <linux/types.h>- C8 T# r. z$ Z. w3 m) f
#include <linux/interrupt.h>+ ]% @ x6 F0 ^3 a. k1 T: w1 b B
#include <linux/io.h>, c1 U" R W$ T2 n2 G! x' P
#include <linux/sysctl.h>) X7 a: e5 q! e
#include <linux/mm.h>: J+ o6 p/ _" S! l% f3 n
#include <linux/delay.h>
: M3 {# z8 G8 |#include<linux/kernel.h>
" t) E8 X1 f) m% p0 c#include<linux/fs.h>6 z, H; V% Z. z
#include<linux/ioctl.h>
+ T( ^& @" Q$ M3 \#include<linux/cdev.h>$ t7 J+ b% h& a" F
#include<linux/kdev_t.h>% |/ N" A% i# ?- W' i% }* b
#include<linux/gpio.h>0 f0 r% f# S9 q. Y6 G9 b# ~
#include <mach/hardware.h>
' b$ P6 l y* f2 S' t$ {2 G7 v8 c& `#include <mach/irqs.h>
3 {" u* c9 h5 }% V6 U7 w5 B' j8 z% z& o' D
#include <asm/mach-types.h>, g5 t2 U5 b" E& e3 Y, W& i) c" [
#include <asm/mach/arch.h>
! ]5 ? w$ p& V3 D9 l, h4 P' M#include <mach/da8xx.h>
$ M) Q7 u3 a! a. Z- Q#define SYSCFG_BASE 0x01c140004 x3 k& j1 o, A5 X8 X
#define PINMUX1_OFFSET 0x124 8 m# ?$ y$ c% o) F
#define PINMUX18_OFFSET 0x168 " g X+ ]( z, e& [$ I b5 t
#define PINMUX19_OFFSET 0x16c# `& m' P2 W2 a2 M
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR [+ A' f" F. e: _5 _9 w
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
" X' z) }# Y# l9 s% w* V#define XCR_ADDR 0x01D11010 //MCBSP1_XCR, F& Y) a: o+ d# E5 T8 g* c
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
( l$ f Q' K8 u* |# O' w# L#define PCR_ADDR 0x01D11024 //MCBSP1_PCR4 H! J0 ^2 K; B6 ]
2 e4 {8 _7 J, I/ \: J$ A#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
0 H; x( ~1 m. k& m# t#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
, I4 T5 m/ V+ b. u//PSC* B3 n; f( ?9 B' j
#define PTCMD_ADDR 0x01E27120
. ^0 W2 N6 G4 s( i$ u1 E; z5 K#define MDCTL15_ADDR 0x01E27A3C; {4 @7 |) R+ z x. X7 w
#define PDCTL1_ADDR 0x01E273045 I- w; I, q3 e" g
//GPIO8 direction3 T0 [& U2 j% @) M0 `0 e
#define GPIO8_DIRECT 0x01E260B0% m" j6 n5 O$ v% W: h+ H( B
#define GPIO8_OUT 0x01E260B4
& @! g: g% h# M; R( Z9 \#define GPIO8_IN 0x01E260C07 K* ]1 B5 l9 Z
, q' T4 w0 q5 c3 |8 s3 _2 y//#define MCBSP1_RINT 99
/ z3 }* X* J# i# f//#define MCBSP1_XINT 100 : g* x. |- l8 A/ o. D o
static int MCBSP_MAJOR=239;( Q+ J/ J5 W" X) l3 O
static int MCBSP_MINOR=0;
( {3 a8 z5 c/ F b7 istatic int count =1;' u% S( v. ]/ V; x
( P n2 U) |& B& _ H3 T4 {
#define MCBSP_NAME "MCBSP-device"9 c; f& f+ G8 ^ U) @& x- A, _
! V" v" V2 J; Z+ r. dstatic struct cdev *mcbsp_cdev;. i$ f5 ^: v' C% C
static struct class *mcbsp_class;
' H: Z5 H: z4 l" O# P; F/ Ostatic dev_t mcbsp_dev;' @- x! y" T) Y5 G2 Y' c
unsigned int DRR_data;
& G1 P7 Z) s2 O( j3 hunsigned int DXR_data;
4 @5 c0 t0 O* |! n# ^static int mcbsp_open(struct inode *inode,struct file *file)5 m; m' R( [* k; o5 C
{
4 j) Z9 }; H( P' g& K1 p/ n# T$ P
2 f9 \) H8 b9 ~9 F //interrupt enable,initialized- q) z3 e2 r4 J0 z
unsigned int temp;/ T' D I# c( X+ [# p9 k" W
//SLEEP_EN(GPIO8[10])---0. l# U# C" w5 [) D3 ?
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. Y$ c4 B2 T! |9 ?- c
temp=temp&(~0x00000400);
2 y4 y: V! b% K$ ^ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
8 L# i7 u1 L4 e1 _$ p //RESETn(GPIO8[8])----0----14 C* ]) m7 r( q
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 [; T0 ]# v* U7 `* V6 Y; D* j8 a1 o
temp=temp&(~0x00000100);$ E t n; @" z$ Y# N( v# U
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---00 K3 C F, P5 F# Q' k6 H
udelay(100);
, I' l7 y- `$ d7 S temp=temp| 0x00000100;0 Z R( z* l5 ~3 _- p6 w
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---13 F1 ^; n' H; Q5 i7 _4 C$ M
udelay(100);0 b" j+ A/ z% F
printk("open success!\n");
1 b7 J* S* u; _$ B' r+ U j8 i return 0;4 {1 E% ?) f; a: A! ^5 z# y
}
6 y! `6 X! Q( ]6 \4 P4 l
* D9 G9 B; ?. s! x" L' [static int mcbsp_release(struct inode *inode,struct file *file)/ V5 I3 U, M4 [0 t; \
{
+ w/ p5 a( y$ r! J9 h& u9 ~2 A printk("release success!\n");
; w7 v8 X+ P c5 i return 0;9 Q4 k0 a0 x. O+ r) T
}
- p7 n9 v4 D9 j. \9 z1 E" Q' V# D$ M4 r, q* O, J' G# `
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 G: \7 Z4 c. D! @$ H5 _{
v% ?! r& z9 Z) K7 v copy_from_user(&DXR_data,buf,len);
7 P0 W+ b- n0 F' v" _0 ^: C+ y iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); - C8 h# f% \% _5 l
return 0;
$ n1 \; Z' V/ c1 x( d* i, w* B( ^
6 c5 Y( W ]- {7 g}+ C5 W t4 `0 `0 w' z9 X
$ l) z+ {$ [& q7 j1 u' {, {static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)6 C& o {4 g c# }, L4 h
{ # ~$ V! W$ _, r/ P5 F0 m, ?
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- |5 C9 a M4 n& X+ p copy_to_user(buf,&DRR_data,len);
/ x) t0 Q1 L# H3 B return 0;
3 h j1 Z% H! \/ G# f8 i& }}& j, X9 j, B5 W' s9 A' \. p4 `$ U
$ T$ i2 p4 ^4 b* b( o
7 L( q" i( \, z1 P9 k P" mstatic struct file_operations mcbsp_fops=6 k, n9 B) C! r% u. T
{4 ~- _/ _6 H0 k
.owner=THIS_MODULE,1 I4 E8 c. f) p: O+ _+ b, S
.open=mcbsp_open,
( F3 _, ^) t$ l( P! | .release=mcbsp_release,
4 @6 I8 v$ u( Y3 P! s .write=mcbsp_write,
' V' F, f/ A% }3 B1 s .read=mcbsp_read,
8 p2 j: n$ i& a4 D- j, i6 M z};6 x0 p3 m3 h! |8 \* \4 W
static int __init MCBSP_init(void)
/ Q, s7 |/ N9 h9 E- ~5 `/ I" {{. T6 e& N2 v5 O( t) P P; q- G5 j
int ret;
/ T# {( u$ t: }. k2 h unsigned int PINMUX1_REG_old;8 x; C- _( ^' D& I4 F' z5 E
unsigned int PINMUX18_REG_old;
8 i$ M) c7 x4 f. x- g unsigned int PINMUX19_REG_old;
& D+ R! O* }1 i# L. W unsigned int temp; & H: S; G J- K' M* t5 X
if(MCBSP_MAJOR)0 G0 @$ y' s, d! y" C
{
3 [. b P. m0 L' i. o mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" {1 j, a4 @- C' E6 K& o ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME); w) p* `+ H- d0 j& j! l! z) I
}
1 ~( B8 l5 u7 q! ^( H/ e2 w else
4 J2 I2 X/ G) y' N" {" `8 N {+ \2 T6 j; s1 G3 H/ M" P, b
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME); z2 ]- w) P' G( O
MCBSP_MAJOR=MAJOR(mcbsp_dev);/ ]$ @, P7 I- a: d D0 [
}$ u5 p9 B3 q4 N8 D# Z
. K% [- |1 v6 X+ }* l) ] if(ret<0)1 h' F+ r/ ]! @, E2 l' s% B
{% z* f/ s( P8 |; z6 U# n
printk(KERN_ERR "register chrdev fail!");
0 e+ X9 c$ B) w; @% O2 N return -1;
0 A' f" ^% Y- I }) s, h5 { h i0 ~/ }5 ?/ E' C4 K! l
* Z) u- G6 [$ ]$ ~8 }' g) v8 m% c
mcbsp_cdev=cdev_alloc();4 ~) x* G' z% X8 f0 e* S! s
, [: w9 O6 k6 s0 h, ]& \8 r% t
if(mcbsp_cdev!=NULL)" l, Q5 z# o& i9 L% _! h& {2 L
{
) d u, E; M) M) y; J. w$ \ cdev_init(mcbsp_cdev,&mcbsp_fops);
) Z; ?2 u6 d3 c8 }/ B- x) B mcbsp_cdev->ops=&mcbsp_fops;
7 X5 e; a* Z# E- B: ^. M mcbsp_cdev->owner=THIS_MODULE;
9 U6 Z6 W: k' x" a- ^) b) N
. M, R2 X1 e* E) I& P8 o; v& x if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 e4 P/ j; y- M! Q0 N# @5 d
printk(KERN_ERR "register cdev fail!");
4 G* J9 \* J7 |2 Z3 S( n5 } else
* y% L) V0 }% c! \5 u) B5 H. P printk(KERN_ERR "register success!\n");
D! Z. S' a0 @3 T6 j0 b }
' M% q4 I/ ^7 Z6 U: Y+ V% A else8 g/ [. R) Q% g6 l; E
{6 ?# N' i$ E( E# Y1 C1 I/ ~0 m
printk(KERN_ERR "register cdev err!");" y9 x! [. r ~
return -1;
6 m! u' {( _) G: k6 j- C# H H* x7 u }! s3 v) @: k& S7 [: W# n. C8 z
5 J; Q$ E( \/ r$ ?) y
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);6 d" J, Q- o) L& a B
if(IS_ERR(mcbsp_class))0 U1 x+ h. ] w+ [7 o+ Q) p" d0 g% W" d
{5 `& P: w1 A, E3 F5 M" B H) h+ [
printk(KERN_ERR "register class err!");
7 { B6 E- ^6 A* B8 J- n return -1;
+ J" I8 f1 _! A' U1 [5 {% ? }6 i6 z7 ?9 w( J0 Y; }5 M
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 Q0 g- t z2 k$ @. X& u, |
; B# r5 s2 I, x4 q$ j //PSC) B! Z. n! U3 E( T$ S1 C7 P' y6 K6 K
//add Enable MCBSP# ] D( A% b( ^. a+ g3 g
//test( M1 t! ?, A s, {2 [5 m1 I
temp = 0x80000003;: {- q+ d$ q, C0 _0 e. @4 G
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
: ~) P& f, c* f5 |7 n+ \ temp = 0x00000003;
0 g. F: @; `) r4 @" U( l. t$ w writel(temp, IO_ADDRESS(PTCMD_ADDR));
, ?! Q2 l$ U$ Q9 |4 r, q9 X
; U" u! L1 e9 U& R7 m9 I/ Y temp = 0x001FF201;. S4 E7 r& w" T& P9 I4 p X
writel(temp, IO_ADDRESS(PDCTL1_ADDR));% e- D1 U7 ]% j( M
1 ~5 m+ A- ^. P //PINMUX . O' {& G0 e' H9 w2 I
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,( z! Y& v0 H( i' `0 b) j
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ L3 O% n( o! a' F! h( v3 i PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; % |% y! \( L- n' L4 x; Y' Y
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);6 h3 o2 b" O/ b" X7 M& O/ l+ f
1 O3 y3 @& `$ r2 U. W //SLEEP_EN,EPR,L138_SHK1,L138_RC
2 n' f1 p! G, @1 ~1 W' { PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! m% @5 c" C5 T1 z' l PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 0 X5 r+ P6 U5 l. X
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- [0 H3 f" B) _
' V! f8 x( s3 B0 v //RESETn,L138_SHK2* p. }/ [5 G' ^' O
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ) R- A# P/ [" A' s) P
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; - T3 j/ M4 `0 p' X3 r6 X( @' T% E
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 X0 `8 _7 K% l+ v2 t
. {+ O6 k% R9 M! o
, }. E- b$ q- Q0 b- i f5 o //SPCR Register
$ i2 l2 ]& | O* j //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. b1 R8 ]. t# W. b temp = 0x03000000;//(DLB=0): |/ m c" L4 z$ x( B
// temp = 0x03008000;//(DLB=1)
9 C6 U% M8 h6 U' r/ _* G writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset4 {* y/ ], p5 V4 J
temp = readl(IO_ADDRESS(SPCR_ADDR));
% N' A; A/ n/ r( r! p& ]( P printk("temp=%x\n",temp);
4 U$ ~8 g2 g7 J$ U) ?! K# Z 1 M, l4 V r- _$ B5 t) w+ b! ?
//PCR Register% p2 f+ r- X: F# b& @6 s2 S
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
- U) w$ s+ O% D" Z // temp = 0x00000F0F;
9 c4 Y% m2 C- h0 I4 }1 t temp = 0x00000B0F;
1 s0 x5 M/ x/ s H1 A- d" ]% f' Y writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 8 v# o @' {8 }% Q3 k" j
temp = readl(IO_ADDRESS(PCR_ADDR));% _+ z7 X* W( f7 B
printk("temp=%x\n",temp);
: r' T% j# H2 v! u //SRGR Register
6 N2 j2 z- J, N( D7 @& H0 a //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. C' E. F' d2 k, K _) _ //temp = 0x301F000B;- X1 Q+ d9 l0 r! o! W8 q
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
. ~* Q* X$ p* j! J6 t. f+ I temp = readl(IO_ADDRESS(SRGR_ADDR));5 h3 W3 H2 \ W4 u- e
printk("temp=%x\n",temp);
9 X/ b4 `2 D' C4 D4 v, d# [ //RCR2 c$ f; f: _" N$ L
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( G5 D: u* y( \" ^1 m
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 e; Y0 n/ K3 n/ {6 Q- Q
temp = 0x00440040;9 Y: F4 h: M7 Z
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
8 \- P M- z+ R2 m0 S# r% w0 F temp = readl(IO_ADDRESS(RCR_ADDR));
' G: y0 `6 ^1 y$ ^0 {$ F printk("temp=%x\n",temp);
- S1 u* {; V/ T- n, a& @- b //XCR' N% Z8 m, V2 [/ k
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% Z/ G9 H) i6 Y# f+ K) p* k, ^
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 [+ s* \9 [. k3 o$ J! \ temp = 0x00440040;
' B @$ r1 S: N, Q0 k writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 9 _/ p! s- V4 ~/ i9 j+ J) t3 j7 c
temp = readl(IO_ADDRESS(XCR_ADDR));
" m/ W' q& y! u; w; z1 |: D) U printk("temp=%x\n",temp);
% k/ c h& s/ I$ L6 G. d* H udelay(100);9 U2 x6 q1 k0 D4 y) n5 j3 Q
//SPCR Register
3 h1 J. O% E0 h* K' C8 b0 E8 f //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
) w0 f( u- [' |7 r; P) u! b4 p temp = 0x03C10001; //DLB = 0 VS DLB = 1
& M' Y, y4 N+ } Q4 K writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled( M. P) S' n) |) i( Z' i2 M
temp = readl(IO_ADDRESS(SPCR_ADDR));! Z) M+ _* @9 m" d$ j
printk("temp=%x\n",temp);3 s2 O) n5 f6 `: c: m
udelay(100);, b; V& V) b) W* l6 y; m
! G$ K5 }1 i: R1 a+ ]! c+ S3 \2 V
//set GPIO direction9 m8 u1 p2 x" k1 {& }6 r8 l. I# j3 B; E
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
7 F, U3 ^3 U: \, H7 j temp = temp | 0x00000100;//EPR----input- Q& Y X0 w' _* ^1 {3 q
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
: i; H. V% S* @0 a# O+ {: `& Y __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 1 o$ c# r1 _) a8 p# C
3 ?9 z7 ]9 c- g9 d return 0;3 v2 X8 G C% w6 e; l
}
. O" H2 d2 { x- v A$ Nstatic void __exit MCBSP_exit(void)
. I( s7 U0 \2 }2 j/ M7 ?- U{- x7 e2 u2 X+ y3 L7 o
printk("mcbsp chrdev exit!\n");5 E) t% @- {/ e
cdev_del(mcbsp_cdev);
7 _2 M: [, X; x! F' U unregister_chrdev_region(mcbsp_dev,count);( P* S# }$ B0 R$ C4 m/ z
device_destroy(mcbsp_class,mcbsp_dev);
2 o8 }+ F- J: t+ d6 E class_destroy(mcbsp_class);1 F+ V' M7 v# d7 j
}
+ C" K: M1 c1 Y" [3 y& Pmodule_init(MCBSP_init);4 O% w: V( r8 O( b( f, N: a) O% H4 c- b& V
module_exit(MCBSP_exit);1 {( m* l0 |* `
4 ]3 l7 g( ?& _+ @MODULE_LICENSE("GPL");
9 k! l* a6 Z; A9 v$ G! C- w
" {% G7 Q9 ]7 r; D( i. p" }我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. n; _7 Q5 z' X2 e& S- p q+ I: N. ^我的应用层的测试程序如下) x& c/ Y; G) Y& b7 I
#include <stdio.h>
6 ?4 ?9 C! A! U: t#include <string.h>
- e1 `( u4 n/ x3 t#include <fcntl.h>) d+ I+ D+ ^- Z
#include <unistd.h>' J/ A6 D% n; T& ?& p: D
#include <signal.h>2 g, K% C" {: [ @' H
#include <pthread.h> //线程" b3 I8 ]- b" \, [
#include <stdlib.h>
& U9 q4 B) M: i; B#include <pcap.h> //捕获网口数据
4 d; q" m) J5 N0 H7 ]4 v#include <semaphore.h> //信号
1 v8 F- O( O$ u) H3 @6 }% L; H#include <sys/types.h> //消息对列
; W$ [: H) V; f#include <sys/ipc.h> //消息队列
4 q0 C7 W& {6 D, T# h" ]. C6 K#include <sys/msg.h> //消息队列* F! @" x- h' C5 k; a* e6 n
#include <sys/select.h>
; [1 y' T* I- ?. }#include <sys/syscall.h>
3 V- o6 i0 u5 i E#include <sys/stat.h>
6 r6 ]. t* K; @( @5 y* q/ w#include <sys/mman.h>( K" E! l; V/ s9 k
#define msleep(x) usleep(1000*x)
8 w, k; q$ N: _, ?' y, t* \# z9 z! [
int main()+ d7 v. s8 p) A4 R+ C7 T
{
! I4 g$ s" j/ Z //MCBSP,ARM与AMBE2000交互设备6 q6 S3 X$ _- G2 B
int fd;
7 X1 s1 ?, F. \4 ^- B0 _7 ?1 h) c G unsigned short data_write = 0x5555;
* a" p: V2 p8 A& h2 {6 M9 u unsigned short data_read = 0x00;/ J# B( m4 |! r/ | w
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ y V0 N. e0 s: R7 \: v // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);% q( Q+ k8 s# n* B
& _! m2 e' b7 z% }! H
if(fd < 0)! y2 C! c. q- n6 N- c
{
) W- u& {: Z; f: ? perror("open failed\n");
* q, I8 Z) H) z$ }* z return -1;
2 r* u) M Q4 T2 y }/ y7 Q8 V3 }% n
/ P! u# |0 ?0 C
while(1)
: S2 Y6 X( X' G3 X; r; e$ T/ R+ C# q {/ ]5 C6 F5 A* b/ t* B, C! M# d4 b3 D8 `" S
2 W3 J4 R# U6 M) ~
//AMBE2000每次读写是24个字为一帧
' H7 P; j- V( O. q0 n3 X! J. x //写数据时将数据在底层存储起来,等到中断的时候再发送6 u6 Q3 `5 Y2 D+ I! f/ v6 @- F
//AMBE2000输入数据是以0x13EC开头的1 H. v/ t6 @, K+ [1 l) G7 {
write(fd,&data_write,sizeof(unsigned short));
8 g9 N" L- E, N Y3 f & I% B* z: r4 b( M
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
5 t! Y0 X7 _! B' s read(fd,&data_read,sizeof(unsigned short));
) }2 ?1 b; Q; r0 T ! W7 I! I, O' @& o
if(data_read == 0x13Ec)
. ?- N" ]' x* u0 \ {4 c1 D: T6 U! Y+ I8 i
0 g1 j& o4 W4 X, V w; Y
printf("data_read = %x\n",data_read);8 o$ _. P* W0 T) w E J. f
}
& O2 C/ n+ }) N
p# L$ u7 N, g- F0 G9 s1 L msleep(10);- |& s# v$ V/ A0 j$ p4 X
& }& x( \2 Y e& o$ Q) c! ? /*
( h; }$ t9 c! ]: X. H4 ? ioctl(fd,1);
4 i8 s$ [, |: c sleep(1);
2 z/ q# y& g9 L0 S ioctl(fd,0);" X$ m; r6 R* c0 N8 H
sleep(1);+ Q+ \1 o4 O" u
*/
& H: n5 Y6 R5 D. `. @ } 7 N0 [! F' I1 a
return 0;
5 V% T, r( l0 X! M
% s8 s* ]$ p% Q* h9 L/ X}/ B( z2 Q! F6 V' C S; p9 x) {
; v; F6 r" o" x% k% h- R1 z1 `
多谢各位指教,谢谢! 急% h* |0 w( \ o7 O
" c# B9 N: }* X) {9 k1 c$ f; m, j
8 e' h/ D+ q1 Y9 @& M: d6 z0 ~7 M
- @& i o9 e) [) J/ B# Q; n( w' K! F
4 `: d/ r' F. V: {( \
|
|