|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; T O6 H8 P' b: L* P/ V
/*
8 w6 [9 m6 A8 s k3 ` * Copyright (C) 2009 Texas Instruments Inc
7 b$ O$ M5 D; v8 [; z4 b) r, I7 @2 ~: W */ I1 C0 V9 ~4 O+ O, v& L
* This program is free software; you can redistribute it and/or modify
~* O P9 Q1 m2 n* H9 J3 X* ? * it under the terms of the GNU General Public License as published by
* J3 a/ A& v$ I0 y% M2 G# i+ W, | * the Free Software Foundation; either version 2 of the License, or
- T+ [* F" V" _) P- n& P8 Z$ u * (at your option)any later version.
v6 q0 l; }3 c; f- h *; \: Q$ A0 T( b" ^/ G! v& ~9 [' t' H
* This program is distributed in the hope that it will be useful,0 {: S8 a" c. V8 s+ o2 f
* but WITHOUT ANY WARRANTY; without even the implied warranty of3 {3 n( b$ G: ]& g1 |) e
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the) D, Z/ q) g0 `+ Y3 z
* GNU General Public License for more details.4 @: V; t) A1 a. Q
*& a( u- g* H2 C' d( O: N
* You should have received a copy of the GNU General Public License
9 l1 o$ W0 p6 P! s * along with this program; if not, write to the Free Software0 R+ @. M3 A4 k3 |
* Foundati6 I8 G5 k5 c( \7 R$ J; M5 K- {, s8 f- m
*/( ~$ Q# a3 S. Q' A
#include <linux/module.h>; w, m ~" q; c9 A
#include <linux/init.h>
( G$ t9 T& d1 p/ R! i( |#include <linux/errno.h>
2 ^+ ]& ]- W, t8 W& [#include <linux/types.h>' V2 ]/ F$ M2 _9 g
#include <linux/interrupt.h>
; X( C& n, Q3 v8 d6 @2 c! `#include <linux/io.h>
* m+ K/ l/ `2 H9 [+ v#include <linux/sysctl.h>
8 [: p9 h) x0 h! U, ?#include <linux/mm.h>
7 {) M' B# ^4 c#include <linux/delay.h>; |3 E2 V* g, w& a, g- D( V6 g
#include<linux/kernel.h>4 h6 O1 z" S5 ~/ w f. a
#include<linux/fs.h>
# @) l1 W% g+ t; }) C2 I \#include<linux/ioctl.h>! L2 V5 }% [' m( z( T
#include<linux/cdev.h># r- ^$ }, J; O, M+ ]. E
#include<linux/kdev_t.h>: @5 r) c5 j9 T
#include<linux/gpio.h>) H" w( v" L& K& J" H- J- N
#include <mach/hardware.h>9 }" b4 u2 ~6 X: P8 ~; d
#include <mach/irqs.h>% M; a1 b0 T7 Z! }3 r+ n1 v$ i+ `+ F
6 R6 k. p' D# D1 k
#include <asm/mach-types.h>5 C$ G4 h( X3 h
#include <asm/mach/arch.h>
7 r! r% R9 g- y#include <mach/da8xx.h>
# ^) d) _8 @2 `! ~7 p2 p) t#define SYSCFG_BASE 0x01c14000
$ a9 R' z' @$ @7 S#define PINMUX1_OFFSET 0x124
. F( `% I# l( R9 T#define PINMUX18_OFFSET 0x168 ' h' p* z+ a' J) s
#define PINMUX19_OFFSET 0x16c
7 L7 [* ?/ b" X( ~: Z( x& H#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
: Y, h! h7 s% t% ?' v% N+ E, p#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
: ~, q& W5 [8 L* Z: G#define XCR_ADDR 0x01D11010 //MCBSP1_XCR/ s3 G7 }, t% F1 t, l) G' t
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR, R! H$ S8 {, o
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR8 c7 x! M% l5 m* O9 p* Y
; k, K! k, S1 S& q* O8 V! G#define DXR_ADDR 0x01D11004 //MCBSP1_DXR0 ?" a2 ~6 V* {9 Z! \
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
" c2 [+ ]4 p, S s) u% A//PSC
% n5 E, E2 b& w* W$ w0 f. ~0 e#define PTCMD_ADDR 0x01E27120 + w7 z4 s; [/ U5 z. H
#define MDCTL15_ADDR 0x01E27A3C
" g8 s* L8 h6 i) \#define PDCTL1_ADDR 0x01E27304
v, W! |9 l7 i% X& u//GPIO8 direction
: K) X z4 r6 g) F) w/ E& t7 K#define GPIO8_DIRECT 0x01E260B0+ |* Y0 Z( F# Q
#define GPIO8_OUT 0x01E260B4 E' f8 ^% R, }- J! s
#define GPIO8_IN 0x01E260C0
) |0 Z' M w( j' O, q1 k3 N+ m" n: d* ~# Q% e5 @! j) r2 ~ Z
//#define MCBSP1_RINT 99
" M9 ?- o8 a& ^7 x h6 d8 `//#define MCBSP1_XINT 100 " J& }, Z/ Q& [) p% b
static int MCBSP_MAJOR=239;' C2 e2 i7 l7 z q1 W# ?5 `, X
static int MCBSP_MINOR=0;
; d( V( L) M; d" sstatic int count =1;5 D, ^3 {$ E2 _( x; p
# J1 s( T9 n, {9 a% z v6 ~
#define MCBSP_NAME "MCBSP-device"1 S) x5 w* `+ g, M( E( E/ Y Q
7 X3 L2 X" N( v8 z
static struct cdev *mcbsp_cdev;* n" n: u8 j1 Q. r( v3 F: t
static struct class *mcbsp_class;
, Z- u) {4 y$ w4 {& q, r9 {; ~( [. q ]static dev_t mcbsp_dev;
4 F9 s+ X+ e3 k1 B) d. m+ ]* q! n9 v+ ^unsigned int DRR_data;- B+ V! t! J( ~% A3 k" @
unsigned int DXR_data;, ?: d( X2 u' ~( ^
static int mcbsp_open(struct inode *inode,struct file *file)& _- K' H3 K) l" Q& h, o9 f5 C
{7 K$ \4 r$ A& [; C
( U7 d' ]! h% r0 E1 x
//interrupt enable,initialized
$ {! O- b* f: F' K- {( f$ K unsigned int temp;% j ~) N* B9 J
//SLEEP_EN(GPIO8[10])---09 O# |3 u y, w* Z, j5 \3 {
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
g/ l2 b5 T/ z( P7 K) A) ` temp=temp&(~0x00000400);
+ c+ n9 h; M* Q4 g/ @ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
! ?! N. ^3 ~0 G: f //RESETn(GPIO8[8])----0----1
/ ~8 R- s# U* r temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ @. D: @1 V3 U+ f) k temp=temp&(~0x00000100);; |6 }) u1 H0 ?4 X, T$ U
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0) @" B) j3 }5 D, C. Q0 n
udelay(100);
3 j6 T' G% c1 q0 O3 J' i4 i: L temp=temp| 0x00000100;
; ?$ X, ]* M) c/ M6 H! P& M __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1* _- r6 S) {3 C; {# s: ~" C1 A
udelay(100);
7 a ^4 G% z. P) A) A: ^! c printk("open success!\n");
, Y3 I. u1 k6 c2 d return 0;8 L% [$ l3 F5 _2 [$ C0 A
}
: u3 [- p) ^ V/ D, M/ J3 }# X) K J0 @. f6 |4 V8 ]
static int mcbsp_release(struct inode *inode,struct file *file) B! S6 r; R2 E5 q
{+ a) \: C a. }) k6 W7 T
printk("release success!\n");
e4 O: _, u( v) Q return 0;9 ~- [9 R1 v# Q( Z1 a& E
}- o' t* j1 U- f1 h+ H" R
w) N2 S5 i0 Z& g1 j; astatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): @- V/ d. G, u- E7 X5 r
{
9 R! E$ c/ g4 D! o copy_from_user(&DXR_data,buf,len);
* z9 f- P& A9 @3 i2 a4 r* g7 A iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
+ e% S5 r, _* ~+ {/ @) I return 0;! w! Y$ D0 k, {/ E4 {
p; f4 A; l; M}4 T- U7 t6 t' ^: p5 U3 r* R5 ?
: f U+ Z* K( R! F \
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
) F7 y5 c8 y) Q{ + B7 A' p+ r4 q! q8 i3 I
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
% v% b& ~, S9 J* i0 c" d+ S copy_to_user(buf,&DRR_data,len); * {. `" G7 _% `0 b2 f
return 0;
! {6 Y. N" g _$ D) f- J: R} K1 A( j/ L% u3 W4 |/ `
% l5 ]4 k/ p1 r6 m
% H4 r( U; g$ S% Qstatic struct file_operations mcbsp_fops=! f; Y5 y9 P3 s0 v" r, ]: S: W
{! V0 D5 p4 l2 @5 ~$ i% c
.owner=THIS_MODULE,
4 Y9 V% I: ^7 D3 S' M4 p& b3 k .open=mcbsp_open,
1 W) v7 V) o; n6 A. n. v! s0 N R .release=mcbsp_release,
x8 o8 d1 x4 }0 r3 [, V: u5 S .write=mcbsp_write,! B8 ?3 e, A; H6 I4 }
.read=mcbsp_read,
, V T' c- J. F, c) N};
$ g7 d: h3 t4 Wstatic int __init MCBSP_init(void)( r! s. J0 c: k9 T) t" O" {, l* P# W
{8 F5 [3 V2 o, U/ ^0 m- Q2 n% I8 [5 o
int ret;
: P. [! |& _6 _- `8 y unsigned int PINMUX1_REG_old;
9 C! E7 L5 a }$ E unsigned int PINMUX18_REG_old;" c: G% l" p. ^/ v3 E: A
unsigned int PINMUX19_REG_old;% \- N9 l3 [6 g* l) s+ v8 d
unsigned int temp;
- B( X* ^: W8 f/ m, B4 w if(MCBSP_MAJOR)0 Q7 P. y+ i% i& v7 ~' x6 \
{
7 P6 ]+ w' b" I5 `% o9 e0 c* Y" O( ? mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);, q9 B0 a# _8 b+ \. q
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! A8 a u; R: k/ G$ b* a& o, F
}% {1 `1 @# z- c7 M3 I
else) |2 s& k1 ]. B# K0 \
{
; b8 |1 U0 u" ^4 w ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
+ {+ z4 n b; `; b' g) Q MCBSP_MAJOR=MAJOR(mcbsp_dev);) L) e- P: m" V5 B, X' U
}
" S" Z3 d% r: c ! J. u5 [6 E: d0 [# \$ _
if(ret<0)
1 A# h8 \, V& \* r: H: J {
4 E. X; U+ z) s/ Q3 ]: E: q printk(KERN_ERR "register chrdev fail!");9 s$ m, [4 Y5 D0 O" u
return -1;; B, k8 g; s& l" u
}9 K& J% `2 z5 d8 P
' `# s- }' s( T# J% ?1 H
mcbsp_cdev=cdev_alloc();
) [# [7 s/ B. C# @4 n2 ~ + I0 e( Q! ]# I6 U- M9 A" y
if(mcbsp_cdev!=NULL)) q& u9 [( f, \) G% Q" R. P
{) }2 O* q; K% e
cdev_init(mcbsp_cdev,&mcbsp_fops);1 m! B3 ]. d" c/ r
mcbsp_cdev->ops=&mcbsp_fops;
8 a. Z+ e- x' x% }$ o( G6 ~. F0 J mcbsp_cdev->owner=THIS_MODULE;
, |* B& \8 W6 p) G
# c( P7 y6 f% d* [0 W if(cdev_add(mcbsp_cdev,mcbsp_dev,count))1 K7 a4 Y: `9 |1 q3 a9 i
printk(KERN_ERR "register cdev fail!");8 {: j8 L7 J: n: v, c
else, L$ X2 r7 C3 n2 _5 x# w1 S
printk(KERN_ERR "register success!\n");
/ M$ Q- }- m5 R% d9 ^- e }+ a8 r% ^2 ~' h9 H+ o
else
5 S% Y/ Q! ^2 ]* T) E {% j. L( {" N; ^+ W
printk(KERN_ERR "register cdev err!");
6 H. i8 d* f/ M4 X" S6 g return -1;
/ ~! G1 ~7 N# u }( S" z8 `; G! \8 i3 b0 t
( Z- h9 ]+ \9 J mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);$ w2 V$ u! S, I
if(IS_ERR(mcbsp_class))1 B3 ~. _: k( d0 m5 f; R1 D5 M
{3 l: ^* O# Z. E @9 j$ K
printk(KERN_ERR "register class err!");
* N# {: v7 D5 X" j Y* D return -1;: `7 A* F' O' @
}
1 {* \' h$ M& U7 q- [% ~2 G device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 E; t' A) j- [. I4 z( F0 O' R& H
//PSC& q) Z' T4 u0 N! t0 R
//add Enable MCBSP. F/ i8 h& ^; l' u0 |0 K) L, V
//test+ i! P- M3 q9 O/ o9 l# R4 q% h/ ?
temp = 0x80000003;( ^ N8 f. \# w$ Z2 P
writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ h* n8 p0 J2 n3 d: U# ~ i. B
temp = 0x00000003;
8 f" ]9 n& w2 [ writel(temp, IO_ADDRESS(PTCMD_ADDR));/ q; `. Y& M; o* E" v
% D6 |" M$ r1 e C
temp = 0x001FF201;( ^/ n& O& T' L$ F
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
4 A- {2 P; ~& K# d
9 a+ O v$ g% I' P, L //PINMUX 2 w9 W% n9 b. z7 j
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
k3 r! x/ I3 _3 ] PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); " A% o% d' L6 H4 w" X
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 5 P; P* a* H& m O- [* L( P
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, ^: b4 o& T% L0 }
4 L4 H0 i, @4 B4 ?( c! h: D8 I //SLEEP_EN,EPR,L138_SHK1,L138_RC: u6 y2 @: A" E% A, s
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 k( r! b% }+ m8 s8 l PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; , L* h1 ?' {* b' c$ r0 {" D( s* ^
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& t: Y Z+ {4 f7 o6 G4 F( V. J & z; c( `) b0 I$ Y% \
//RESETn,L138_SHK2
/ p3 f3 q x' H5 H PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 S( B; Z7 U: d+ L0 \ PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 6 N" ` u+ {" J. q0 ~
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; \# f) \0 g- }' O* C; r0 E
. V ]2 |. A3 l n
) W! y' N: N7 P/ u! u) S4 l //SPCR Register6 c& @( }: w8 \' M$ A
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
+ Q0 h" c2 L j0 a1 V7 H temp = 0x03000000;//(DLB=0)
3 E) P" y9 W0 Q: b0 m$ w // temp = 0x03008000;//(DLB=1)1 V9 R5 c$ w1 i7 I. X( p, ]+ F
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset% B% B% c4 k% h4 g7 d0 y+ |
temp = readl(IO_ADDRESS(SPCR_ADDR));
* C' K) X( x! V+ _! m: | printk("temp=%x\n",temp);
1 C' L) l: N" I' f! C( @ 7 \ e5 n8 b" p9 q8 m: k
//PCR Register( Y( z1 `4 z$ n
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0! g5 i8 T$ B- ]' F a* j' d
// temp = 0x00000F0F;
6 ?* }# P x2 o7 A2 g% {' U temp = 0x00000B0F;
# y/ m. h) o: l9 J! m w writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized & v2 a' H4 e# N. {8 a! i: m* X7 q
temp = readl(IO_ADDRESS(PCR_ADDR));9 j1 j2 ~# \6 D2 B
printk("temp=%x\n",temp);
6 D; |1 ` Q$ \& \ //SRGR Register* K0 r y+ A& P4 s
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- S1 v# }/ k& B- f, @
//temp = 0x301F000B;# U* D5 n! t/ t% f3 x
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized . V; J0 l0 z: x6 S9 n" s
temp = readl(IO_ADDRESS(SRGR_ADDR));
2 _4 a% M6 j' R; d7 [3 k4 F3 x& d printk("temp=%x\n",temp);8 T+ v% z. F! g
//RCR) J" I- D9 H# Y, O( V
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,% S9 c. R8 r6 o+ U
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
. z# h( u: { C7 @8 ^ V temp = 0x00440040;
0 |. s8 W; Y2 \2 B1 k, b writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
4 \ l5 {# X1 k# r8 { temp = readl(IO_ADDRESS(RCR_ADDR));6 t6 G+ n1 P- ?3 \
printk("temp=%x\n",temp);% ~; e# v- _# }0 D
//XCR2 a, i5 ^& P" F9 \4 p' _* o' `$ A
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- E/ m5 C: r0 W/ `+ `( D, }9 ^
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
6 [( Z, ?* ~7 Y: T! p; q temp = 0x00440040;" n8 x6 I6 u. U5 }
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
$ E. X" S: B+ [ temp = readl(IO_ADDRESS(XCR_ADDR));" O; e& ?' S- t+ B5 `6 @
printk("temp=%x\n",temp);. N. V' o6 X4 p" ~& \- {. r
udelay(100);
8 O( K9 p# A+ P5 M4 X% D //SPCR Register5 u4 i+ s2 L# u4 p5 E. r- `* c
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1" F3 l$ {" F& T7 l2 m9 U5 I5 B
temp = 0x03C10001; //DLB = 0 VS DLB = 1
6 g3 m. L8 _" b: ~- W writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
% t3 B$ n8 E$ \! R temp = readl(IO_ADDRESS(SPCR_ADDR));
+ |4 p+ C0 E9 Z+ v9 H' M* j; U3 I printk("temp=%x\n",temp);$ C6 H- i# E7 Y8 Z+ ?3 O
udelay(100);
" m! `: }& k! D! |
2 d3 w6 d# h+ Z2 V! O1 c //set GPIO direction% T W3 _0 J$ x# Y) a
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
# @# r/ T% k* h* f temp = temp | 0x00000100;//EPR----input! j2 B7 P- r. h- l
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output7 G* K8 s4 Q% i0 s) v
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
6 p, u+ I, M! v q/ ]% q
" M8 n0 r, D$ s. s# Y v; w6 O# l j return 0;
3 g4 A3 r) Z( B2 x3 |; z}* E a% |5 G4 m4 E# F, c( W
static void __exit MCBSP_exit(void)
% a/ D+ f5 D& s) N/ F; j{5 H C" P; d. L
printk("mcbsp chrdev exit!\n");
a: Q3 a' T+ o: T) W cdev_del(mcbsp_cdev);* d8 s, C l* t% H) l0 n
unregister_chrdev_region(mcbsp_dev,count);( P: j3 g& v. r% C) B
device_destroy(mcbsp_class,mcbsp_dev);( `' o# ~3 j3 R" K0 z6 y
class_destroy(mcbsp_class);
, U! l1 ]4 ]5 p! B, D2 S$ q}
" H3 _9 g3 S( Y& g+ Omodule_init(MCBSP_init);
: A. K& R/ a* B$ ?$ f, y7 Qmodule_exit(MCBSP_exit);& _% X+ m( M+ ^) m# H
- m: M1 s4 Z# s" K0 IMODULE_LICENSE("GPL");
$ o2 z! H4 F4 F+ t- Q- B9 }" Z# N( C
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
/ M" g" ^, W6 B9 D我的应用层的测试程序如下
% t3 p8 B; K; S. B n#include <stdio.h>
i, |; B8 V3 Y; f6 k: N3 e: E#include <string.h>
: `( |. N1 i1 @$ z#include <fcntl.h>
! Y: R2 n5 \8 t6 I! d! @' _#include <unistd.h>8 B0 o. U/ H8 s; r
#include <signal.h>9 S1 w0 P$ H" c/ }
#include <pthread.h> //线程
8 e5 U5 w" t" d; e. L#include <stdlib.h>; N: T0 _8 ^% F8 \$ C& a i e
#include <pcap.h> //捕获网口数据
) T( u, [0 w- ?& S& M#include <semaphore.h> //信号
! s; y5 q' V( l3 d$ [#include <sys/types.h> //消息对列
- K1 z- e7 T8 q1 ?2 d1 f# D#include <sys/ipc.h> //消息队列+ c1 P* @+ G- Z! X# W: w: G& T& F: W
#include <sys/msg.h> //消息队列
, |6 o$ W/ G8 @: ]7 K& |#include <sys/select.h>
1 v4 ]. O# ^* Q& o/ C8 `2 b#include <sys/syscall.h>
. S2 N! v: I& ]4 R- q#include <sys/stat.h># U0 a, y) m8 ?
#include <sys/mman.h>
8 ~- j- c2 d0 d0 E" V9 i( s#define msleep(x) usleep(1000*x)
, e2 l ~+ [5 L8 A+ k7 t* K; G8 {1 K- n
int main()6 K- D0 b6 f7 s3 q. L1 Z. a
{ 4 L1 [( a; a1 q5 t( s
//MCBSP,ARM与AMBE2000交互设备
' q4 H+ ^ Y1 V& m6 b1 v# a int fd;- B( `. Y9 U3 l! ^0 {, J d! W
unsigned short data_write = 0x5555;& Z9 q+ T9 X6 g
unsigned short data_read = 0x00;; A) I" z- d; e4 X; q4 @) v
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
* Q0 T; S8 q1 q6 `! d" i' p0 m // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
* z6 g- v+ F. _ . e. n k! v$ e4 Q" ], s0 h; ?
if(fd < 0)9 j% C# R L2 c- f! H1 s
{
* ~2 S) B: Y( G& K2 e) Y perror("open failed\n");1 t- `# \1 t% ?! i
return -1;/ _' f1 a6 F' L* F
}4 Q( [) j* ]: b3 j" C6 i5 A1 x
7 |) ]+ p/ W" b& s; j3 F8 F6 Y& _
while(1)
* ]7 T4 E3 E# \ B {
, o3 T8 X& |8 K7 u
, F. P! |& h- ^+ ]) H8 ~ //AMBE2000每次读写是24个字为一帧, {4 Q% l' D$ ~/ A
//写数据时将数据在底层存储起来,等到中断的时候再发送
5 j& y; ]6 f7 {, L* S //AMBE2000输入数据是以0x13EC开头的' m, k3 }/ C' P" A
write(fd,&data_write,sizeof(unsigned short));
1 r7 F# T: p. }/ z, O
5 o6 Q0 O9 E7 R! a* {" D+ ^ //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 + M( M9 D# z. O% d6 j
read(fd,&data_read,sizeof(unsigned short));" b3 @* B, u; ^% \9 [/ `
9 l0 C; y4 G- } T6 ]0 G if(data_read == 0x13Ec)
- H" f) C- ^" n* S {
7 O$ ?: k* r9 A0 P$ {
6 y6 H/ Y( q1 c4 X. l printf("data_read = %x\n",data_read);+ W- q8 z. U4 @4 P/ x. O
}( f9 d0 h6 F, t1 O6 j
' o: L f% u$ d7 p: Z8 u
msleep(10);/ d* P# M! ~7 ~/ \
! ^6 J" Z6 u6 g% |2 ~! R /*( C; t0 u5 m) v1 b7 r! m
ioctl(fd,1); , j: T( a3 h# ?! V- L* V O0 s
sleep(1);4 J( K+ Q- ^* _% Q) d
ioctl(fd,0);: ]6 z9 G0 O0 C
sleep(1);
/ Z" K" c; W1 y e- `9 Q */
5 ~9 C8 W E: `- p) E- J- b- B } ' d' b3 [) `- ^7 o4 a
return 0;: M/ T' a5 {* P0 h8 o/ \* [5 ~
C4 {9 m% q4 M9 T}% j |4 F3 k2 |4 A8 m
" D2 Y) |2 B+ X/ ^# G5 p9 Q/ G多谢各位指教,谢谢! 急; x! h1 {$ G Z+ p. L5 q; h0 Q
( `' |: F9 k5 i0 p) P. e, I
& \! G% B# y# n* s S& } i# R) q X
, P- |1 R5 A7 B3 o# j) u6 z
8 R3 [6 h3 \8 E3 f |
|