|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) i2 ^) b ?4 U/*' m2 d7 T/ J- l, F+ I
* Copyright (C) 2009 Texas Instruments Inc( j0 z. U& a- _' w( M. w8 R* G' o
*
, C" R2 A4 W2 d I * This program is free software; you can redistribute it and/or modify8 K# Q! {# A2 p# f0 {- Z
* it under the terms of the GNU General Public License as published by
# ?( O a. E7 }! s * the Free Software Foundation; either version 2 of the License, or% R( ^$ m' Q8 T
* (at your option)any later version.
v4 }" |$ J( n" }" L ** P% B# S% T ~# L
* This program is distributed in the hope that it will be useful,0 `# D5 }' l5 B5 l
* but WITHOUT ANY WARRANTY; without even the implied warranty of7 j7 s( `7 g& v" D/ Y$ X/ k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 O, I- o q* R4 m3 j% I: W0 z8 D! R7 x * GNU General Public License for more details.
* E$ G, d1 g( } *
0 W$ p9 _+ E' z6 p# M2 Z8 D * You should have received a copy of the GNU General Public License
* ]5 S5 ^; O+ g4 y! U1 w * along with this program; if not, write to the Free Software
& y" F1 q2 a6 D% T * Foundati
6 h0 R% x. A0 w, z' j# {, i*/8 o$ w* z Q' Z+ @
#include <linux/module.h>
3 J& Z) w+ ?- M) r1 e#include <linux/init.h>9 y3 D0 t1 T- ~2 H8 ]
#include <linux/errno.h>/ A$ Y8 p4 } C
#include <linux/types.h>/ `# Y2 y2 V+ ]+ l4 F% o0 ]
#include <linux/interrupt.h>9 ~9 u8 k+ J" ^" Z
#include <linux/io.h>8 ^7 V; M9 C9 d, I" Z I
#include <linux/sysctl.h>1 _' D4 j- h& P$ {2 b6 }. e; s3 t
#include <linux/mm.h>
" H: b' h$ \5 o6 x#include <linux/delay.h>
7 O# h i6 d8 p) i I#include<linux/kernel.h>) c+ J. _3 N: w+ E& W
#include<linux/fs.h>
6 a6 H" W' Y8 v0 Y% P5 E; k#include<linux/ioctl.h>+ P, i) Z; M: {. w3 E. h
#include<linux/cdev.h># W0 d& |" \9 c( a. a# E
#include<linux/kdev_t.h>
6 V' w1 Z- o; Z4 K2 t5 K& H5 D#include<linux/gpio.h>8 _1 [2 o! {0 K& e8 `
#include <mach/hardware.h>/ B8 ^! Y' m' h3 b7 U
#include <mach/irqs.h>
( z Y) n& t) e- j' t9 m6 E1 `* |& _5 P8 G x0 A4 U- z1 S! H t3 i, F0 W
#include <asm/mach-types.h>
* K# e7 |( D$ O, _#include <asm/mach/arch.h>
% s, \" G; \' f#include <mach/da8xx.h>
1 j0 }$ x7 r* T* C#define SYSCFG_BASE 0x01c14000# x9 V3 Y9 q% m8 |+ Z$ o2 _1 _- V
#define PINMUX1_OFFSET 0x124
9 ?8 J3 i5 T- n! ?( n2 M#define PINMUX18_OFFSET 0x168 ! `- h) J/ `- V; V
#define PINMUX19_OFFSET 0x16c' S8 E5 |, v& Q
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
: y9 D0 M |& l$ ~% a% R6 y9 t#define RCR_ADDR 0x01D1100C //MCBSP1_RCR, }6 z6 C; t! i9 T0 \- l% H
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
/ z4 w. B! o# L5 A: q#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
. U2 N$ C( b/ k9 H" E$ C#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
* e- p, W, Q" \ x
+ K6 `6 Z8 h: d! t# p: r- A#define DXR_ADDR 0x01D11004 //MCBSP1_DXR5 T0 r; X8 @: B q7 F N
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR9 [: Q/ h: X# _" |
//PSC: H8 a2 R+ p6 d' \$ J7 B: O
#define PTCMD_ADDR 0x01E27120
- W m) d2 ^" q/ z$ O#define MDCTL15_ADDR 0x01E27A3C
2 h1 X' ]: V6 ^# h- \- S#define PDCTL1_ADDR 0x01E27304
: A- X; G6 j, t' h1 E! D//GPIO8 direction: h# X/ h' H* h( p. }9 z4 J3 f w- ?
#define GPIO8_DIRECT 0x01E260B0
3 ^$ u8 j# _4 v$ ^9 o `#define GPIO8_OUT 0x01E260B4( u) }0 K$ Y, D1 Z. s' a
#define GPIO8_IN 0x01E260C0
& ~& E+ ]* @0 c/ q6 ` q; ?: {/ g P9 Q& G6 d
//#define MCBSP1_RINT 99 + {/ Z; I, f% S8 w
//#define MCBSP1_XINT 100 ) Z: r& e- I$ \; e1 U
static int MCBSP_MAJOR=239;
/ \7 X- W* b" G$ ~" Cstatic int MCBSP_MINOR=0;' H8 w& G# T; X' }; r M
static int count =1;, c7 [8 P# z' u" U* U# a
0 E# {$ M+ F c$ `
#define MCBSP_NAME "MCBSP-device"
! a1 q& a6 O3 j7 O; H6 y7 w
* K$ O2 o) @! v6 f$ Z6 L2 }static struct cdev *mcbsp_cdev; x" F. f6 ~1 N8 {/ |, I
static struct class *mcbsp_class;. z; ^+ d9 t- Z% J& J/ ?
static dev_t mcbsp_dev;
u8 P0 B: f3 M4 }" U& W- n* Gunsigned int DRR_data;: Q1 g9 H5 v) S
unsigned int DXR_data;9 r7 U* x: Z9 c* O1 t; S
static int mcbsp_open(struct inode *inode,struct file *file)2 x3 ?/ I/ i0 M! J. M5 j5 ~
{) g/ i& ]% j& ^' u" J, C* |2 }
$ H$ l7 n! ^; U* r; g1 b) |3 W
//interrupt enable,initialized/ D `/ \- V' O- p/ K' F/ i
unsigned int temp;
: Y8 X/ t* \% \* ]7 t: i //SLEEP_EN(GPIO8[10])---0! p( L3 r W- h i3 T4 ~/ J
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" B% N$ t: Y# q8 x3 J" o
temp=temp&(~0x00000400);
1 m- `. v$ V, _, Y" V. k; m4 d; h __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
( y1 _- {) t3 w8 D, ] //RESETn(GPIO8[8])----0----1& |& n# r5 e# s8 E) R" h k; [
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- e) l2 A# h4 ]) x$ T% t temp=temp&(~0x00000100);
( J7 _- C! w, H8 n: ^& h% S __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, M2 Z7 T2 ]3 W: h; z4 n5 \4 L
udelay(100);0 d; t# l7 `- ~' I/ @
temp=temp| 0x00000100;
$ t, v% D ^: J# R" ^- J7 O __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
! n3 ?& k3 v; K udelay(100);! x n$ b' i7 e+ m
printk("open success!\n");2 f# O! K P2 J4 }
return 0;2 Q1 k' v# f) A; K- b5 z* I: T
}) X5 a; b' ?7 v v& _1 K. i
" I/ n/ ^: T* X: [5 x' m
static int mcbsp_release(struct inode *inode,struct file *file)
2 s' t5 L0 r" f7 R) p/ g: L; ~{
' ]: c( Z% J# a [% ~6 q printk("release success!\n");
. J6 c$ ?$ H( R, j return 0;& h% {$ s! j+ H9 h
}
3 k7 B' k% v6 Y6 B/ U$ Z ?, k4 x7 |! @- B4 n' }$ c
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
# t, j6 @, d, d) v/ U( d+ x{
( u( F+ L& X" }( u4 Z copy_from_user(&DXR_data,buf,len);7 J( x! Q/ b3 Y0 j2 R; m
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
/ H; X# v4 @0 a7 X" C/ n return 0;
/ Y* m/ f1 R& f 7 r7 d7 ?+ J. J1 J! Z- T f
}+ Q7 j p+ {4 P
5 f. ~. X' m8 v$ C) ^, L
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off) V9 W" o% Z5 s# l }( ]* l& b' {
{
3 L* r4 w, @0 f# h DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));+ P/ ^( S& n# B' j V
copy_to_user(buf,&DRR_data,len); ) m% |+ g' q, A( T# P1 ~' e
return 0;( u$ d5 A0 Z" x9 @
}* |% j5 l, ?1 }2 q# g6 q
$ \$ @9 C0 i }, {: P
5 Y* j0 d5 |) O v2 Mstatic struct file_operations mcbsp_fops=2 }7 c# u1 } |, c5 K/ I! h5 R0 _
{& W, |* R, p' E+ E' Y8 Y/ ^
.owner=THIS_MODULE,
8 ^& t& D/ k! U& B( m1 [ .open=mcbsp_open,7 F! |0 z# t$ J1 p9 `
.release=mcbsp_release,: F! Q3 t! m/ R X; d: F1 {# @
.write=mcbsp_write,
4 q8 r! n$ Y3 N. { .read=mcbsp_read,
3 U0 L$ M; f( z8 r: N# W6 ~& a};' C4 j l. s$ M0 i
static int __init MCBSP_init(void); C6 P8 @( v" L* ~
{
2 L4 K, [* Y+ C: z# L int ret;
# y1 E7 t2 U5 r unsigned int PINMUX1_REG_old;* n) h8 N" n- T6 l1 V1 e
unsigned int PINMUX18_REG_old;
$ U4 L# G* ?# U6 ]( B$ u: U unsigned int PINMUX19_REG_old;
, g# C; v' T# v4 z! }$ n, t, r unsigned int temp;
: B' O; y' G% @- A2 C1 a if(MCBSP_MAJOR)1 H5 l* V3 S) |) ~" V* @* r7 K
{
- i3 q' G/ A8 R9 s) O mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 w4 Q$ w2 C& K
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);$ F9 [) W3 v2 H' S M6 T" [
}+ U c! X% E4 }+ L0 u! D H( Z
else, B7 ]) O" D6 M# D) z L. o
{2 n* W! E5 o' C3 I& r
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 @3 \! M. s( z- b ^ MCBSP_MAJOR=MAJOR(mcbsp_dev);' s; E+ o! \' I
}
& R4 Z0 r( B7 \. V$ C
4 ] t( W& b+ w: z6 R if(ret<0)
7 B: P- M( e" A3 n+ j) G0 ^. G4 y {- x: f& y; d, _/ j, f
printk(KERN_ERR "register chrdev fail!");/ i$ f0 w8 k4 ~/ R- ^+ w0 U
return -1;
3 M d- M& K. L/ M) e }
1 u. Z4 a- X$ e3 h: H3 H+ r7 B! k : L- E) R9 ^( f7 |* M
mcbsp_cdev=cdev_alloc();2 p9 E' v& u& B- `) I
% \* D$ L( c7 w# F3 ?, x$ k! G
if(mcbsp_cdev!=NULL) s. f0 k3 x, q; V; r/ O
{
# [; k) w$ C2 P' K cdev_init(mcbsp_cdev,&mcbsp_fops); M; S. B, t: R& }5 f& T2 O
mcbsp_cdev->ops=&mcbsp_fops;
( k# k" {$ r/ V mcbsp_cdev->owner=THIS_MODULE;
3 o; Y/ k- E p. T
! Y8 `7 P8 M6 e9 d% G. N if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 o; k' q1 U4 F1 k( s! s8 ?; ~& u8 u
printk(KERN_ERR "register cdev fail!");
0 ]9 ]5 w) M! _/ E; q else
* m, O0 X7 _# |6 t2 D, k7 Q printk(KERN_ERR "register success!\n");
8 J4 V% q; {. P0 R1 P7 \( U4 m* C( F }
5 ?! i# j3 s2 g8 a else/ P, ?5 n/ P1 P! I
{
: S7 W3 }' {% u9 o; E$ ~ printk(KERN_ERR "register cdev err!");
3 U" {- Z2 S& v& F return -1;& Y1 n/ b$ S: j% `5 @
}. ~$ N/ c% Y7 X+ x' B% s! u O
' d7 t6 B5 |5 s( M" Y4 ~( ~ mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 {) ^7 w# }' C3 ]! l. d if(IS_ERR(mcbsp_class))" s6 U2 |" R! @/ X4 t, F" X
{
, `% |2 J5 c; W printk(KERN_ERR "register class err!");
w( F+ V; d/ \ return -1;; Y. [4 C- j- E5 ~
}
* W9 R2 E& Y) ~& w j0 h5 S! ?, p device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);+ M# f) k' _) u) c
1 C. M: ^' V4 i; U2 G //PSC
5 G0 a6 @1 f6 l* l //add Enable MCBSP I( @% Y; v5 \9 {) {2 k
//test% y1 S6 \5 Q6 b2 w d3 H
temp = 0x80000003;
6 w1 l9 b e( h, ?& q% C writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 k# K$ K f1 I* \! n* h! Q0 s
temp = 0x00000003;6 l% ~. D4 K/ O1 ~
writel(temp, IO_ADDRESS(PTCMD_ADDR));
2 ]* |& `- g3 ^4 c5 v) I
! e& `4 B' r, P' V temp = 0x001FF201;& m4 e1 ^$ Y- ^4 b* ]
writel(temp, IO_ADDRESS(PDCTL1_ADDR));1 U4 D- r9 p# x: z5 g4 H
z# T3 W) h0 n$ m% p1 I* G$ `
//PINMUX 6 F3 E& O1 C1 s# n" p
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,) C0 O2 x2 a' d+ R, Y# }- h, C
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); C+ I, n9 L6 t& Q) k+ d
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
: X4 L4 i) j* K) W/ \& Z* o writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);' W! J7 w/ Z; Z: J5 I* e- P5 u) b) ?
9 K8 P2 k1 M% |$ |0 W6 @$ k //SLEEP_EN,EPR,L138_SHK1,L138_RC9 E2 e. X8 N- r5 \- ?- _
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! p& x; G+ S1 {. z8 ? PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
O: [0 _+ t3 k# j7 ?! n- Q writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);4 Q5 Y/ U. y9 X6 ]1 E4 ~
9 ]# b7 u4 O: r
//RESETn,L138_SHK2
8 H% i K2 A7 y3 R5 z PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); - J! t! S' T, D
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
$ Y4 L2 K; P4 f! O5 a, @8 v writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) W5 M5 E% Y9 e! M2 L
& `4 X# m% R: w" Y& B0 ]0 X
; H7 X+ o6 k6 W/ B! s, A //SPCR Register5 S F: `+ j6 {, `2 r
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. \, f' L5 m; s1 M }8 N# `- W4 E temp = 0x03000000;//(DLB=0)
3 q: n. o: q6 N7 z // temp = 0x03008000;//(DLB=1)
; S+ z1 z0 ~. \' w V$ X writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset* H: S2 D/ n8 m4 i4 ?
temp = readl(IO_ADDRESS(SPCR_ADDR));
+ X2 ?! M& I) \ printk("temp=%x\n",temp);- }& [7 d, U9 ~( b9 S
/ K2 e* t$ C2 `, E. i //PCR Register
9 B) L- E* f+ [8 J //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 E5 [! D1 s# ` // temp = 0x00000F0F;
1 J! Y; H/ c m# u! d+ a& q temp = 0x00000B0F;' }1 T, e' O) J: l/ m/ e' M
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
1 G# i4 {+ f" r' E5 p& } temp = readl(IO_ADDRESS(PCR_ADDR));1 X3 R/ X3 J7 e* b" o z, \& p" f
printk("temp=%x\n",temp);
3 y6 S( x) k8 u0 E //SRGR Register
+ i! [+ B) o$ y4 h1 a9 u //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11' r4 a, L# \+ ^* J1 u' [5 q
//temp = 0x301F000B;( [6 X& n7 g- f3 u6 L9 D
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 5 Q( o" B7 P/ Q4 T$ f# i
temp = readl(IO_ADDRESS(SRGR_ADDR));
- v$ }" U7 B4 \8 e printk("temp=%x\n",temp);+ r+ u* W: P+ o* l% q
//RCR
9 o9 @. g6 P9 u! f8 C //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,0 X, s4 ?% n i. i( x0 w" u4 [
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 E$ c* Y; n- _6 p) q; F8 h3 e
temp = 0x00440040;
( [# g* T: N) V5 m writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
6 n3 J+ a" V0 N2 H4 a. C temp = readl(IO_ADDRESS(RCR_ADDR));& {' Q) B) Q. f; U
printk("temp=%x\n",temp);
" a0 J# h. q# n1 K( U //XCR
) i5 f' |+ M+ g. t& M //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 y* r$ d' v z- u
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 e7 s) i i+ h( G
temp = 0x00440040;' t3 S* j& y2 q7 L5 i* A$ Q
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
3 J0 p" v" q9 y" P temp = readl(IO_ADDRESS(XCR_ADDR));
" m# x+ _5 ^6 l) T+ K) q7 [ printk("temp=%x\n",temp);, v" \( [& v4 j, |% C7 l) y R
udelay(100);0 V1 n6 g( {' V i
//SPCR Register" U& B w4 ?6 K% `4 }) [* m- @
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
& ~. d: o6 q" Q" \6 `0 V. v temp = 0x03C10001; //DLB = 0 VS DLB = 16 b5 ~% ~; p( r
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
( Z- W0 O4 a( g temp = readl(IO_ADDRESS(SPCR_ADDR));& o( k5 U, f; M: I8 ?" f
printk("temp=%x\n",temp);! k9 K0 C' l1 F; B5 I8 }+ v
udelay(100);# j- I" e& c, P. h- m1 ]% h
; ], Y. z% Q/ T2 H9 F" f9 V
//set GPIO direction
! q$ ]1 F3 M) D7 U5 b3 x7 D+ ] temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 O. F/ K! E1 g4 r1 a9 v* J temp = temp | 0x00000100;//EPR----input# {+ V* t2 J5 i( `; {* R
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
% I! F( Z. C: ]" a r, z3 ]3 _" q __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " P* O, v0 d9 I2 r9 {; F! t8 m
4 Q, ^+ C) f2 G: R" q# o$ b& z
return 0;9 R$ Z- {4 f. d; H7 A# ^; ?
}
/ u* ?& r; w2 ?, M2 xstatic void __exit MCBSP_exit(void)5 s( i3 c: y3 ~9 s( f% z5 k
{. p3 |, \0 I+ z, N8 `
printk("mcbsp chrdev exit!\n");& a0 k5 @7 }" q5 b
cdev_del(mcbsp_cdev);
4 y0 t- Q' ]5 B7 U- q* z$ [) g$ W3 v4 \ unregister_chrdev_region(mcbsp_dev,count);( C n0 Q5 G: ?- @
device_destroy(mcbsp_class,mcbsp_dev);% Q; V* a+ A- F. V
class_destroy(mcbsp_class);& i' t: ?( C- s2 n
}8 f& Y0 Y0 @) i; E; c
module_init(MCBSP_init);
; ] E# w9 X3 z1 N& L& Umodule_exit(MCBSP_exit);
% Z* A% L. U% O: B0 t% J3 U2 k
, G0 H0 t6 j- CMODULE_LICENSE("GPL");$ Y6 t; [ |( P! r+ Z7 {/ I
0 O1 j5 T; n$ D/ Y
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
) z& v' ?" v- O6 l5 Q3 n我的应用层的测试程序如下
# ?3 O! n; e$ R6 X#include <stdio.h>3 `& F0 _$ W( M* R8 F. `+ e
#include <string.h>
4 m! [. v) R# {) u#include <fcntl.h>
7 t: v$ U+ F) E8 q% | \#include <unistd.h>$ A3 r4 G% L+ j+ Q7 U
#include <signal.h>1 N- @7 }1 f' T- J
#include <pthread.h> //线程
* q% b" M8 h" ^, H#include <stdlib.h>9 i+ z% \0 W' O8 j
#include <pcap.h> //捕获网口数据( n" \& k6 M E: w7 l- Q- ^
#include <semaphore.h> //信号7 `& q* Q7 l' b6 w, w+ S1 s, `# K0 O
#include <sys/types.h> //消息对列7 ]( |) K' z* ?3 q4 y7 F/ m
#include <sys/ipc.h> //消息队列% z0 Q; z! o0 i$ p0 Y2 t
#include <sys/msg.h> //消息队列
2 j) \ q$ S: ` ]! M4 r; Q#include <sys/select.h>
& w, O- g; _# M5 w. a3 U/ h8 Z+ S( |#include <sys/syscall.h>; O$ T0 |: c: B! S, J3 e7 T
#include <sys/stat.h>
$ H$ c7 r! O* \6 D% X# k* Z5 J: p$ ?#include <sys/mman.h>1 C/ W7 N H. J9 R9 W: k7 _
#define msleep(x) usleep(1000*x): a# T2 d7 i3 e2 {5 H
( w- t) C$ q" M7 ?6 J& ]2 mint main()7 L+ \6 Y. N( E' u! S# ?. A: U
{ $ J5 @3 P& g) L9 h5 L
//MCBSP,ARM与AMBE2000交互设备
* U8 G D. i2 ?2 ^: r) e int fd;* {* e3 K& G* v9 M2 Q" L% I
unsigned short data_write = 0x5555;
; e! q, A: p Y0 M& h& S: ] unsigned short data_read = 0x00;
9 @: l: k1 J- \3 o) e fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& \/ j) y7 l+ d) S# [ V( b
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
% r; J1 v$ s1 {; D; u5 R: h
( H# f D! d9 g+ Z4 R if(fd < 0)0 R7 n* G3 o3 C. y
{
9 g( ?% [- h+ F# ?/ Z perror("open failed\n");2 R0 ?: e) `; w6 B$ W5 o& k0 d
return -1;
- G! _4 y. T: s# P4 Y3 w }
7 _4 w. Y ^5 [/ o; z2 [/ Z" ] ) H( [2 L; q9 b; m& K/ d* ~- r
while(1)4 T3 |6 B( |6 B0 h3 F
{3 g7 X2 _; A& F. _ I
, E! P# g- X( C$ ? //AMBE2000每次读写是24个字为一帧0 Y/ A+ M9 ?) R( H
//写数据时将数据在底层存储起来,等到中断的时候再发送, c- I% g# U- D: R
//AMBE2000输入数据是以0x13EC开头的+ @2 _% N2 p0 z
write(fd,&data_write,sizeof(unsigned short));
6 q& J& y0 t K2 S0 P 6 _" B$ S2 E1 S* W3 P
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
% E, P* m1 V- u9 V, f) t2 S6 c$ f. r read(fd,&data_read,sizeof(unsigned short));
- P c4 V( `, I8 Q+ u/ `
^* o/ F4 G7 L+ F if(data_read == 0x13Ec)
- R8 F- W3 R1 q6 H6 ]' C {% X% j4 C' l- @0 `! f+ d) H3 K0 N
: Z% y+ ^ W; s! {9 p4 t6 w
printf("data_read = %x\n",data_read);* n N* I' U2 z
}+ X( D" |7 g* E
+ d' p: I* |( J' a, m# J msleep(10);
3 ]: |# C% ~9 o: n' {% o# X) H( v4 _" Y
6 [1 A2 Z; c6 P1 B /*5 C; w! W. L: u3 l, M
ioctl(fd,1); ' A3 F- e0 q; j Q; n. c9 q
sleep(1);" R3 _$ s6 ]6 M/ F L
ioctl(fd,0);
- i3 R- t/ P2 s7 G7 S, C# Y! p" k+ S sleep(1);
( r, \1 N# W/ i* q */ 4 B8 S/ w% u3 S# _( W
}
# T3 c; T# M! `+ d7 O. z return 0;" a2 R. X, W) ]. m4 F" @2 h
8 b; w: h) c, _7 u: u. g( a} l5 m; Z* f, O5 W
3 I; H- `3 F2 r! u, F多谢各位指教,谢谢! 急
. h# A8 T- J x' \0 g2 c0 v$ ]) |5 S5 e: P
' d8 S! x/ J2 {& Z7 ]* p
' |, b3 Z$ J3 }; Q. i& i+ L
3 g( m& H9 ^! y c* j5 U
2 A+ {' d6 i5 C- b |
|