|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 9 O% K* G% O9 B* p
/*$ Z3 U! ^& b ~
* Copyright (C) 2009 Texas Instruments Inc: ^' {5 R( N. N; U* Z
*
/ G6 p* L6 n4 T3 ~ * This program is free software; you can redistribute it and/or modify
( E7 s" H7 L2 d * it under the terms of the GNU General Public License as published by' Q4 t' B; a7 |' Z) y; E0 `: M3 P! w
* the Free Software Foundation; either version 2 of the License, or* J6 v* R; O6 `$ k8 i9 }- h
* (at your option)any later version.
4 {6 l4 H7 `9 u4 H *& E3 ?8 V7 d3 e5 V$ S( l
* This program is distributed in the hope that it will be useful,
8 _! X1 A" g+ {& i * but WITHOUT ANY WARRANTY; without even the implied warranty of
: C- ?" A. w& \) r% I" ? * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 R' b; K Z6 d4 Y- `3 i4 n1 M
* GNU General Public License for more details.( f6 K3 H# T6 {0 }3 J3 `
*, ?( U S6 b- ]+ \) y
* You should have received a copy of the GNU General Public License/ ~. i/ {3 z$ w7 t
* along with this program; if not, write to the Free Software; q( h5 g# [/ d V ~
* Foundati
7 b+ q8 s$ V5 D5 M* x& I*/
' _9 v, y2 _8 V4 q+ v1 g$ v# z8 \#include <linux/module.h>
4 u' Z( V4 ^( l2 J#include <linux/init.h>0 f3 k& `$ `. ^: ]) g# m% T
#include <linux/errno.h>
$ H' o: z, f' {) J#include <linux/types.h>
& d3 U6 n" E5 [#include <linux/interrupt.h> J; T6 J" ]/ p5 b5 N! f
#include <linux/io.h>3 L, P; N Z( ^3 q3 A' o
#include <linux/sysctl.h>, v/ j) a( I# a/ t m
#include <linux/mm.h>
# @" y+ D9 P, m/ k/ W#include <linux/delay.h>9 b! s6 o* p! |! ^' i: k
#include<linux/kernel.h>* p8 [( n `" N- x% _4 J
#include<linux/fs.h># x; b! D: `. N
#include<linux/ioctl.h>
# J0 E" ^" F% `( n! B% C#include<linux/cdev.h>
7 V6 e! M7 m5 W' {+ H#include<linux/kdev_t.h>
; K* d8 |; x1 w7 @0 ]#include<linux/gpio.h>
% G' g0 m3 ~9 [2 q: c! \4 m5 C6 z#include <mach/hardware.h>
; q( k( b+ d7 w- N& n' z#include <mach/irqs.h>
' G- f2 ]- r3 `3 U( w; ]9 G! K
/ Y6 p% Q/ E, c, u* y! Z: o#include <asm/mach-types.h>+ \; Q4 U; x1 h) T: k$ G
#include <asm/mach/arch.h>
" M' Y& v& p% O/ V9 B#include <mach/da8xx.h>
! }+ W6 r/ h& @4 v5 D* V, w# o6 j#define SYSCFG_BASE 0x01c14000
/ a2 g* {) c( Z. T }& h#define PINMUX1_OFFSET 0x124
" D: ~, T3 C- G" L9 Q#define PINMUX18_OFFSET 0x168
; \$ h8 w3 ~+ F2 i#define PINMUX19_OFFSET 0x16c
/ i% \- Q/ k$ B7 W2 ]6 @+ T#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR3 X8 [$ o' Z- G% c
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
( K1 j. c( a1 i' R9 v8 e#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
& S4 H% B! H! k) K' u$ z#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR( x; J+ s7 G" X( i, @# @8 X, f
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
) }! j8 [. b# ]6 v
* L, X- B8 t5 x1 B#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
& W1 D: {8 W: b; U#define DRR_ADDR 0x01D11000 //MCBSP1_DRR# g8 D5 @0 l* d! _8 A: a4 |
//PSC2 N( c% F1 y" i% L
#define PTCMD_ADDR 0x01E27120
+ z+ D- r- r6 ^: _+ D#define MDCTL15_ADDR 0x01E27A3C0 x& M' w8 x% p4 K. c, x) e
#define PDCTL1_ADDR 0x01E27304
( ~+ B4 v# E$ Z C# n8 q% \//GPIO8 direction, z, i2 G4 G* K5 l
#define GPIO8_DIRECT 0x01E260B0
8 P+ J0 ]: Y% l+ i/ S#define GPIO8_OUT 0x01E260B4
6 C2 t* o2 B& e#define GPIO8_IN 0x01E260C0* J, R- u+ u$ B
4 x7 d0 [/ ?. s7 O" O2 g. o& Z) S
//#define MCBSP1_RINT 99 3 v2 S9 r+ W8 V+ f2 k, C
//#define MCBSP1_XINT 100
: c6 ^# L- P) |/ Kstatic int MCBSP_MAJOR=239;6 T3 K) M/ Y' F/ f0 u- F; X, |- k) L
static int MCBSP_MINOR=0;* N2 `1 m! v! b, G! M) i/ _( c: E
static int count =1;
' Q3 v+ F t2 ?# \+ H+ a
3 ]/ {( L+ h9 Q' ]0 d; e3 C' S#define MCBSP_NAME "MCBSP-device"( i3 J8 C- W' L$ j1 j& R
8 \" g% ?# s5 c. p
static struct cdev *mcbsp_cdev;
* _- V/ k/ E3 Y! R9 ?' estatic struct class *mcbsp_class;
; x7 V9 k" V6 _" h- f4 f2 gstatic dev_t mcbsp_dev;8 D) E/ c$ l6 i, e
unsigned int DRR_data;# ^9 J8 I, t- F8 S8 K
unsigned int DXR_data;
+ x: G- Q7 u2 I2 Fstatic int mcbsp_open(struct inode *inode,struct file *file)# r1 n6 |& {5 P. @
{$ @( D* W) x6 i/ }
# h) U( y0 {1 u8 M9 | //interrupt enable,initialized
* ~* B5 h; m* y; ]! ^. b unsigned int temp;
! O: n [. d1 `/ a) }/ I //SLEEP_EN(GPIO8[10])---0
& ]6 e' j& x2 N/ Z temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
b: [, z9 |1 j2 I7 U temp=temp&(~0x00000400);
$ ^6 g w5 c7 C- \0 n# _" p) |( C% A l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
~0 \$ h8 x: a. a- A: S9 w6 ? //RESETn(GPIO8[8])----0----1
9 h2 D w8 f' H* d! U) O& M/ U% i temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ Z5 O" z) L! i1 O6 n# o. n$ q
temp=temp&(~0x00000100);: F; R' o" V$ s! o8 e5 P
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0* a T% ` Q9 `4 \1 ~
udelay(100);
& u% a) c/ ]3 Z) s: b5 t# ] temp=temp| 0x00000100; J9 r. G: I' q( n5 l% j
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
# O4 H" O$ Y5 _2 R4 |* F udelay(100);- x- P9 v5 E5 t: h
printk("open success!\n");
. X* H, {: d% y; b return 0;
: v1 D' d# e9 o/ N) c}$ T5 N# X: D& @# f2 n% z
. O1 l: D- t4 s' l' ?5 i5 K
static int mcbsp_release(struct inode *inode,struct file *file)
" X* R+ y- L6 K) Y" Z: S2 C& ^4 g{
/ Y$ z1 o6 \* p, s printk("release success!\n");
" S& r! [& z" H- ^4 K7 F6 d n return 0;/ ^- V0 G) M: X( X
}
4 v4 B* E1 L( z0 `+ c6 J+ Z- Z$ L7 Z. I, T# Z! z
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)) Z; K/ P: h5 }+ q* L6 S
{
& ~2 N8 v* Q" p- T$ O/ e g copy_from_user(&DXR_data,buf,len);
+ s2 }& H; X- n4 \ ? iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 5 f7 i' f$ q3 }" v3 k/ \6 @
return 0;2 k( @, N. c+ p& C/ Y+ t# ?
) t! U0 Z7 y) Z8 O$ Y$ f
}: f6 [3 y( o; i' H0 L! I, B( i
5 e# r& d" b1 u
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
{/ F( W5 y& z1 A9 X{ # D& F* g$ N+ P0 r$ o
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; k' k- h! q/ B. Q, s- L copy_to_user(buf,&DRR_data,len); * }" a, Q; b3 t5 s, U7 e, F* Z
return 0;
( k, z7 G D9 m* f}
9 B* U `$ H+ |6 L0 p3 a( i+ s
: g7 d7 i1 ~* K) s' T3 _1 _8 I8 l3 t& V# D! a2 p' w1 C
static struct file_operations mcbsp_fops=, i: U! I* r7 f5 {
{7 ^1 f a! p) I7 i4 s( a. D9 A% o
.owner=THIS_MODULE,/ V) ~' k) F0 F2 K+ Q
.open=mcbsp_open,
8 i5 L! ~ t1 B" k2 u' X .release=mcbsp_release,# @& K9 z( i. x# ]
.write=mcbsp_write,
7 g3 a0 [8 C8 W; X8 V .read=mcbsp_read,
# Q0 S6 @, {% G$ E. D};4 F# v9 Y2 Z- z
static int __init MCBSP_init(void)
& k" C. X( J# G{
# [% @0 p3 v( }, p2 r/ Q3 _ int ret;
+ A" ^. w4 e5 q unsigned int PINMUX1_REG_old;
7 k: I' V* b. | unsigned int PINMUX18_REG_old;3 n. T5 A. H, _) k7 u' P$ Y
unsigned int PINMUX19_REG_old;
- o! [/ j; e/ r0 g' R0 w) ^* f unsigned int temp; $ w1 h# U; A& u% a) L
if(MCBSP_MAJOR)" g# c8 ~+ t8 M2 a1 c
{ O/ n, A7 F/ r, L; v# M
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
. u ?) J- V/ C ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ E* @' F; R1 o/ R) f& k }0 f/ T3 {1 |) [5 S
else+ O% X% A. K3 w& A0 `
{
' N5 c3 s; ^$ z& `9 j3 k# H4 p ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
]! A* l" B6 L3 f5 g4 ]5 C MCBSP_MAJOR=MAJOR(mcbsp_dev);
6 t9 f2 s- Z4 K1 H }4 i n. O, s" r
6 N; Y/ r# j0 d if(ret<0)) ^$ r H0 P, u
{
$ e' E! z/ ^# K/ P6 |0 c printk(KERN_ERR "register chrdev fail!");! X+ f' G5 @6 z% r2 L
return -1;
) Q/ m$ d2 b( c/ ^7 m }
$ J1 t% F5 ~1 F2 f T - k. M2 z @0 P/ A. }! a0 i: u
mcbsp_cdev=cdev_alloc();* M( C/ d8 I% ]1 W- E
0 t7 c6 D# l6 L2 U, H
if(mcbsp_cdev!=NULL)
4 `5 q( Q2 D5 M+ l1 P5 q {
# \' l/ t8 j. [ cdev_init(mcbsp_cdev,&mcbsp_fops);
5 y, }. }/ ?* r' ~9 g mcbsp_cdev->ops=&mcbsp_fops;
0 Z; x' _" p0 v m mcbsp_cdev->owner=THIS_MODULE;6 g* R6 j& K: ]. m' h
7 O# y; ^9 E/ h1 S, h
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' e, I$ J) O! q v: Y5 E: F printk(KERN_ERR "register cdev fail!");& l4 X* q% D+ h+ ]# {2 C
else
' j# [9 c- D* S printk(KERN_ERR "register success!\n");$ Z$ l O- r5 h! R4 C9 s
}: F+ i; Y; n [; z# q5 I
else
, p* E* D4 F+ }6 w0 E. L) h U {* q3 h; j+ k6 ]6 d6 \7 I" B
printk(KERN_ERR "register cdev err!");! y3 M5 x- s: W# }, M2 t
return -1;
% O. O ]& } ? }5 M# ]! l; g' X* y+ c5 c# V. \
: N+ X, p/ E) U' r* i4 N
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);" m0 R+ V, T( i' K5 l
if(IS_ERR(mcbsp_class))& D9 T, ]+ B) n: b' x& O8 Q1 p
{4 O4 D7 V2 r2 V8 L# S4 s6 p
printk(KERN_ERR "register class err!");
" k- ]( a( S/ Z0 K0 l return -1;9 |- @( ~/ H' ?6 l& t
}
4 B* }3 S6 q: T/ Z/ [& [ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 u/ o) r T" R, S
. G& T: l( l0 W( Z: Q: }% h
//PSC5 D, i: v. b, `; ^
//add Enable MCBSP
+ k1 p( P) R n8 k: T //test
j5 V& |1 b! c' D temp = 0x80000003;9 J- i5 v0 H* y% Y, m8 ^" D3 x9 q
writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 O4 n5 ~7 R8 c- _; Q' i5 z$ Z
temp = 0x00000003;
" [" ? p; x9 j3 g writel(temp, IO_ADDRESS(PTCMD_ADDR));3 Z: E, \! f' i) @
6 y3 B2 b4 e/ M; O- M0 o temp = 0x001FF201;
8 J* Q- Y* D3 n$ m( D# V) I writel(temp, IO_ADDRESS(PDCTL1_ADDR));
& c0 x7 `, W* Y, R B9 P2 m0 h+ G( t. _
//PINMUX + T3 o: r- m3 H+ B% L% m3 E
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
# [. U4 W: m5 L- D2 D H# Z PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ) A) Y, m9 ?, S+ `5 s
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
, e! X+ e7 B/ |6 U8 }6 i5 E writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);7 y0 N8 t8 z, h7 \6 I/ Y# J% P
$ [, ~- `0 D: O; S8 T' l //SLEEP_EN,EPR,L138_SHK1,L138_RC
0 A/ @9 N6 o& J5 {. N0 G- X PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* p# J5 ?$ p5 `9 A) F2 C+ } z. O PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 7 s4 P1 Q1 k( Y* E! E8 ^7 C2 g0 f5 L
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);+ p& q: k9 i8 Q; \- d
) O% b3 z; `0 d# L0 ^) _* k U5 w
//RESETn,L138_SHK2. `. W6 m/ c. W1 o1 E1 @
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
: \1 j# X+ `$ W# W6 C8 i h! \5 j PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 5 D& j+ K& r& H% u3 U
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- o% p' h$ q( G$ D
& u, {; R; L6 A$ b
- m6 C, ~. C* N9 G+ I+ A$ ^' i8 W9 M //SPCR Register
1 I" g j& R) K+ `! ]# F& g //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset2 I1 y9 `+ V% G' T7 c
temp = 0x03000000;//(DLB=0)1 x) @) Y0 ?8 ?1 K9 n: }* `, F g& C
// temp = 0x03008000;//(DLB=1)
& I) H) F$ r4 U3 | writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
, { p) n/ |/ [( N# e$ k temp = readl(IO_ADDRESS(SPCR_ADDR));
/ y9 m' Y! X( E2 U8 j: p2 f printk("temp=%x\n",temp);
4 ~) @( x/ p- i1 I 8 s9 R( d9 a6 j$ N/ t- Z
//PCR Register
, U5 Z2 J. ~1 s# X //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
6 s4 b& U6 Z9 F. \ // temp = 0x00000F0F;9 w& T3 v. _ l+ k
temp = 0x00000B0F;
6 b4 `2 K% f9 f- Y" ^- C5 J$ c writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 1 w4 ?/ ~4 r1 B6 }! K
temp = readl(IO_ADDRESS(PCR_ADDR));
0 y' [" t+ G0 H! o printk("temp=%x\n",temp);
/ `9 N% @# K& s$ Z //SRGR Register; y/ a! m0 }$ n- f4 f3 l5 m
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
9 U% Y/ O |% B/ ? ~$ b4 W0 r O //temp = 0x301F000B;
6 @# `% \! d2 w4 ? writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ; ^( i5 p9 R3 b3 V; f2 B* p, M/ D E1 S
temp = readl(IO_ADDRESS(SRGR_ADDR));. {6 O3 R6 ?; ^
printk("temp=%x\n",temp);# {) O6 w9 K+ a
//RCR
! \: D5 Q) M: P# p5 L. }4 e# F, z //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,) |3 a. _8 m% h3 A
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
! M0 ?( w7 w/ I0 L# R* |$ e% ~. a temp = 0x00440040;
/ D- A6 J% I# u writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
5 M0 s+ V7 T; F9 b temp = readl(IO_ADDRESS(RCR_ADDR));0 S" [& @" _2 F2 Y# h
printk("temp=%x\n",temp);1 u* ~ A/ |! g& }* l
//XCR
5 A9 x' Q/ ]" d //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-10 H; v" h/ W8 `* ^- K
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
! o$ g( d/ p/ E) T4 N! u1 O temp = 0x00440040;# V& J& A* \8 |! l' {8 I
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
2 B6 x( M) V: \' L) ` temp = readl(IO_ADDRESS(XCR_ADDR));
Z3 y; T$ V6 ]6 N printk("temp=%x\n",temp);
7 L$ `7 y+ r7 I* A% x) r udelay(100);5 q* Q9 O; e1 q8 w- `6 R* m
//SPCR Register
c# }" m+ N& }; H //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
' `9 U/ M# C& g) @, K temp = 0x03C10001; //DLB = 0 VS DLB = 1
, N' E" Z/ H1 @4 K1 G writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled- K! d6 A5 c, d# d
temp = readl(IO_ADDRESS(SPCR_ADDR));
^) \. T/ F0 f, x7 f, v* ?- V3 Q printk("temp=%x\n",temp);! k5 |, r% ~+ d6 E; {. C
udelay(100);9 [# W! f7 k8 b! U1 L/ @
8 Y+ k5 O; i/ d) r) Q
//set GPIO direction& B/ D! l* R, E1 k7 c3 t
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));4 |0 i9 Y! z: K% G1 e
temp = temp | 0x00000100;//EPR----input
5 \! j+ d/ r- v temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output1 \5 \9 F' Z1 P) ^1 v3 N
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ) U: Q2 B. l+ V0 K7 n& [2 A" q- C
9 e( m( I1 a9 Y! g2 u/ x
return 0;
c- v* M' l9 T f}
3 c, Q7 i9 Z. F; Wstatic void __exit MCBSP_exit(void)8 d$ Y: u/ Z T' p- f
{: y7 k- }3 r2 t# D! ^& J3 N
printk("mcbsp chrdev exit!\n");
& z p6 Y. p3 j! Q+ @3 Q, R1 C cdev_del(mcbsp_cdev);6 o l( G: B& q) c# k# Q' C& \
unregister_chrdev_region(mcbsp_dev,count);: c+ l# A, l" F/ a% a2 H& Y
device_destroy(mcbsp_class,mcbsp_dev);
3 o* T4 J/ S' I3 s4 D& H0 u1 r class_destroy(mcbsp_class);* Z. j% G3 B; E
}9 G' n p+ F% K9 D5 U
module_init(MCBSP_init);
' |! k8 U3 u5 _' v+ K& Vmodule_exit(MCBSP_exit);
' R( i9 U5 i7 Z! P) g6 E
$ Z C7 }& e4 F) l9 v# bMODULE_LICENSE("GPL");% t$ w O; L, m e3 t# g5 t8 `
) z) g$ I/ Z6 H- Y3 P6 Z1 @
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
' q9 G- R4 i' n# a我的应用层的测试程序如下
$ W! F6 [* L: o# A6 }$ u; @#include <stdio.h>
) y- P7 @# q: P* l# r- D#include <string.h>) T# l% ^5 @2 y* \5 t
#include <fcntl.h>% R& \" O: _" r% R; Z
#include <unistd.h> c2 l' ]1 _. r* o5 T6 x
#include <signal.h>
+ k- L" y& z3 H) [5 A! E2 T3 N#include <pthread.h> //线程
9 d- @7 E B& g4 h( t, R' t#include <stdlib.h>4 D8 h& h! S% @* x9 }! ^
#include <pcap.h> //捕获网口数据$ x) j0 ]7 }$ v( f
#include <semaphore.h> //信号
3 ]" @" Z; c+ a% J, y#include <sys/types.h> //消息对列1 O& V u$ G2 V# ^: A
#include <sys/ipc.h> //消息队列
9 }8 _1 K# o6 J; `& U1 H2 \#include <sys/msg.h> //消息队列* X. S, |) |0 ^) ~- C8 A8 a2 l
#include <sys/select.h> o0 q6 u6 @9 H, h
#include <sys/syscall.h>
' {) x+ ~" I! Y#include <sys/stat.h>
; ^& F3 ?" q& o- ]5 C4 h#include <sys/mman.h>
5 P# o* r/ e" J# v" p" J( C#define msleep(x) usleep(1000*x)
$ Q( E& U8 U, A+ Z. ]* c! W
& M: D+ H/ i' Nint main()! ?* K& t4 ?8 y3 p
{ ' ~; e8 H( K9 p2 h2 I& I3 G
//MCBSP,ARM与AMBE2000交互设备
: {- i$ `. O7 ^6 f int fd;
5 s' i! w9 ?* ~ B/ V$ |6 i unsigned short data_write = 0x5555;/ X6 B1 R& c6 |
unsigned short data_read = 0x00;# t: Z8 t' d( f6 ?) p! o
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
( ~! d2 e: E+ l6 T& \ // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);. n( `- K! }' P( u$ t4 K# w
2 |+ X4 K* I$ x, l, H2 \* R- _" w if(fd < 0)
1 k3 m0 Q7 E6 b8 w7 B {& \7 {+ Y" D# s: }
perror("open failed\n");, P: ~8 w( ^( q+ O
return -1;! V5 g6 U# t( J; N: m2 g& X
}* v) M* v& V8 U. e* m6 P* j( R% W& w
: ~) U- x. x6 P0 V* f- e while(1)
2 h2 @8 K4 i/ V9 \* {& r, _1 \ {' J2 P2 j1 k. B1 Q, w
/ H$ N9 v/ E5 {0 T
//AMBE2000每次读写是24个字为一帧! g; Y7 a5 k: X' c- l" A
//写数据时将数据在底层存储起来,等到中断的时候再发送! a! m" z9 D, n' ]' G4 R- C
//AMBE2000输入数据是以0x13EC开头的
# h7 Q% W/ t& W- m) u5 @ write(fd,&data_write,sizeof(unsigned short));( v) a8 s, Z( _& s1 e2 Z
4 c/ V* Z& Y* D5 W, A1 k1 [0 ?* e
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ' V. f& _- O' V, y" o+ O
read(fd,&data_read,sizeof(unsigned short));
7 s% _# q4 w6 y. Y' y4 |- R, y
5 N9 u. ~' z4 X K if(data_read == 0x13Ec)
% G; _* W8 o& Y- W7 u6 ~5 z {$ Z! \& L1 [. |1 s+ j
" z W% B+ l! Y5 r K7 H
printf("data_read = %x\n",data_read);9 k7 f5 c6 a4 _
}* l5 S- |* o7 H- E& d2 A+ i Y/ G
1 G1 m1 f6 m: ^# q" n
msleep(10);
! p, i3 d6 `% \: c
; u! }6 u g* }' T' x# _ /*5 M7 A3 F& u, p0 X6 \
ioctl(fd,1); 8 S6 F- z: D" P: P
sleep(1);# D" M7 l1 ^8 z9 R2 \$ _8 x. Q) x
ioctl(fd,0);
0 e4 l0 p" b" v+ g1 t% a4 z- S sleep(1);" z" \! X- l j- o$ b$ d$ F
*/ , e6 G& J& q# W1 E7 C9 @
} 0 p0 M' a- i; T0 A O. g
return 0;
1 Z0 g) ^7 G" ?- P% [
2 d/ i" Z$ ~1 P J9 R}
. q- h. ]; W( \; \; R2 q* C
5 J7 U/ Q/ P2 ~; @" `( d* a j多谢各位指教,谢谢! 急2 O9 M) V# D) i' D- G0 q9 t
/ H) U, M, l8 j% p+ l0 m( W' E/ X' Y, e8 U% B2 Q# P
2 Y( L2 Z6 c* \$ G" _3 a, n
4 H: y/ m X2 @" d9 `) ^) M# v5 z& D) s6 O+ l# q8 q
|
|