|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
! F" s8 H, P+ R3 ?/*) w7 w. E; M5 C7 H0 S: r. e
* Copyright (C) 2009 Texas Instruments Inc# O# {: ^5 J5 t/ L0 X& R
*" w4 `4 }# M I2 |, X; Q
* This program is free software; you can redistribute it and/or modify& e5 R, E! z% D# ~% c' {
* it under the terms of the GNU General Public License as published by
: l) p( l; y$ ]. \# W& g3 K' D * the Free Software Foundation; either version 2 of the License, or$ E# U& r3 ]8 y/ Q' a; T3 s5 @
* (at your option)any later version.& K) F! Q; W, g* g* Z
*! w; _- t" D6 P: d; D# f' g
* This program is distributed in the hope that it will be useful,
* L1 E* X, X' E- Y& e9 a$ |) k * but WITHOUT ANY WARRANTY; without even the implied warranty of
; S" v4 q8 N; }) { * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% ]2 [4 u: u7 ~1 }0 m" \) p * GNU General Public License for more details.5 Z% N2 d& Y1 b6 u$ y
*
4 B/ h P8 l5 R6 |4 o# T * You should have received a copy of the GNU General Public License5 s. T, M+ ]6 N& {5 k
* along with this program; if not, write to the Free Software1 f; b1 w% h0 l& |$ V9 p
* Foundati
: {2 u( ~* ^% V# V# r*/
- k6 m) ~9 E! [7 D; f#include <linux/module.h>
; g7 x N* _: O#include <linux/init.h>
( T7 s8 \* a! d$ j* H0 U8 v#include <linux/errno.h>
( g( P# O2 H% _/ H#include <linux/types.h>
( \( z$ m) Z0 V- k, h+ O#include <linux/interrupt.h>
: O# L! q! n# W y( }#include <linux/io.h>2 n+ k) T" n! r; G, i; A2 r' t
#include <linux/sysctl.h>& J' d" q" q( Q. j& T
#include <linux/mm.h>
6 @, ~3 l7 o( v# p3 n#include <linux/delay.h>
" m( q; q1 V5 x4 d3 @#include<linux/kernel.h>9 c9 V/ [2 x+ _' E1 G
#include<linux/fs.h>
1 b1 m' G9 a. ]- w! u8 Y- w#include<linux/ioctl.h>
$ U, ]! a) ~8 x. [; d5 n8 I5 S8 Q#include<linux/cdev.h>
; R) G) C$ d' w3 i- Z# q#include<linux/kdev_t.h>9 `6 ?. \( R! q* `
#include<linux/gpio.h>* j, n3 h) g0 C) b; C! w/ ?4 }
#include <mach/hardware.h>
1 q$ c" ?; L N, s, \& r#include <mach/irqs.h>0 v, n! K8 L* \2 t7 E' X
: d1 _0 `' {; v6 N
#include <asm/mach-types.h>
& G7 M2 Q1 ?" B" |" z) w- s: _#include <asm/mach/arch.h>
4 O* e. ?# r- z0 X4 A+ ^#include <mach/da8xx.h>
6 f+ m" p; j j; x#define SYSCFG_BASE 0x01c14000# M+ ?9 q( Q. ~* Q: I0 Z# l* U' Y
#define PINMUX1_OFFSET 0x124 - o) Q6 h5 g( ~4 x4 |; V7 y1 c
#define PINMUX18_OFFSET 0x168
$ w0 ]& A q H+ a$ D6 b2 b#define PINMUX19_OFFSET 0x16c
+ e7 e. v7 [, }#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
) K. U- N7 E4 s% D# C6 _# C#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
. _ e0 q1 { l t$ T#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
% p; M2 A3 o, a#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
; K3 ^5 T# H" E& I4 p* l+ u$ ?#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
. [; `8 h3 Y7 O( E5 H6 K
% M \4 O3 }3 R' F#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
8 p2 @3 f" q2 M# ^* _1 h#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
. X* b. f z6 i5 M M8 Z//PSC! ~7 n# \/ [& w! H* s- B
#define PTCMD_ADDR 0x01E27120 4 `+ ], Q" q* i, x
#define MDCTL15_ADDR 0x01E27A3C7 i8 A7 ], ~+ I6 O' A( G1 U' l9 z
#define PDCTL1_ADDR 0x01E273040 u( W s: X1 n% N" n7 H
//GPIO8 direction9 j; f. c4 H5 P" c: s" S+ l/ v
#define GPIO8_DIRECT 0x01E260B0
! P* j, t+ w, y7 x5 h7 T% \#define GPIO8_OUT 0x01E260B4: B' R) p0 u! r3 a; v0 Q
#define GPIO8_IN 0x01E260C07 Q) R/ y) k% o, r( R7 c" ^
# e4 u6 l2 W7 r
//#define MCBSP1_RINT 99
1 x0 X1 R r; ]4 ^//#define MCBSP1_XINT 100 ; P: P: t# U3 |1 e7 C* j
static int MCBSP_MAJOR=239;
1 k, l4 S, P- B6 k8 ~4 G& Istatic int MCBSP_MINOR=0;+ ]" |, R3 M, `
static int count =1;
- \5 @/ z' n( c9 ~6 L+ D
6 J" u H X# {! x k* w- N- C# c#define MCBSP_NAME "MCBSP-device"8 V- c5 P" ^+ R0 ~1 x5 H9 i
1 I, P2 t7 |' j, \4 Pstatic struct cdev *mcbsp_cdev;
! F1 ^- t) Q$ `/ qstatic struct class *mcbsp_class;
2 e3 i; z/ }' n; J) I, c0 a& ystatic dev_t mcbsp_dev;+ A' d# E- ?# n+ D4 V
unsigned int DRR_data;
5 N! E7 J- S0 [4 Z/ Junsigned int DXR_data;4 D! k" O" l- O+ L: z
static int mcbsp_open(struct inode *inode,struct file *file)
0 S$ G! y d, z4 A B0 c% X% c{
- k, k% w3 x8 ~! z. o3 |$ _
5 b: g1 `4 M% W% W //interrupt enable,initialized0 c) |8 G( W- t! k- ?2 B/ c
unsigned int temp;& c6 ], {" l% [; Y, ]! k
//SLEEP_EN(GPIO8[10])---0
- A% n' L, T4 B8 F temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 O* |2 X, J% ^6 T" ^7 q" J( J ~ temp=temp&(~0x00000400);
% p$ k8 B1 q; F9 ?* M __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]5 _7 S8 j7 H$ f( ?: ~9 Y. b
//RESETn(GPIO8[8])----0----1
0 Z# x! U- [, x H* y7 a temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' o$ w B, S7 [: q/ w
temp=temp&(~0x00000100);) t: E& D: s& A
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 V, c& r* t/ O" l2 _, K udelay(100);4 P( d* K7 N) D: y3 }9 ^
temp=temp| 0x00000100;
7 q6 i. s b' V __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
g1 @- t* `9 p! g* f9 {% h' } udelay(100);; O3 @( A6 g, W; G6 I+ W
printk("open success!\n");' r! t4 v$ Y/ V4 b# Q% w# m& }
return 0;
+ Z. z8 [+ D3 C( t! T}
@( h2 e- k; |+ a* Y$ P
& l8 |5 P0 H8 C/ X) l1 Gstatic int mcbsp_release(struct inode *inode,struct file *file)
# a7 L' l2 A6 x$ [1 N" p{
9 M. z& K" b5 Q( `3 F- c# R( t1 B, ~2 t printk("release success!\n");
_0 u1 q& p9 q0 A6 Z# W. D return 0; |& j& g$ _0 E( U( [9 ~+ E0 K( i
}. @4 D0 R& B" x
- b7 D2 w2 a+ o# O+ H$ n l
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' {) g; s p! D5 O4 S
{; s% b a! z( ?) A( F0 G4 o
copy_from_user(&DXR_data,buf,len);
3 A$ c$ a T5 d4 f+ M) c& A! A4 G iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
9 | d3 p; O' W% Q* r2 z I return 0;
$ z5 y! `8 h+ ]9 x. Z. q2 G$ R
, {/ P! }$ V* N0 A7 V9 A5 S6 V3 H}
3 B: e5 }5 q7 c3 h) Y U! F6 } \& R6 u* G
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ J$ Q9 Q& V1 |8 Y
{
/ f( o2 c, M t: m, P/ Q DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));/ p( e. v2 ^3 s
copy_to_user(buf,&DRR_data,len);
( {, q* P; i( e: v2 x return 0;
: f: |) Y3 }3 v0 R}
. s' ]' J8 m. r7 @7 ]
; g; y2 L2 R/ u8 J, K) ]# F5 E' X) `% O% t. j. G; Z
static struct file_operations mcbsp_fops=
1 G' Q* d. Z2 r) {{+ q" _8 k) l& b
.owner=THIS_MODULE,1 ?0 r- a# [6 S$ B8 M% K" M
.open=mcbsp_open,7 I* S5 K* |6 f- g5 T; h7 l5 k
.release=mcbsp_release, r( l, c H3 I3 \* v4 z
.write=mcbsp_write,4 A0 d: ^6 ?' {
.read=mcbsp_read,
! M& s8 }+ V8 o};
# D) O$ X ?( R, m8 @static int __init MCBSP_init(void): F- T* R0 v$ E: H1 I9 y" h
{6 u! ~7 n9 Z2 h1 B) _# A& n
int ret;
) V' D7 y: `% z, c5 g% G& ?9 i- T: u unsigned int PINMUX1_REG_old;
! W7 F2 v& P; I. @# c6 Y8 G unsigned int PINMUX18_REG_old;
4 a' q4 c, X) q/ i1 R unsigned int PINMUX19_REG_old;; R P5 ~# ]; Z2 y+ O( ?4 A
unsigned int temp; $ [9 y0 J4 K, n1 v
if(MCBSP_MAJOR)
! I: u5 h, c7 g. F _9 X5 B' Q3 h: X2 L {. G0 D' G- J: E$ Q" f( v: {6 v2 Q
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ Z7 x" R# L; B. m5 [+ O4 _5 Q3 Q ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
# P/ O) L# O7 i }6 [) Q& \9 r% A3 I9 _0 i
else+ j* |. |+ F4 `( n& [) y3 `
{
7 p1 C, H2 P& ]0 d% R ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);+ ^5 k9 Z& D% M7 W3 J
MCBSP_MAJOR=MAJOR(mcbsp_dev);! \* {4 w$ ?; F
}- S y2 i2 x+ b. M+ }* U5 q
& ^7 U/ W8 J# [, c; |2 E
if(ret<0)7 `% U) w/ p7 V! }! d( _
{
4 \- b/ |5 i5 o# W2 k- C printk(KERN_ERR "register chrdev fail!");4 x/ ]8 a* Y! l
return -1;" W* b7 t* j3 v5 a f3 E
}
) c& P8 v+ |% j$ x+ F$ L
, E- E! o9 J6 @5 m mcbsp_cdev=cdev_alloc();5 U7 Z, ^& `" m% {8 f
f4 O+ x; }! i9 F2 n* Z5 d if(mcbsp_cdev!=NULL)5 d+ A- V" K" K* |
{; D& S$ [" E( N2 [/ a2 \$ ]
cdev_init(mcbsp_cdev,&mcbsp_fops);
" A6 z8 W$ j6 t mcbsp_cdev->ops=&mcbsp_fops;
1 `; V" |/ i" S3 I/ \$ {" S mcbsp_cdev->owner=THIS_MODULE;
8 E1 }6 F3 o9 A% E( S " `/ t- W. p& j! R9 r- ^8 I
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
; j V* H& A+ e0 y% z1 Q' p printk(KERN_ERR "register cdev fail!");1 v6 |' |2 i/ m7 ^, ]' w2 l
else
# I: c8 S+ S- c printk(KERN_ERR "register success!\n");1 e2 e) q2 }% I0 a( o7 ?
}4 s6 D) ~$ `9 @# C0 w
else, X/ W5 m* h9 f
{
9 j7 j3 k, B: Y1 L b0 i printk(KERN_ERR "register cdev err!");
, h+ H! X! d+ Z9 ` return -1;
5 v, w/ M8 d/ P! l0 Z }
1 e. d" H9 E4 M6 \0 T* P- b/ d' z 5 I8 r2 }! ?1 o
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);0 ]# e$ R. j( `. K6 v, H3 c- ^
if(IS_ERR(mcbsp_class))
5 {4 _$ O5 [9 o2 }; v {
* \, ^8 C" l- ]- [7 x printk(KERN_ERR "register class err!"); o. |0 O1 k8 A1 m& M( _; ^7 {
return -1;
* p7 ?" {/ n) y( [9 Z }
, g% f$ _ A: A1 P! Z H0 s, p, Q0 r$ p device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. V% h( H" @: s4 z0 t
- R% ?2 _8 i- _- L! ]5 _5 F. C //PSC
) b) i5 w" ?3 R) s$ j5 s //add Enable MCBSP
7 |0 x1 \; D M% o5 X //test( E$ k l5 Y7 r! B( E O; @
temp = 0x80000003;
: V: A* z8 U! M% `$ A" c9 o6 V* t3 C writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 [" _2 H _5 z' D
temp = 0x00000003;
$ y9 V* M8 |+ J+ J4 F* r; [ writel(temp, IO_ADDRESS(PTCMD_ADDR));$ K6 ?3 b/ x% N# x# N5 Q
" e4 T7 H; x: A6 e, G( X+ r j
temp = 0x001FF201;# Z9 G" u8 f4 s$ e
writel(temp, IO_ADDRESS(PDCTL1_ADDR));8 q6 `/ P0 q" S1 D S
: X! R2 |: |) r- \/ b9 K
//PINMUX
! H9 s9 ]* k% F5 Y! D1 F" |# | //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
+ O) v/ ] h, ]2 ?" p' B' p PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 7 Z2 B0 a8 _4 M# r9 _
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; " _5 C7 B4 p7 ?$ K9 J9 a$ e
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
k- g% z0 P o) r" f
3 O3 z7 U( l& h1 g( K //SLEEP_EN,EPR,L138_SHK1,L138_RC: J e) Y& s& D% q: f/ ?& H9 D
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ( N$ [- Z; K+ j
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
3 x8 W1 E; n* N* T8 N2 C. q writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);4 C E% i# F0 k! R( k
' U x y& i& A+ d //RESETn,L138_SHK2
" l. R7 n5 }9 f: v m5 W, x PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% N6 f6 k" g) u4 E% a1 V PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
2 q, L# m, B4 V2 M2 R writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);7 S j/ \1 [$ ?( b* I3 N- m' ?) h( |
1 @7 v5 H9 Q% u, a% U* t * \% z4 ^5 w% y& W5 c: g
//SPCR Register
4 H. P. A# E: F- E+ a( t //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
L) w' B4 s. s. z temp = 0x03000000;//(DLB=0)
2 \4 s0 ^* q9 H // temp = 0x03008000;//(DLB=1)0 M: r( X; h7 G2 A4 H
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
: x, y' J& a2 l4 O; R/ A* M( Q5 w temp = readl(IO_ADDRESS(SPCR_ADDR));/ s' e0 _: M. r0 M2 v, G H
printk("temp=%x\n",temp);
, n& N0 O; M! i" j2 `4 \2 r7 w
; Q h5 l9 R/ w5 b6 y4 L( j //PCR Register. t; k% ~" t- V! |- u0 [6 p+ l
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0 Y' e3 C$ h, E
// temp = 0x00000F0F;
: Y) B: w1 C) W4 f" W' w# F S n temp = 0x00000B0F;$ G2 Q8 U. ^( \7 r) k
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 0 ]( B. n8 d- A/ ~
temp = readl(IO_ADDRESS(PCR_ADDR));
. \, {' u, p6 K d printk("temp=%x\n",temp); 1 e1 u5 ]0 S7 g% W- Y7 ~6 q0 v
//SRGR Register3 ]7 B% {+ V- H; ]% w! c" E, R
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11# {1 N! ~$ J4 X6 q' f: w5 Z
//temp = 0x301F000B; o4 a: P2 | N$ X! `3 g8 R
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 5 i7 ]0 U0 [7 k+ P; J
temp = readl(IO_ADDRESS(SRGR_ADDR));
8 h. n. r; Y& s5 m! E" ] printk("temp=%x\n",temp);
7 i: i! S* o. J7 v I" a //RCR
& E& C% _) ]1 B1 c) f" A //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: }1 ^# I3 e. a3 w7 u: G //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 i" j4 z; G- x. q- d
temp = 0x00440040;
. h5 v4 w; `5 T& g2 ~+ f6 p writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
5 m6 Y C# M4 D( z9 t2 W temp = readl(IO_ADDRESS(RCR_ADDR));
! _( A9 w8 F7 a# M) w5 z printk("temp=%x\n",temp);
) m# Z/ ]6 c S //XCR
0 C/ G- q, ^$ x* T //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
! H* f% d# f0 ]. I0 C1 H2 [* N2 R //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 x; P1 _( r- v- U temp = 0x00440040;6 }3 s' M! Z( O7 i
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
4 L) v5 C, ^! [" v; T temp = readl(IO_ADDRESS(XCR_ADDR));
/ F% V* T2 K4 t# V+ C: N* V% G printk("temp=%x\n",temp);/ a& O8 }2 h$ {2 Z8 X
udelay(100);7 E4 l q) A9 H& H& |6 _
//SPCR Register. o Z ?, S( I9 C1 z
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1 K: i: q" a8 y/ \
temp = 0x03C10001; //DLB = 0 VS DLB = 1- q5 i" W, e- K+ C4 c8 i
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled% f* X% k1 D* K! `: ^# L
temp = readl(IO_ADDRESS(SPCR_ADDR));$ H7 M% I* @: _, p& m) ]
printk("temp=%x\n",temp);
2 B% Q+ `2 R: V! l: ~ }+ Q. T udelay(100);
9 Q: ?' m: R9 U4 A* J' j
0 R, k5 B: R$ \4 [$ N //set GPIO direction
7 I( Y* g+ {2 O1 m. u temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));% ~4 ~8 f, |( H5 K
temp = temp | 0x00000100;//EPR----input5 I+ ?$ A8 G& w" e7 T& a2 O
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output) J( i( z( d3 q. M0 ?% v
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 ~+ |9 q" S: B& V m2 n
, Y+ j: v8 u! D! D u& ^1 F& V% w return 0;2 M8 u9 y# @. ^4 Y
}$ O1 r+ S. J% D& i1 f
static void __exit MCBSP_exit(void)* a* A/ C& u8 J' }% q+ @4 L& i
{
- N0 X8 z& E5 ?" g0 T printk("mcbsp chrdev exit!\n");# P% y, f6 q K h4 R
cdev_del(mcbsp_cdev);" S/ ^ A9 a8 R
unregister_chrdev_region(mcbsp_dev,count);4 o% L; k. n7 T
device_destroy(mcbsp_class,mcbsp_dev);) z" u, R2 y4 |6 D! n3 V
class_destroy(mcbsp_class);
- B2 H. m9 J8 y2 b2 [}
: I4 {( @$ ^/ Q# E$ Vmodule_init(MCBSP_init);. b% U& T! X% ]2 G) j
module_exit(MCBSP_exit);
# T1 M$ ^6 V g1 J* n
b K6 @: J" ~9 cMODULE_LICENSE("GPL");
; H5 U6 L" ~0 \8 y. J4 `7 o( y, k" o
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。: `6 L, U( f" j/ ~ T _
我的应用层的测试程序如下
8 V& Y X" Q R- z( a* L# ~#include <stdio.h>
4 I% J0 ?9 P& R0 e4 G6 w#include <string.h>' A% [3 g& m; L- s+ v
#include <fcntl.h>
% R3 f) w& \1 r- o/ D5 p5 b* J#include <unistd.h>6 H5 H( j7 y" f# X
#include <signal.h>( d6 Z! ]1 k& M4 L
#include <pthread.h> //线程
2 e R4 O% W: K$ n9 ]#include <stdlib.h>
0 N/ z2 ~ y- d) Z- f G2 H6 g#include <pcap.h> //捕获网口数据
" B6 H1 ]9 D3 m5 j#include <semaphore.h> //信号
0 X4 M6 ]3 O4 v* d+ g#include <sys/types.h> //消息对列! m* K. i; v- ~! G# e
#include <sys/ipc.h> //消息队列# y& Z8 I. d. w- `, G* i; o
#include <sys/msg.h> //消息队列' y0 R9 Q" O% s
#include <sys/select.h>; k" f+ ?( A2 E4 f9 Y
#include <sys/syscall.h>
2 p; F6 f2 Q& N9 S. B5 Y#include <sys/stat.h>
' f9 b* {1 v& v( a0 r, }8 N#include <sys/mman.h>0 {% d. ~2 Z b% m4 @1 w2 ~
#define msleep(x) usleep(1000*x)
# d! Q( y$ q8 b, j4 d) {8 d! B& x E) T. Z9 \$ _
int main()
$ y( y& j; X& e{ Z( z1 z* t+ p3 a: L- T
//MCBSP,ARM与AMBE2000交互设备
+ h$ O$ B# O! d3 v int fd;
T0 p5 K9 _# @2 w' t unsigned short data_write = 0x5555;/ k4 W" ~9 R& d: o; H/ ^
unsigned short data_read = 0x00;& E8 |) }0 E4 o
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);6 o; O0 @% O6 C: ^) y3 W+ X* f7 M
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ m+ x P% x0 K4 I# G
! {8 P$ { g* x if(fd < 0)! }( _, g! H) M0 T% F" }( R' k
{7 E' k8 W3 ^2 L, b0 q9 o" X# ~: K
perror("open failed\n");4 e% k( F. g" \2 |8 b& S9 j
return -1;
' x# v% \( s6 }6 c- j }( f2 L9 h/ ]; f* {: q
2 D4 z, Q9 ]) o1 i4 l: N6 M, o
while(1)# K2 `8 z$ M. t, O( b
{. p+ q" k$ n* J% S" j8 U8 Q
- W; t- g! A2 E. \* v$ Z: U //AMBE2000每次读写是24个字为一帧
8 Q# N8 ~! c: } W1 @ //写数据时将数据在底层存储起来,等到中断的时候再发送
% N4 e6 w: h$ W //AMBE2000输入数据是以0x13EC开头的9 c2 w4 N- ^$ [" P2 E$ q2 R- R
write(fd,&data_write,sizeof(unsigned short));2 l% {8 o5 Z& l! @8 p
! y+ _; |) b; o7 U7 J* ~; X
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
( { g. h0 }6 j1 ] J. A7 d read(fd,&data_read,sizeof(unsigned short));6 D) L- A; C" p
; M. L$ z" }5 E3 v* A1 H$ C3 Y
if(data_read == 0x13Ec)
, u. F* k' o4 t) L9 d/ s {$ a$ ~! C. ?: G" j a) m0 P% I
1 D `2 }6 H( P7 `+ L! w! b1 V
printf("data_read = %x\n",data_read);2 o/ f' t& Y8 p
}) K0 [" a* I K( o- Y' a
* X. M& g& F, M msleep(10);
9 d2 ]; v1 k1 O , c% u. j5 n1 V9 |% a: ~1 s
/*
1 B7 O( t7 P/ d* ~) w, ` ioctl(fd,1); - u8 ]7 z6 g8 g# ~! E
sleep(1);1 g. ^3 S6 @. L5 O0 h$ |( \) C( q/ f
ioctl(fd,0);
; f7 F# s+ v+ Q' z sleep(1);/ H' W: _6 J) a3 S
*/ % m, H& L' d5 N R; w# }7 J" U4 j
}
+ ~4 n' w ]) [- V& u# z. R, J& l return 0;
/ W5 \; q/ g; U. W* M+ h$ T% T3 C . |* \- t" e- S7 @9 \
}
7 Q. j# f5 ^' i. n7 X ~* o9 K% e0 K' f( \
多谢各位指教,谢谢! 急
% E* C3 y8 ]$ A- h) H# P
; L6 S4 F! h+ T; M3 y
/ Q6 Y; K: t- x% {9 C
4 G$ R1 o4 _) _4 t
( H2 A; d; x s2 u/ H, w! Q3 o8 x$ [9 c. \0 a
|
|