|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
f* p- u% q5 Q# w F/*
4 f4 m2 r3 A+ [) u! g * Copyright (C) 2009 Texas Instruments Inc
1 g: {' V" t. t* t9 i *
( R) G; _% s0 d8 t% }6 m. l * This program is free software; you can redistribute it and/or modify/ B% i" f3 t0 s) t9 p
* it under the terms of the GNU General Public License as published by( `" H0 y( x+ e5 F
* the Free Software Foundation; either version 2 of the License, or
4 B9 ^, ~6 ?/ |) ~/ u * (at your option)any later version.
. @) M9 A8 H( {) b *" t! t9 R( S$ k. U# z. j# I/ E
* This program is distributed in the hope that it will be useful,
* S, I4 Y3 f; Q * but WITHOUT ANY WARRANTY; without even the implied warranty of
' j$ q- ]$ W+ ]$ l5 i8 N G: [5 A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 n1 C+ @( J' @& O, l * GNU General Public License for more details.
% G6 D$ F+ B7 ~/ f *
+ D" K* B6 U- P * You should have received a copy of the GNU General Public License
3 g. Y4 [5 O0 x3 G1 j * along with this program; if not, write to the Free Software
p: s2 X, F1 f$ u3 ~* C* U * Foundati
4 B. {& ?: C; ?& |. p5 F) \+ V*/
+ _" X2 n0 g5 e! P% [: H" ` K/ P#include <linux/module.h>- x% t+ W- y9 p+ z2 B+ E/ D
#include <linux/init.h>
7 i8 H1 i/ g% x) F- h#include <linux/errno.h>- c) {. c, M0 Y1 A1 F
#include <linux/types.h>
$ Q5 X& Q& U' N6 S' X" n0 F#include <linux/interrupt.h>! {1 e" l0 F+ F7 o7 \( e8 @
#include <linux/io.h>
3 B! D" m2 C6 b+ `$ |+ K#include <linux/sysctl.h>6 f) Q# k$ l4 l2 ?
#include <linux/mm.h>
& c: B" B6 b3 r- `; j( ~#include <linux/delay.h>& P O7 @- V' `9 R @
#include<linux/kernel.h>
. l5 Q! h6 E1 J6 Z/ l! L* M' t#include<linux/fs.h>
9 _2 \" J# _7 k* [& f3 X& z" W#include<linux/ioctl.h>
0 ^) |6 J" t. `4 w0 L#include<linux/cdev.h>* U8 G2 ?* `; _- {6 r' p/ q" x
#include<linux/kdev_t.h>
8 C- {. M, l9 O8 Q2 X( E#include<linux/gpio.h>
; A( J3 s! @0 m& F% X#include <mach/hardware.h>
, i" Q6 o- V0 w' n3 M8 }( k#include <mach/irqs.h>
8 _. w3 C6 K7 l& o) V6 o
! V: ]( Z5 A6 b2 h. f% h% G#include <asm/mach-types.h>% s$ _9 ]9 ]5 S
#include <asm/mach/arch.h>/ [6 q; N6 C4 a) z
#include <mach/da8xx.h>
1 a1 S) \$ X& n1 \/ g- G! B6 C#define SYSCFG_BASE 0x01c14000( @& w: g9 r- e$ X: }. \
#define PINMUX1_OFFSET 0x124
4 R% G$ p( B2 ?; }% f( X) M+ l- [$ z#define PINMUX18_OFFSET 0x168 * R7 }$ S/ T; m! t% p' \. I. q
#define PINMUX19_OFFSET 0x16c1 x/ `% H0 T$ p! ?/ @
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR7 I% d; |* j) w/ z1 |+ _% g9 c
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR! o' v, c" l, J# Y* s
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR ~7 r. X) N# X# `- {/ \9 @% b/ _
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
& L) W" K$ u" U0 A: M; [#define PCR_ADDR 0x01D11024 //MCBSP1_PCR8 I( Z$ `4 B- U" ], l4 j
4 @- C D7 R, j
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
! p& n* c: t9 _& D. U#define DRR_ADDR 0x01D11000 //MCBSP1_DRR3 O/ Y8 H+ n$ V% T$ }& j5 i1 {. J
//PSC
& e$ f# ^5 O' e8 l/ _) S: j- c#define PTCMD_ADDR 0x01E27120 : D+ K! `9 [0 L4 l
#define MDCTL15_ADDR 0x01E27A3C2 B) J+ G0 Z: d: i6 N
#define PDCTL1_ADDR 0x01E27304
; l; L& W6 }& Z/ @& i8 P* m) S' S//GPIO8 direction
2 ~0 _6 l# x. C$ _6 B#define GPIO8_DIRECT 0x01E260B0
9 [) p# E6 A% S8 w#define GPIO8_OUT 0x01E260B4; |& ^$ s8 |* P$ Y% o d
#define GPIO8_IN 0x01E260C0' |/ N' E, b0 P, C
: h3 g9 Q+ O% f5 {: i& R//#define MCBSP1_RINT 99
" d7 W% e6 v: h6 j. P//#define MCBSP1_XINT 100 : A$ P; o6 ?5 e6 i/ ?8 c
static int MCBSP_MAJOR=239;. e5 M8 ?6 Y" m& O) v
static int MCBSP_MINOR=0;
/ n) g4 f, B0 }, e: estatic int count =1;( E% i$ U' Q1 i1 J
u! o* C5 e! v* \ `#define MCBSP_NAME "MCBSP-device"
2 l6 X0 w( y) B0 k6 w5 V5 b
' Q; j5 @: K; Wstatic struct cdev *mcbsp_cdev;' N, Y* W8 Y* j! v- g4 j: Y
static struct class *mcbsp_class;
2 W) }- E# ?. w7 O+ J( pstatic dev_t mcbsp_dev;! A" |$ u6 p N! K1 n# V$ U
unsigned int DRR_data;
! [! ~: h) t* P3 d! Yunsigned int DXR_data;
! v% X; i' U* L; d# K8 hstatic int mcbsp_open(struct inode *inode,struct file *file)( v; `6 m+ b5 j- M
{
L$ {. W* C- g4 C* g( o( q% i
5 N+ ]$ r j$ A( {/ I* A% b* w //interrupt enable,initialized' g& ~' _& _% X8 q) h, x
unsigned int temp;
5 H$ [# K6 K% K0 { //SLEEP_EN(GPIO8[10])---0
8 f, k) r! B* z* m. @, } temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' A; g( I3 Y7 h( X
temp=temp&(~0x00000400);
& v; A% p# p. Y0 B$ A __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ e* s3 \3 y0 K //RESETn(GPIO8[8])----0----1
1 | D1 K! l+ b$ N8 R2 V temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 a6 q* e: K% R' R& n' Y
temp=temp&(~0x00000100);. L/ N! P' ?& W! w% n4 c* N
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 U. I7 j. X) A! c0 Z" ]3 ~ udelay(100);
0 s, [8 g, m; K temp=temp| 0x00000100;
" ]3 r* l8 f" W5 a& ?8 q7 ` __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% D' p, O+ D) {3 P9 ~
udelay(100);; p* Z4 `; Q& ?3 O: B) j' X
printk("open success!\n");
3 m$ f7 }, ?8 W `7 n return 0;8 R( ]7 I% H, u( ^2 P+ `, d& m' ]
}
, d Z/ l( _: z
% f3 f! j% |4 T7 D' ~static int mcbsp_release(struct inode *inode,struct file *file)
8 O7 ]+ ~: |, w) g) ?/ d{& R5 Y& Q: b3 s5 j$ g/ J
printk("release success!\n");
/ D' l( x0 M' n6 P) O return 0;
$ t/ [- p) N2 V2 ?. E}3 i/ o: O$ a% F1 k$ V6 C9 R
. a' N& X, h8 w& Z1 Estatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 f2 n) ]+ i$ R: w
{( @1 a7 z8 t& c4 U
copy_from_user(&DXR_data,buf,len);
, l$ o4 F4 t3 k1 F1 A iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 9 x, C G0 t" L9 C5 L4 n
return 0;. d2 U! c2 v8 w& V9 B- |0 J" J! s
3 v- [1 s4 [$ ?
}6 K' g: Z, `% L6 J; i2 ~3 C
5 k- H4 ]5 G6 R+ _3 s
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: [4 z$ z% z. j{
k# ?! G4 Z3 e7 C" \8 y) { DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 Z2 ]* O: {4 G2 ]" ?$ G) H/ ? copy_to_user(buf,&DRR_data,len);
; V% X$ G8 K) j0 Z! S& X) A return 0;
$ Y$ h V+ Z! U% c% ]( a}) L& {/ w `, ?3 Q; N
& K% D2 T1 q6 C) \3 E. q* ^5 L; }; ]7 N& c& Z$ {/ c0 v& b7 H
static struct file_operations mcbsp_fops=
8 n2 S6 T: [' y{" r# |6 ^; W9 {' ?
.owner=THIS_MODULE,
; C7 h# p5 t8 J: j( Y$ D .open=mcbsp_open," T1 t8 v7 v8 [. J m" D% I
.release=mcbsp_release,
+ _' }2 d0 O$ P" l' f. t .write=mcbsp_write,
% N, ^4 ]. l5 { .read=mcbsp_read,
! p i& _9 ?& e- W v: G};% H/ B- [. K" T0 ^% j+ o0 G
static int __init MCBSP_init(void)
: E# y, y6 U9 u{. ]; |7 y3 x ]
int ret;/ }% o( I, s3 u! t
unsigned int PINMUX1_REG_old;
" x/ I; v* E; ^- r2 p unsigned int PINMUX18_REG_old;
2 v1 t& v$ Q, [1 S, u/ T unsigned int PINMUX19_REG_old;/ u, ^: \9 h" e4 k
unsigned int temp; _+ \, E0 h- S2 ?; c+ R- u) v, t# u0 ]
if(MCBSP_MAJOR)
1 k+ e& o0 s/ v2 m' a {$ B. D d5 f& j* P
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" l6 t0 s* C; y( {2 z- J9 V9 a ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
# Y& a1 n; A5 t+ Y R& N }
: d6 j; K0 k1 k5 _; j$ E7 H+ ]' E else
7 y; R( c& P3 E; q3 ]$ I {+ U6 f# X; p' c$ ~
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);' |# J! z6 O. }" v. p( n4 C
MCBSP_MAJOR=MAJOR(mcbsp_dev);* g# {2 g/ w" V% M+ |
}% V1 r. y# T$ O P) v
5 R% E+ X% @) [6 x4 D8 M" s; ?
if(ret<0)
# X0 E* Q" F, [ { O" ^5 `& t: {# d
printk(KERN_ERR "register chrdev fail!");8 R/ n( z* n, F# ^: q1 J: k1 e
return -1;
5 w* e* Y4 q0 L, x }4 H+ s* @" l8 _/ u2 V+ b d
9 `/ d8 ?/ m& R& `( s
mcbsp_cdev=cdev_alloc();+ B5 u, c9 _$ x1 F/ m' R4 A
2 |5 k1 g7 p0 l+ W5 \. } if(mcbsp_cdev!=NULL)# a; Q8 J& E7 ^! ^+ }
{7 O! N$ A/ I6 o
cdev_init(mcbsp_cdev,&mcbsp_fops);/ j) {) |5 {: ?+ S* O3 ~' k
mcbsp_cdev->ops=&mcbsp_fops;
; D o5 g. a- X mcbsp_cdev->owner=THIS_MODULE;
% i9 G/ D" O0 y+ v/ r( R
% }1 u3 K& a/ `1 [" y5 _ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))7 b# F( G2 O" s% c. t
printk(KERN_ERR "register cdev fail!");' U' N Q2 k: q4 x. U- V' a2 `
else% i5 E! n1 a) \0 w7 r1 z
printk(KERN_ERR "register success!\n");- P7 V4 a0 ~, ^' v' ` x! g: w
}
) }% q* }/ S5 c0 t* i6 |0 V- y else$ q/ W) j0 U1 Z8 s( v3 J
{; Y) I: N8 w, Q; H
printk(KERN_ERR "register cdev err!");
2 J4 r4 x8 u, _/ ?3 E* k& ~ return -1;: ?* N% b, |- K- C1 {. x: Q
}
4 T: i+ t# l% s5 o% U* m / J1 ^* D! {! w; }# Q% Y3 x
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
6 \- m4 L" \* P6 {! u if(IS_ERR(mcbsp_class))' g2 e$ K9 w7 q. _1 Z
{; }! `' ~8 G7 G, u8 ?& T0 }
printk(KERN_ERR "register class err!");! U/ n1 T" U7 g5 o" {2 a
return -1; j! b& O, C j4 D* s; r$ t. z
}
3 X) I; |4 w7 C5 I: @ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);" t) H' h3 y: r5 s, }
( _' d1 x9 M# f Q( z* E //PSC
6 b. j7 O4 U+ p. _' L //add Enable MCBSP
, Z5 f4 f' @) n) h0 W8 Z @ //test3 Q; \* U, g% ]: U
temp = 0x80000003;' @( {5 \# g: A }
writel(temp, IO_ADDRESS(MDCTL15_ADDR));: u+ }. n P# X) k; l
temp = 0x00000003;
" J O" z1 W9 y( v0 W, ^ writel(temp, IO_ADDRESS(PTCMD_ADDR));
- B, o+ \9 k5 j3 @; O
2 E9 j$ { x9 [ temp = 0x001FF201;
7 M. H* J) `! \2 W$ ^ r writel(temp, IO_ADDRESS(PDCTL1_ADDR));4 V/ D0 x1 Q5 J Z8 _
* w# X- ?- Q( V7 j //PINMUX ) V1 x; L" ]& H; ]5 k& l
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& {4 W! a* ?5 m
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 |) ?% u9 K' y PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
8 a% [4 T0 h5 n; A0 j/ U/ |# a writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- ]6 Z# z" x% m: ~! K) t$ P- j1 n' C * n# D5 U5 c9 V4 n+ M& M: n; i7 c, `4 _
//SLEEP_EN,EPR,L138_SHK1,L138_RC
" h2 o. P6 N2 v3 E7 V PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* C% O7 \8 }( ]# S PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; " j' V2 ~, K+ @
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. K- t+ H% |$ ?* o7 w
8 U7 }, A( \2 [6 Z, Y1 w //RESETn,L138_SHK2/ C# f; y0 i5 x- u) l- A
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); - A2 }- A$ J" e2 K0 P8 a8 A
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
3 l+ b; G1 O' \; Q& J' Z+ a7 _ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);( R4 }3 v4 w- S
7 u. u5 A% ^5 r" ^6 o. Q5 v
y, b% B7 T% C; \2 [1 ?# n
//SPCR Register
, J. _2 E5 h: `9 E6 g //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
& R& g' c3 ^6 G. y3 M' J, I temp = 0x03000000;//(DLB=0)
7 V1 Y. J; E$ Z% L* I! Y' A // temp = 0x03008000;//(DLB=1)! X% z) o9 n' B3 m1 j
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset# |: L7 L' h' J5 p% V/ I
temp = readl(IO_ADDRESS(SPCR_ADDR));" X; g. u0 ~$ w* N! M4 X" H, p
printk("temp=%x\n",temp);
/ L& U; s! ]8 ^: X2 {/ M
$ ]2 z' \. b- x$ B! Z. q! W6 I( V6 z //PCR Register
& ]; z2 q+ h; x# u //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 H$ r' C8 O& R // temp = 0x00000F0F;
. M- h& M9 J7 _' a temp = 0x00000B0F;
0 q9 O; Y) L& r# S h writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized , o9 m$ ~# \ S
temp = readl(IO_ADDRESS(PCR_ADDR));
' }6 G) ]/ `" [! h; z printk("temp=%x\n",temp);
' R' i. B; n1 w" R //SRGR Register
9 }1 ?& I3 {# G //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- w: j0 J/ p0 c& d
//temp = 0x301F000B;
8 Y ]. G; r; `: f# T8 z- @4 l writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 9 o" s s/ T1 O. Q# a% U* P2 i, D* g
temp = readl(IO_ADDRESS(SRGR_ADDR));
' t- |5 e5 j5 w! `! ]5 }# P* z' F# T printk("temp=%x\n",temp);0 z3 P# R- u6 D9 v V& Q
//RCR1 }7 E1 k( C; _7 w! c1 R
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,$ u4 k& ]6 t( P
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
& m/ _ r; K$ u s+ F temp = 0x00440040;/ `6 x! m7 a# J+ N* _ G% H7 u
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
; b4 @. m5 y3 g/ {" w4 l; b1 h y temp = readl(IO_ADDRESS(RCR_ADDR));& M5 d3 O7 F+ w2 U; t
printk("temp=%x\n",temp);7 S; G2 a/ V* s
//XCR
1 H( h! [. J- p" H1 j //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 R9 a4 a I# d! _7 q* O0 r; b
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! d, Z: o# _2 M8 ~( I/ n/ y6 M. K+ b
temp = 0x00440040;
, Z9 B* A* B& k# X writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized " v# r: ^; {: G3 K. i; _1 X
temp = readl(IO_ADDRESS(XCR_ADDR));
5 ]+ z' s( f8 d- L9 O. d6 V& m! V printk("temp=%x\n",temp);
. l; ^& C, e) V7 E5 Z. t3 n udelay(100);
B. W: u9 I3 a* p1 g //SPCR Register. ?4 f' E1 z# U) r' C
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 U' e* ]$ {( T! A5 h4 n; r
temp = 0x03C10001; //DLB = 0 VS DLB = 1/ C/ H' N) w: i: v9 z
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled/ \) M1 g7 e- G1 N
temp = readl(IO_ADDRESS(SPCR_ADDR));
7 ?( Q0 \( k: P printk("temp=%x\n",temp);
5 l- |' }: K: \7 F udelay(100);3 y5 a" }3 j' A8 H! x
# U: M( X5 N6 a8 C& U, I0 A //set GPIO direction, B$ @ p# T+ h, n+ v6 F, f
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));6 ]6 t4 b* e2 k( Y$ A8 J/ L
temp = temp | 0x00000100;//EPR----input) O7 F7 N0 T2 h# {: A) E3 {4 ^
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output; b* n7 b O/ }5 |3 ~+ {. q
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); % T7 s& T& m% t/ O" ?9 A
0 r T0 X: R' W$ ~; _/ p return 0;$ ^5 g# ~* Q( j6 ]2 y/ E
}/ i1 V* N8 ~' H2 Q
static void __exit MCBSP_exit(void)9 a& U$ @" Y6 ?- R9 v; V
{
! V; c) S1 H5 v. d8 k. D9 c printk("mcbsp chrdev exit!\n");, x5 x+ d0 D) y" A# U! {
cdev_del(mcbsp_cdev);3 O; h( D( G& z
unregister_chrdev_region(mcbsp_dev,count);
8 U& m# }, ^' a' s2 p# ]9 | device_destroy(mcbsp_class,mcbsp_dev);
9 T" J: T; a) ]5 I class_destroy(mcbsp_class);
6 J: ]% ?# A4 p9 u, W}4 D3 V2 I" Z2 j+ l6 K7 V3 G+ w
module_init(MCBSP_init);
: F2 R! y" i# O4 Vmodule_exit(MCBSP_exit);
; Z! Y) w. @! a! z) q" c& A" t* V. u. p' c
MODULE_LICENSE("GPL");
: X3 b' Y1 D7 T$ c' Z6 M# b
3 X$ M$ ]' M3 F! \我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。# L6 E s) ^: c4 x- n
我的应用层的测试程序如下 a5 l$ Q: m/ e$ z n3 q7 U, `
#include <stdio.h>
6 H' M6 I9 o. O5 {2 \#include <string.h>1 h; n. g7 [& |8 a
#include <fcntl.h>$ s" F! E& K4 M. y7 _! P5 X2 e
#include <unistd.h>
, H: _9 o" o6 B1 b: U. r#include <signal.h># S; [9 J+ Z# P: d* W+ j
#include <pthread.h> //线程
# G5 h* g7 C4 e b#include <stdlib.h>: ^3 s; a% L4 w4 r7 C
#include <pcap.h> //捕获网口数据+ v5 F0 @! Q! d' ^2 _. ?2 U
#include <semaphore.h> //信号
) F% t6 r4 S( @3 N2 E#include <sys/types.h> //消息对列$ {7 g v$ k/ j5 B; ^. D8 e* E% l5 H
#include <sys/ipc.h> //消息队列
; s3 W& L% u+ e/ O7 G#include <sys/msg.h> //消息队列 j4 Y) r) W' k9 ?+ C' b
#include <sys/select.h>% v$ \; n& A1 c6 t, W& ]
#include <sys/syscall.h>$ b* O5 u0 i' ^- E, w
#include <sys/stat.h>* S7 @" j0 M+ V/ o' r8 r
#include <sys/mman.h>9 [ z4 h7 l9 k5 S/ u$ A" [7 V: Y d
#define msleep(x) usleep(1000*x)
3 S2 D' p4 l& M: E: A9 S) _9 a; ^# ^% T9 g! O/ w) S5 l, a
int main()0 g+ J% Q! A6 G+ T n
{
]" S( z9 G$ n+ v) r //MCBSP,ARM与AMBE2000交互设备
( D* P9 {5 E7 `$ U1 n6 q' ]% [2 S/ H! Z int fd; M; g2 |) F8 q4 p; V
unsigned short data_write = 0x5555;
2 v5 q4 P2 R. Z: p8 ]2 O: r" ` unsigned short data_read = 0x00;
& V: @8 L" T3 j" `' @4 a fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: m |" o9 S0 j
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
" C! G: w* C6 G" d* |+ n
% Z+ g0 P4 d% @3 j+ j& h1 j if(fd < 0)
5 D( d1 W4 i8 y {
0 m( u' a9 I& j# y- j+ i W1 F" j3 [ perror("open failed\n");9 f! N1 }5 T+ ^$ y) r2 o% m
return -1;
: G. A( g4 B7 e8 F }
9 K% u% J. Z8 _3 y2 p% k5 R
* M; e; p, K3 m# l) z. k, K while(1)
6 g! b: ]' Z/ O {
, U- ^0 p3 b/ j6 s; }7 R8 P) ]' u5 [
8 y6 W2 ]' t/ x, ?4 w$ [ //AMBE2000每次读写是24个字为一帧
& {3 }- R- v2 |( k. \" Y& J //写数据时将数据在底层存储起来,等到中断的时候再发送
" |, r/ `1 S6 F6 B: E C; [ //AMBE2000输入数据是以0x13EC开头的
" s7 b7 K8 I: q8 Q write(fd,&data_write,sizeof(unsigned short));% M5 }! B/ B0 B1 v- j1 {
( `3 U. i0 l8 _! t& i* ?# h5 O1 V //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
2 U7 a$ t, b+ R* A2 e: _3 I read(fd,&data_read,sizeof(unsigned short));$ w$ u3 Z' x2 `* ^
7 h% C/ Z+ J; o5 v
if(data_read == 0x13Ec)6 h) u& m7 ~/ z
{
- o7 P& C2 Z/ C% R* F2 t _# ] 3 G( H1 U; H2 ]: s; A9 ~) L
printf("data_read = %x\n",data_read);
0 K) D- y, [( v+ L, k }
; J; H1 _# U* B K ) w, ?5 V5 v1 D
msleep(10);
& P; L2 z7 \) @0 O* \! D! g 7 h) B6 w4 ]3 A' G7 b) Z% u
/*
5 P6 e' w! [% r; n5 p ioctl(fd,1);
. f+ N# @0 E1 O- y, g7 c# y sleep(1);6 J5 P# Q6 B. t' A
ioctl(fd,0);7 \1 f5 v# R) Y2 N0 p4 Q
sleep(1);
: @: }1 s' M3 g& l& C0 j */ ' }/ ?( F6 {) {+ o2 {9 G
}
' g( v, v+ K, X" ?9 Y# J return 0;& ~& n( J1 H9 f- K% i9 r2 L! F
- N2 \7 {) M7 F/ b
}
1 ?- b% v. c. D) e
: I- V O4 G+ p; C' D多谢各位指教,谢谢! 急; x2 [$ |0 E- e) i* {5 x
/ g% s; A/ ~0 W* E7 @/ n( [3 R9 ~: |. q: C2 o
; L: W6 ^" X5 i' _4 V& d; t% K5 X T+ x/ s+ N9 }. |
! s4 Q; r" n; T" q$ ], L: i C0 ~
|
|