|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
' o7 N8 s( ]+ e, }/*! B" n# v9 p7 a
* Copyright (C) 2009 Texas Instruments Inc' Z1 I4 ^+ p# W2 e }# B) W
*
; F9 O7 u% z5 z) s * This program is free software; you can redistribute it and/or modify
, m, Q" g i4 I3 Z' N * it under the terms of the GNU General Public License as published by
+ T# Q6 [" n: f * the Free Software Foundation; either version 2 of the License, or2 K5 q. s& q3 y$ E* O
* (at your option)any later version.
B( b8 F7 }4 B. R# a' C' q *# o: J6 v) Z, n9 e# H0 P
* This program is distributed in the hope that it will be useful,4 K! m6 o- G2 C" C
* but WITHOUT ANY WARRANTY; without even the implied warranty of
; f' K4 x. n- L [8 n+ J! P * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 |7 a, ]9 x: Q6 k
* GNU General Public License for more details.
& c) W. J: O$ ]4 d) ~ *6 [, ]5 f. |. Q5 Z+ Y
* You should have received a copy of the GNU General Public License
- W" W9 X; ]2 f' j, ]0 K. a! N: ~1 ` * along with this program; if not, write to the Free Software
" T; k& K* A- k) r/ M& {$ b * Foundati& }9 _$ o5 _$ V* r3 D& P
*/. I }: m: K: s6 i$ i
#include <linux/module.h>
6 c7 e! ?4 G! O0 x#include <linux/init.h>
7 R: j6 s9 X! q, @' v9 h#include <linux/errno.h>5 g0 D6 H% S* u" N! Z
#include <linux/types.h>
$ J1 ?( S2 h# D, C#include <linux/interrupt.h>+ s' Z' B1 f" J- _$ v( `6 E5 e
#include <linux/io.h>; N4 i- r* ?9 Y# l
#include <linux/sysctl.h>: \* g* _& r/ u
#include <linux/mm.h>
" |* Y. o4 j+ P% r#include <linux/delay.h>
( T' Y- l% I3 P, @6 P% v#include<linux/kernel.h>( L0 k- |& T4 s9 b+ E @9 S/ M
#include<linux/fs.h>
; G% D9 J. o" D V#include<linux/ioctl.h>
) c; D& g6 I& @7 b9 {( S#include<linux/cdev.h>
5 z; m" m3 x" ~4 |#include<linux/kdev_t.h>- R3 v; V: [: r
#include<linux/gpio.h>
+ k9 U, ]# ?* A7 m$ @& H#include <mach/hardware.h>
& r/ w: i. l" T9 u) x& a4 u& j1 T/ Z+ X#include <mach/irqs.h>4 f$ M$ f% q& O! W+ J7 e/ K9 H
3 W- l) g, M. Z, n
#include <asm/mach-types.h>9 F/ y" l' E, H9 m3 e( T0 q+ b u. ]
#include <asm/mach/arch.h>
7 `2 R+ I7 K( `# g3 G2 i4 o#include <mach/da8xx.h>. b# P( Q1 D) Q& c. X0 i* Y, V! j
#define SYSCFG_BASE 0x01c14000
: T4 j" h4 K- {- Q @#define PINMUX1_OFFSET 0x124
7 I2 M7 f" D2 c+ |& r) A4 @#define PINMUX18_OFFSET 0x168
A) w8 b* O7 _& w. R, T4 I#define PINMUX19_OFFSET 0x16c
/ O6 X( s% |/ U) s4 V7 n L" l#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR1 Z; @2 e3 f8 g- h6 I1 H
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
! j+ p: ` Q2 r; m+ P#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
( y$ t4 P q6 o& U5 f' O: \#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR' o6 v ~' q9 t b
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR$ s" ~# Y9 a9 G$ U. d. Y' n
- e8 C' H5 [ I2 P#define DXR_ADDR 0x01D11004 //MCBSP1_DXR, H; m3 V0 b4 `# ^
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR% n; I$ K, _4 V7 }" @1 I
//PSC
O$ [# \* T4 y8 u#define PTCMD_ADDR 0x01E27120 5 l* |. _4 M- R) j9 K2 k
#define MDCTL15_ADDR 0x01E27A3C+ h+ R7 M4 U# N/ s. E9 p+ [5 q: k
#define PDCTL1_ADDR 0x01E27304, C3 R/ ~- n2 ^1 Y6 K
//GPIO8 direction
0 @ y ?) |' `. n- I/ {#define GPIO8_DIRECT 0x01E260B0/ A3 k8 G7 [6 S
#define GPIO8_OUT 0x01E260B4
8 Y7 ]1 L3 f; D$ P#define GPIO8_IN 0x01E260C0
/ w7 @ a! c8 z0 Z1 a! \$ `0 j
) e) i* F# @8 i& F//#define MCBSP1_RINT 99
5 y0 ~3 @% q4 a( c0 p& s. _- z//#define MCBSP1_XINT 100 3 q. e$ t. P4 l* W2 f4 S
static int MCBSP_MAJOR=239;
# U/ P% J6 d/ i' P" E7 z& G3 m6 Ustatic int MCBSP_MINOR=0;6 n0 E4 x( U" j+ V" l/ d% m/ Y
static int count =1;
0 z) `9 T- |6 O* `! P
4 R5 h4 C; c! A$ k/ M+ X0 j" p#define MCBSP_NAME "MCBSP-device"/ z8 D6 Z4 \7 h: ]3 B3 t
& A a, B. @/ lstatic struct cdev *mcbsp_cdev;
8 c; F1 N7 p" T8 r$ h% `static struct class *mcbsp_class;- {4 a2 R- R ^6 \
static dev_t mcbsp_dev;
+ X+ ~: l ]3 Z% ~0 N) v5 Bunsigned int DRR_data;7 |8 K" T. T0 \1 o8 Y
unsigned int DXR_data;8 g- |9 @' g# k8 Z
static int mcbsp_open(struct inode *inode,struct file *file)
& G8 a+ x1 K0 @4 C) |; i{1 `3 x% `1 r, t8 G5 N4 _2 {/ S
2 f: s+ {# k5 S$ ^0 ]+ q6 v //interrupt enable,initialized
# j. N' i/ j2 N: D& [ unsigned int temp;- F! Y* F0 M! C f3 H' P; |( W
//SLEEP_EN(GPIO8[10])---0
& L$ h# J! ]2 b/ ^ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 B' W, U3 u$ z
temp=temp&(~0x00000400);
3 U; N g. z6 f1 j7 W3 d __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' H9 x; ]5 i; O% h @& u: u
//RESETn(GPIO8[8])----0----1
- e4 `# k" S7 e3 ? temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 g6 m, M' [( Z0 S9 A5 i
temp=temp&(~0x00000100);
, a7 L& v$ y, f __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0" }" A$ v. H0 E) b5 T9 G- f
udelay(100);* H0 E) @; a* p {1 a2 p+ i
temp=temp| 0x00000100;5 O2 n: r; o8 Q! M& D6 P/ H# i
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% i8 [/ m! t3 U6 L5 J1 c
udelay(100);0 j4 }4 Z2 k0 M; b
printk("open success!\n");0 I, y# L2 R* K' d1 P
return 0;
) V% \8 W5 Q8 p! o' U6 `' h( S}( b8 R: E3 I9 s8 s5 }
. R) c0 F( a4 f0 I# l
static int mcbsp_release(struct inode *inode,struct file *file)7 ~* n9 n. }$ D
{
& ]( q j3 w, L$ l9 ~ printk("release success!\n");0 u: p2 J8 O' P" R4 j
return 0;
- y/ h! j/ L- O) w" C}- l: G Z. @+ ?- s
- a" d% _& h$ ^. `% g
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- A. o' K# E) ? _% j% J! p{, L* o2 G- c1 S# H6 @! W
copy_from_user(&DXR_data,buf,len);9 s& O% n( I2 I! P. u, C
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
. C/ n. S7 _. n4 v+ Q% k1 ]$ P return 0;9 t; \# C- _ f. ~9 a' Y/ x
* N* U5 o$ Q8 T1 \, U+ m6 k
}
& A# ^: a, y: ^% Z7 ?% u. a5 q; h8 g# V0 t* p
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)' V" H# P4 ^5 F# j9 f; o
{
/ B9 s: j7 Y M9 k7 ~- I DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
. ?0 k! p8 F+ o8 l copy_to_user(buf,&DRR_data,len); ' @$ ?$ l9 [) v A2 T7 t
return 0;
- s. C' r }' M0 C} _5 u! E7 p2 {8 _5 S# j, ~3 [
2 o3 I, g( w1 u5 G2 F. ~$ f3 T9 ?! @. v. E+ l: Q7 ]2 [
static struct file_operations mcbsp_fops=
6 Z k3 c& y9 o{1 F7 l" f# X* O9 y
.owner=THIS_MODULE,
( X7 \, C/ c( R .open=mcbsp_open,
5 u# ~- S4 F; b0 V7 c6 W .release=mcbsp_release," _/ ? P* w# x
.write=mcbsp_write,$ y3 h# l! ^& w4 U: w
.read=mcbsp_read,
$ N' Q: K; e) l# @4 M/ ?};
/ V1 e% Q6 o* U% H- D& ^7 rstatic int __init MCBSP_init(void)
1 L/ z5 i. Q. \! ~ U3 y{3 w7 O4 z. H% d* L6 _4 X% q
int ret;" l! F- ]( r. K+ Z5 ^
unsigned int PINMUX1_REG_old;
) S& y' o8 P0 B+ G$ e" }( A unsigned int PINMUX18_REG_old;
' J: z" z: X; O0 {. E# D, d8 ?# X unsigned int PINMUX19_REG_old;
0 Y: X2 o; e% @+ p unsigned int temp;
. n* o. d1 R2 Y' M, a if(MCBSP_MAJOR)
2 z$ y2 T6 K2 T r {
0 v3 B0 [7 h& ^7 j- l2 D mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);5 \; \2 E9 c# q7 O
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- ~5 f J: r, ?3 `: E; {- c
}
9 j1 R1 w0 f$ j% a7 v else) } ~0 R) ]5 s+ A4 W$ m
{
6 W5 i! O8 D' |) M- q ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 J" F9 y! ?) ]: z. f1 O MCBSP_MAJOR=MAJOR(mcbsp_dev);% `# f; [' a$ G( ^9 M$ Z" ?
}
m. z- A: V5 O+ j C / L V9 E9 Z }7 B
if(ret<0)
9 a: x, Z% B" H. T: d {
# T, ?" n, {, r+ h printk(KERN_ERR "register chrdev fail!");
" c6 C& r" G; ?9 j# F! Z; [ return -1;
* \6 h' X+ W5 p+ y0 `0 ~" y }, W8 B, _3 O( U: S, j* V# l7 s, _
, E$ X, L% r) O mcbsp_cdev=cdev_alloc();' }9 P( [2 _! F1 ^
& S1 Y5 R, v9 d+ @. h- `
if(mcbsp_cdev!=NULL): G* G9 T' B9 x) O6 B, `
{2 e+ p0 R w( V u' ~
cdev_init(mcbsp_cdev,&mcbsp_fops);' [' R' e, X/ ^# S1 W! S% l
mcbsp_cdev->ops=&mcbsp_fops;; D, f0 w! C4 ]! c& y& }( b' J, Q9 m$ c
mcbsp_cdev->owner=THIS_MODULE;
( H) k$ |4 ~, `, R& R
9 U& v& [* z; v/ e" l# e4 L if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- H6 q: ~0 s$ m, [8 y# B printk(KERN_ERR "register cdev fail!");5 l2 m4 W$ \3 q9 I$ a" X& q# j
else1 w+ U5 T$ x2 \. h9 {
printk(KERN_ERR "register success!\n");
, W; W$ q& Y2 ]0 n }6 a( K4 Q# \( E7 }+ Y! _
else3 k# }3 f# r' W7 F x7 j& V
{4 _( d/ b4 k- _2 y3 t3 _
printk(KERN_ERR "register cdev err!");9 d9 A! o; ~- p
return -1;# l4 M* x$ g" h% i6 v
}$ p$ H0 d2 c. b v" I5 a2 S
8 D5 u; T) V" X3 c' a. u# F9 {% I mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! l4 }: a5 z7 ^; k# E) S9 ?% G
if(IS_ERR(mcbsp_class))
7 S- n" U5 U& v* g {5 |8 W* I. a: K. `3 g( |
printk(KERN_ERR "register class err!");
) M$ o1 v9 [& M6 ^& ]# C return -1;
3 A5 p" w: H" Y+ w. R1 x }" J: j( J# ?' v D2 T- M v) m/ p
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 u! u$ r- s }! t8 Y3 e! i) V( Q: e7 w% \
//PSC2 I- ?/ ^5 Z* U$ Z
//add Enable MCBSP$ _% d9 ? ^1 [& C8 Z9 t: ~/ \/ h
//test
( j+ k! G1 d8 R) w' \$ x$ c temp = 0x80000003;0 H6 | V9 j H2 U" a" [5 i
writel(temp, IO_ADDRESS(MDCTL15_ADDR));, K8 Q0 R9 r, T7 E, e6 p
temp = 0x00000003;% a G, D+ h- k
writel(temp, IO_ADDRESS(PTCMD_ADDR));
% ^) c2 C5 p3 m, M& y - ~* g1 x7 n6 j, P' Q0 N$ C' t
temp = 0x001FF201;; q8 X. O0 F! B* F$ _* E3 H( p
writel(temp, IO_ADDRESS(PDCTL1_ADDR));7 v9 a8 E, \0 {
5 V q' h! }; s. N9 L7 W. h //PINMUX
( F* ^/ h- e) u8 f" d2 k //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,, W& p K5 t( y4 s
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( L' e$ W8 n/ N: T% r PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ( _5 L$ P* B) e2 O- c/ k4 m
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
" ?: G0 @) w/ N( u) v
* m% A* @; L4 J) U& G/ v/ {+ D //SLEEP_EN,EPR,L138_SHK1,L138_RC
4 @/ a- Q0 m0 j2 A1 \6 f PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ F" }+ I7 j! k. l( ? PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
* L$ [9 h4 Z- Q5 s writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- I2 [' j" \7 X! f9 d 7 t- _/ i& L& N+ i' c% K- C7 k
//RESETn,L138_SHK2
3 F+ K6 \3 [5 `& A4 o PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 2 u0 v& Q1 O1 v- C
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
& v" Q' _1 c2 ?! ~2 @9 B- R writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
: M+ C+ h2 \8 l( w . {& t- A+ I5 h X) r) ]# H
) t6 x& U& u8 |' g- @4 c- [ //SPCR Register
# J6 p% J/ _# j/ W; f2 ^6 ` //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ H6 ]) ?4 ]9 Y$ \6 b
temp = 0x03000000;//(DLB=0)/ [) }' Q; ?# @9 l! j# U
// temp = 0x03008000;//(DLB=1)' j7 x$ @5 W3 X
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
- u3 J& I' L3 _& A0 _) B temp = readl(IO_ADDRESS(SPCR_ADDR));- h9 F! z: `& q; ~- \; `
printk("temp=%x\n",temp);
7 S) ^3 L! D7 ~ n 0 d* c+ `0 e: R( c, d% |" B, I9 q
//PCR Register* s0 {1 i4 ~* W! P
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0% u: W5 J8 H* I8 C( A7 r
// temp = 0x00000F0F;
$ ~4 O% S" w/ I9 @- {# E temp = 0x00000B0F;1 _' E3 P1 Z8 d! g, K$ J* s* C
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized + l) q+ [5 S' g9 N# y# H: M) \
temp = readl(IO_ADDRESS(PCR_ADDR));
4 O( x0 E5 o) _# b2 s printk("temp=%x\n",temp);
( T+ C- Q f! w //SRGR Register
/ h; ?& m9 Q6 V2 @! d //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* _& f* C" f5 Z //temp = 0x301F000B;
2 @# e" j% D& R writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ' N; d V$ d: u8 j. M' @0 H
temp = readl(IO_ADDRESS(SRGR_ADDR));
: y) ?; D6 _3 y printk("temp=%x\n",temp);
6 j8 T P% e! V4 k4 Z //RCR
# V# c! ^, B3 f1 D( e //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
! ]' K+ n8 d9 z$ ?8 g7 R. |% f //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; [) O* n& s, B3 f' ]
temp = 0x00440040;
! J8 _1 R" ]/ D+ j2 W2 ~$ e+ K writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
6 U2 k0 y9 `1 m) y6 ] w U* R4 l- t temp = readl(IO_ADDRESS(RCR_ADDR));
' F2 b8 `9 ^2 B; |! l printk("temp=%x\n",temp);
1 s0 H5 T% s2 P8 w6 A: o //XCR% O& }/ p3 L. q G
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1, A9 }( M2 B5 N* @# c: w; ?+ d
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
' n' `3 B/ f6 F1 D2 h temp = 0x00440040;
u' D8 x H7 a) \ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 3 P; r7 i# [: k8 a8 c2 K
temp = readl(IO_ADDRESS(XCR_ADDR));, o8 |, J5 d- y d4 R
printk("temp=%x\n",temp);
3 ^/ R. D0 j% C$ S7 T4 } udelay(100);
% d- Z. R& u4 w4 C' [ //SPCR Register
7 Y3 Z( Q. m+ R- [' {5 ~ //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 I" {, i+ J3 [; h6 w' \7 R
temp = 0x03C10001; //DLB = 0 VS DLB = 1: m, e1 G" X4 m
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
! m1 L6 }2 ^3 R7 q temp = readl(IO_ADDRESS(SPCR_ADDR));4 @$ V# P& c; X. D4 _: c
printk("temp=%x\n",temp);
9 H7 p1 R1 F: o0 h5 Y udelay(100);
, G$ A& _# J7 c% Q) r% S2 a6 `
& U' N9 ?5 @! m8 M5 o" F9 X6 T //set GPIO direction
% E; E! b& _: |! A2 c1 [0 x& X& F3 u3 D temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
! {- T* S2 I# Y* D6 z, F4 `, p temp = temp | 0x00000100;//EPR----input% ?3 c/ \9 j4 Q6 u
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
; P2 M5 a4 m9 o9 Q/ X0 Y: g __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 5 K" W1 G! v) p% D# ~) i
! A. w0 w2 Z: K" M7 H- m$ Z6 x3 I3 t return 0;6 O* E' @" g0 x4 I; n
}- F5 ?( x" E0 c, W1 ~" ?2 |6 p
static void __exit MCBSP_exit(void)
u: x9 _3 ]7 G{
2 H+ x2 G7 ?# E6 W printk("mcbsp chrdev exit!\n");
$ P7 \9 L) |' {6 {- Z, t% d cdev_del(mcbsp_cdev);
: _# c+ f- k; m! } unregister_chrdev_region(mcbsp_dev,count);* V9 V7 R L; `9 ]% ]* p- k @: Y( d
device_destroy(mcbsp_class,mcbsp_dev);
3 w$ E k$ c5 p# ~9 B class_destroy(mcbsp_class);
- S9 D, [( e" V$ d6 x}+ v$ u; E! t& t, \: v r
module_init(MCBSP_init);# P: F7 M) T O; W
module_exit(MCBSP_exit);
8 c) U9 K7 G7 \3 R1 ~% |7 x) T% O& {! E1 B2 h9 d t
MODULE_LICENSE("GPL");/ U* h, C7 v. G x
0 @# P1 C- a% K1 b# p我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' f @8 B1 ?3 u c# q% D' j我的应用层的测试程序如下
( Z, X" J& E1 F4 {# u Q5 N: E a#include <stdio.h>
, G! e* f( ^' W" u% {#include <string.h>, q2 U" c! V3 n
#include <fcntl.h>
8 s A3 [% e) y! G( [' X3 h#include <unistd.h>7 h% I0 v }% o
#include <signal.h>( }5 c' b% R4 x% m2 Z% T
#include <pthread.h> //线程7 {% Y! w$ L5 k
#include <stdlib.h>0 j# X2 P- z4 t* C' Z) @9 O$ d
#include <pcap.h> //捕获网口数据: o. v8 c+ s3 o# s b1 `6 S* [
#include <semaphore.h> //信号
' ^+ R) i% l6 k# s; c#include <sys/types.h> //消息对列- w q$ h1 N# B" b$ t: B$ c2 X ?2 u
#include <sys/ipc.h> //消息队列* a \8 ^( Q4 v7 l
#include <sys/msg.h> //消息队列* d" n( d" F- q9 a: M! V
#include <sys/select.h>
( s: N3 y" b8 T% y1 m% Z#include <sys/syscall.h>
, Q1 |& Z3 a* _2 q, P. E#include <sys/stat.h>, F/ e6 t; M. U6 ?& K% @
#include <sys/mman.h> c. f. F$ _) }- g- u/ H
#define msleep(x) usleep(1000*x)0 ?. k5 l4 {7 @* i* A
6 x2 a, R+ b1 K9 Fint main()
/ r* w0 O+ ]$ ^; _1 ?# L{ $ o' G6 P% q6 ^: B; S$ _, s
//MCBSP,ARM与AMBE2000交互设备
, O( @* i9 O/ c/ P int fd;3 D7 }7 g) ]2 `6 ]9 R# j7 D
unsigned short data_write = 0x5555;
$ y1 U/ F& i# f5 ?- m, d) W$ }! Y, y unsigned short data_read = 0x00;" k8 Q# T0 b- g: l& m- S
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ a$ w6 t7 v: @# n" Y
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);$ {: F2 N! E! m4 H; Z' z
0 l4 D# i# p6 O) t) \ if(fd < 0)
4 M8 o0 |( w7 y. G3 N- f7 l2 ^# Y5 b {* V" e( }' H) n6 \7 O
perror("open failed\n");9 U4 ?! p. J3 p6 s+ @' }: Z
return -1;
, v3 f0 h0 c* w! q6 D }
1 Q6 I8 [% M0 @ e. X
2 p5 }; ^" J9 {) P# A m" V while(1)
5 I. y. I( r! O3 r$ V1 I ], A {
/ J( y- v/ L# t
& c. E9 W5 H" _. A, n //AMBE2000每次读写是24个字为一帧
4 K3 a7 t( L p" w. C- @' ]6 J/ ^ //写数据时将数据在底层存储起来,等到中断的时候再发送
% { F! s) O- B1 u, n* j //AMBE2000输入数据是以0x13EC开头的5 r$ B3 `& P5 ^3 ^+ J8 {
write(fd,&data_write,sizeof(unsigned short));
5 c% r I5 `) h! }" S5 }9 ` 8 n% Y" [3 L* n3 X
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 7 G( H% z. a% c. u8 x
read(fd,&data_read,sizeof(unsigned short));
6 C# I6 `; U$ y& v
* M' ]* P( V# x5 A3 r7 s if(data_read == 0x13Ec)
, j. H! e2 v' G {+ `' `, g: T' I: H0 ]& A3 g0 I, [" e
8 f# ~" W8 U! ~; P# r1 s [! Z printf("data_read = %x\n",data_read);' O7 r5 o' ?. W6 X
}
/ O9 ~9 J/ \5 e
3 \6 n6 L2 T7 U7 b: l P0 f0 P$ I msleep(10);& W3 N U! {8 [9 l
) K, B% A% W- l2 @ I! P; m /*/ R# b9 ^/ F+ D1 L4 ]1 u, r. X( A7 C1 i
ioctl(fd,1);
. i7 Y( i7 K" r i9 C( H sleep(1);3 |7 A3 f5 J# I- F7 Q8 x. c
ioctl(fd,0); f( s4 |! p# v* `3 B
sleep(1);* ~. ?# c% G; u* M& t
*/
3 B4 p, X# ]% H* R } 4 Y4 t7 m! i$ B0 Y) x5 m! Y
return 0;6 _& D- |5 ?( y/ D9 W! t' V
- g1 o0 C+ h# R/ { a& }! H}6 J. _; Y$ K; o) N
0 @, c* T! v) A2 D& n' G7 d% q
多谢各位指教,谢谢! 急: d3 f( F" U2 D; W/ F! B. f
; h+ D0 S2 C" X1 {* L, A
" G- k4 n0 k1 x4 y3 ~% H" i$ n) _/ @0 ?) _
3 Z0 q2 q( u# Y8 m5 ~; b3 |/ K
9 n: s! s- x+ K
|
|