|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
, h) V8 E0 r4 U! W' Z. |/*
9 |3 _% E6 s! V. |2 A8 y8 I * Copyright (C) 2009 Texas Instruments Inc
, ^! l6 n$ H3 R4 ~) S# H* w+ R; N1 F3 s1 n *
& }/ G H9 B9 ?7 m$ K8 @# z# r * This program is free software; you can redistribute it and/or modify
. T; W- U" _# K" E- }& w) q/ G * it under the terms of the GNU General Public License as published by
$ l+ ^9 }" n9 l' Z. a4 A * the Free Software Foundation; either version 2 of the License, or% g" p ~+ I7 n8 M5 F: s
* (at your option)any later version.( W" ]3 a! g |, a
*9 o4 C3 F5 U& C+ j& A: P- A
* This program is distributed in the hope that it will be useful,
; i$ P7 l! ?" \. n * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 T) l$ l2 P; X5 u * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 A" H. a* w$ ` F' L * GNU General Public License for more details.
1 x) q4 U6 c3 `) D" X- P *; D- u R5 n1 ^7 Y8 V3 x
* You should have received a copy of the GNU General Public License
4 d5 J, t$ k5 Y: M * along with this program; if not, write to the Free Software
b9 T& g" B- I$ M" X * Foundati
7 l( {: q. H/ Z*/, v5 e# d2 e, _" n1 b f
#include <linux/module.h>. k- f! O1 t7 [) e4 a
#include <linux/init.h>
* t: m% p5 j, M- n a2 K0 Z% c#include <linux/errno.h>! ?7 k; K6 L/ U3 w" S
#include <linux/types.h>4 w/ `$ }, T8 J I7 i) Z
#include <linux/interrupt.h>
8 {, @- |6 ^9 S# ? p' l" @#include <linux/io.h>
- p) }4 ?% N+ W2 W7 _( z#include <linux/sysctl.h>. {" B4 w w9 J2 n6 p
#include <linux/mm.h>. i* z" x3 \' d% a0 F0 h
#include <linux/delay.h>
2 \* c1 g) |# `3 b k#include<linux/kernel.h>
4 Q1 c% `" t8 r; d#include<linux/fs.h>3 h- V4 q2 v( I4 I0 t
#include<linux/ioctl.h>
; j' W. i! F4 G$ p$ f' S+ }#include<linux/cdev.h>
c8 @. M8 m1 i#include<linux/kdev_t.h>0 a! x7 t( s9 g( f. x
#include<linux/gpio.h>
/ v* [) \& O! v) a. U1 ?2 z; c#include <mach/hardware.h>
# I( |+ e4 V7 c# ~+ Q8 T#include <mach/irqs.h>
5 z; f! [; h6 m0 o8 N2 I0 v( i" h s( J$ g# N+ `# M' H8 N
#include <asm/mach-types.h>; L0 ~: v9 Y. }% v0 A# [2 H
#include <asm/mach/arch.h>
9 F6 P; I! Y9 u# B1 w( {) s' [) ?0 K4 @#include <mach/da8xx.h>) d- ]/ B* {, T+ q/ `
#define SYSCFG_BASE 0x01c140006 x W; q9 M4 P! U2 o
#define PINMUX1_OFFSET 0x124 & t4 f) a5 |" v% J
#define PINMUX18_OFFSET 0x168
$ n+ ?4 Z/ k8 { L/ ]& x1 J#define PINMUX19_OFFSET 0x16c: S7 I3 E( `: S) C
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
/ x8 A+ T7 I2 s4 S; k% a#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
% l$ P7 x- m2 `1 o2 K! W#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
' v7 z* W. W- e, V+ I4 f: q#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR: T% r0 T% d' X& b1 q1 L1 o
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR# L' b \1 T/ P9 j% K
& v; Y2 p1 `# C$ N! M; v2 w, G
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
2 X @5 {9 |! J6 t# b a) N6 u& j8 v#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
) V# }$ s$ ]0 }//PSC5 d6 c) n; l x2 B/ z
#define PTCMD_ADDR 0x01E27120 ! J- o5 \( x8 \) W- f: M- m
#define MDCTL15_ADDR 0x01E27A3C
a" [9 G. l* ^2 e#define PDCTL1_ADDR 0x01E27304: V. C5 }5 P% e$ ?' d) p3 H
//GPIO8 direction
' i: Y) d+ J7 b V" I, o* r: ~$ k#define GPIO8_DIRECT 0x01E260B0
7 u' \& o) B! a$ w#define GPIO8_OUT 0x01E260B4
y/ F4 c" ^; c. U#define GPIO8_IN 0x01E260C0
4 E x) \: F% Z/ w, B; C# M3 C- U0 V1 Y4 u. k5 b! P6 {5 O7 E/ I
//#define MCBSP1_RINT 99
3 _& ~' _, A5 }, V1 X( I//#define MCBSP1_XINT 100 2 N6 T6 I. l" p) K4 V- n/ Y5 f! a
static int MCBSP_MAJOR=239;
! O5 `9 R/ A. |6 E1 R* [static int MCBSP_MINOR=0;
2 K' s- K5 @; f$ T# }; Kstatic int count =1;; O: w- S6 W1 m5 K( D6 M& n4 A
6 `7 `) H% A5 a/ K5 T
#define MCBSP_NAME "MCBSP-device"3 q- m; I0 m% A$ s
1 Y, A R' z1 S8 Nstatic struct cdev *mcbsp_cdev;
6 V" l+ ]" C0 t, ?# fstatic struct class *mcbsp_class;
5 O0 g" D( L, a$ P1 l* Dstatic dev_t mcbsp_dev;
% q+ E7 h/ a' R* ]8 b" [+ sunsigned int DRR_data;
. i) r: f9 v/ ]% Q, x ounsigned int DXR_data;( r& w* u& k6 U; y
static int mcbsp_open(struct inode *inode,struct file *file)% y2 J6 n/ O7 o) Z/ j
{- w- e/ \4 k/ w/ s: Z
) M1 a6 |; l" N# s1 ^! o! l+ w
//interrupt enable,initialized
# t% N' m3 V( T7 o unsigned int temp;9 h7 r0 K4 v9 _/ ]
//SLEEP_EN(GPIO8[10])---0
3 W8 r6 x8 J* Z- H; M temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) e8 w% v* c) n# P9 q+ G
temp=temp&(~0x00000400);
" ]7 B9 r% o7 C) t+ \ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
$ A j( m' \' h1 W/ y+ l& p //RESETn(GPIO8[8])----0----1
3 @. j% U9 r- [& Q) b: k* Z9 B temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) G8 E1 Q$ j5 Q& v temp=temp&(~0x00000100);
/ U2 V$ N' p d) p- Q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
$ P( G/ a4 G4 V- g' c udelay(100);
" t( |% D8 Q' U" f/ V( [* l temp=temp| 0x00000100;
6 c# U3 F5 l5 `* |( p __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
3 v! x/ z1 \/ k4 n# ~; Q udelay(100);3 s9 O6 {* a) P5 U
printk("open success!\n");4 V% a' A+ A) ]; M. i5 s
return 0;8 I/ [9 A( \. W* K* M. l6 ?
}, G& _4 i. G8 R7 s' z1 w1 Z" D- f
) i5 g- k& ~; R
static int mcbsp_release(struct inode *inode,struct file *file)! f# x+ g5 X5 J0 r" I3 M) i# {
{1 W' R6 }. f: P& n. o2 f8 |0 t P
printk("release success!\n");. E) I& w0 C6 f* A
return 0;- Y" Z; t F5 s6 h9 N# p
}- W4 U0 H: `. s5 ^2 K) T4 y( j0 {
6 Y* d J" @7 T* A G ~static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 D1 A) \# W! m3 R! J{
* k& _3 U+ C( [& o3 F6 j copy_from_user(&DXR_data,buf,len);
) |9 \! y" u4 o$ ` iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); : N( N" w1 W/ m' h! u+ q
return 0;2 O4 d3 W- U+ O- g
, F$ H3 S% f9 ~) O1 l
}
/ Y" M! j S; @ H9 ]1 Q3 N/ q2 Q- o) K7 G# a' U$ ^+ M
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 _6 L4 T- K& l) A1 G
{
* R V' P7 C# j3 V DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
7 `( V( X) c1 y copy_to_user(buf,&DRR_data,len); / \9 p i$ M/ `
return 0;
/ a0 Q+ t r' A% p}
" o. D' F# U- Q5 I
7 c/ v5 g4 l3 s2 c" I3 i O: V% `" s* D, I: f/ n. s
static struct file_operations mcbsp_fops=
! X' Y8 H) r! ~* Q- D, N0 ~{' p$ u, X& C2 E& S
.owner=THIS_MODULE,8 n7 e) A$ C. w' E
.open=mcbsp_open,5 d4 {6 ~8 F$ K' l/ k$ R" _; W, I
.release=mcbsp_release,
6 y" c* [5 K/ c .write=mcbsp_write,
# ~# I( |4 d) { .read=mcbsp_read,# r1 w8 u$ \5 s0 i
};
& Y- F) d3 j1 T* rstatic int __init MCBSP_init(void)
; ]* Y" D% q1 P' F9 B{4 m0 x% e9 N- o# x1 ^' Y8 n7 ^
int ret;
6 [! ~& Y8 B) `/ c! ~+ H) o unsigned int PINMUX1_REG_old;4 h7 L! E5 w2 t( p
unsigned int PINMUX18_REG_old;3 G2 z; z4 K3 M& p* V
unsigned int PINMUX19_REG_old;
$ b+ v. O/ v7 v8 x6 K/ w9 X9 A& m' b unsigned int temp; ?1 ?4 j9 T& H) a# H
if(MCBSP_MAJOR)
* L4 `2 Y) d! y* k {
6 ]+ m; Q) l% S5 d, Z6 K mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
3 J6 Y" e7 t [! `' @ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% X: ]4 U9 \" U0 B3 n" H3 }( h }
$ p2 K ~4 l; ~, _8 P& e _ else
9 I" m8 U8 w: I {
7 V6 n# P6 Y8 w Z( e5 i3 V ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);! X, Y: J6 L J; V4 P5 C4 \+ ^
MCBSP_MAJOR=MAJOR(mcbsp_dev);( Z9 X9 O4 Y' g% H1 f. ]2 j8 y
}
- C) X7 M/ Y: N0 y) p: \: K % b8 f( O8 H4 c6 }; E) {7 _8 t
if(ret<0) C$ F: i& P2 j7 d
{
# `8 n* e# M- M- U8 P& g3 t- Y printk(KERN_ERR "register chrdev fail!");
7 w" U2 W4 B, ^# c return -1;
, _9 m" F* a. P8 O7 a }
* w( y; s, L3 _ 9 Z: M% E9 {$ S1 g4 [* T
mcbsp_cdev=cdev_alloc();
0 J+ r6 c, u' F8 O6 X : y5 H, @. C" e0 C3 M5 d
if(mcbsp_cdev!=NULL)
5 x8 q8 L: D) _1 y {! n6 i( Y: v: c6 c0 ]1 a5 L
cdev_init(mcbsp_cdev,&mcbsp_fops);; A& _# B/ R, _: S" a
mcbsp_cdev->ops=&mcbsp_fops;( ^" P) U: v: j; Y1 a
mcbsp_cdev->owner=THIS_MODULE;3 X! D/ m: m5 I# R. D2 B
) y0 c. o. J6 i4 b
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( p7 R2 M5 I8 I
printk(KERN_ERR "register cdev fail!");- i3 @9 P' a( M) P
else7 Z* n3 Q7 F' Z
printk(KERN_ERR "register success!\n");
: Q; a) v8 z4 W" [* { }
* S+ z$ m, g( Y else4 e; j) M1 H0 M6 H" i0 ~! `- g
{5 _$ v! w1 U, @8 y
printk(KERN_ERR "register cdev err!");3 \5 x# H( d O b, {
return -1;2 R+ _' ~& n1 Z& r0 l! O
}# \1 a) |: S. {, U
- s% u, H" u" O
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);8 j4 [* p( j$ W2 W3 a
if(IS_ERR(mcbsp_class))* z+ H0 m( @! M5 x, u/ n- M# \0 v, _4 s
{, ~* S) P5 l& i% U
printk(KERN_ERR "register class err!");
( k0 F8 O3 O% m0 z; ~' r return -1;
+ M8 A3 i- e, C+ c }" ]3 j9 l! i: M3 y( K; `: }
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME); o c, R8 d& Y/ G" S; y% @
+ g' ~0 u2 `; t
//PSC+ } ^/ e$ [9 t3 _% K: |" z6 {
//add Enable MCBSP
, B8 a" x T# A5 ?. w0 z //test2 ?) r u/ P) i+ u; I7 m/ e1 j
temp = 0x80000003;
: M0 ~ O ]2 i writel(temp, IO_ADDRESS(MDCTL15_ADDR));- \( r. A3 i" f; J" [+ j3 g
temp = 0x00000003;- ?6 R) O/ T0 T9 J5 }1 T
writel(temp, IO_ADDRESS(PTCMD_ADDR));
" e4 ?8 w3 T! l7 s7 q! Z1 r/ ]
- u' o3 D+ j& a" S temp = 0x001FF201;
% w! d9 Y( [+ I7 K* s4 \ a5 x writel(temp, IO_ADDRESS(PDCTL1_ADDR));
8 K, T4 s8 A3 `' \9 S
8 g: C* {' Y- a1 G //PINMUX 1 j* x6 `4 h/ j' G9 c: D
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,2 F! G( }, E" z( a7 b/ o) O U
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 7 z# p" \3 h: ^6 J* L5 d r2 z) Z
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 9 u) [6 y2 }8 l4 c5 O3 \# T
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ y4 M8 k) c& p* e& ` & M" ]! o5 p8 `9 x# s& C- J
//SLEEP_EN,EPR,L138_SHK1,L138_RC& l- V0 E8 h* m
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" C6 R+ b- \8 H! @9 H PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
1 L+ \, v; A4 U) m$ y7 ^. G6 | writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
5 z# X% X; {# g" L5 `- E, Z 1 O B9 W, ]- O5 j
//RESETn,L138_SHK2
: Y! `! B3 i# q, [ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 7 f$ e. Q+ R6 m/ D
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
$ t, T1 a# v. u5 e9 \: _7 L3 v0 L7 ] writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 R2 M9 r! A9 |4 W) l: N @ 0 q( u! h% h5 ?0 A, t& G( o
/ w7 T4 j2 n" p2 ?; W- z4 g7 `) x+ v
//SPCR Register5 c! w$ T% {8 X
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ G N0 R! Q# l1 q
temp = 0x03000000;//(DLB=0)5 g2 t) {% q- X! h( I/ \0 D
// temp = 0x03008000;//(DLB=1)6 R5 Y4 y' U5 j8 ?8 h B; E+ H
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
9 Y' G6 a) a( m( e temp = readl(IO_ADDRESS(SPCR_ADDR));
( m% j& d( H& J1 \ printk("temp=%x\n",temp);
7 K1 |- z( U, y/ v4 C
1 I1 x- `3 G4 J; r. V //PCR Register7 z; ^/ m' M: D1 }4 P
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
+ C8 f+ t1 i) E/ `# r4 F' A- w5 C! y/ i // temp = 0x00000F0F;& Z( J _3 r- q- P, v, n9 Z0 n
temp = 0x00000B0F;
9 J7 B# n, `+ N) I5 A" ? writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ; Y8 b- |3 k4 ^7 i) L9 b
temp = readl(IO_ADDRESS(PCR_ADDR));
1 T W% G! E" G printk("temp=%x\n",temp);
5 A9 u2 Z1 D0 I: O! K- w7 t //SRGR Register3 \; r9 r5 e9 Z" \
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
8 R7 M7 W+ O& w0 k; g9 o I //temp = 0x301F000B;
2 o" x# J2 L! _1 y2 G. W2 d" |) Y writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized / k3 i: n4 |# `% f
temp = readl(IO_ADDRESS(SRGR_ADDR));
% i: n% w+ G$ W9 m printk("temp=%x\n",temp);" A1 _5 E! {. ^5 x. r: k
//RCR. _+ u/ D+ S& L( J6 y4 A
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,/ w0 Y7 g! d1 y# m: e8 P! B
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
' f/ i8 t8 L! r3 ?% x temp = 0x00440040;7 r( f1 E: f, [; k; a" k, B7 |
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ?/ h* \- D- s' s# w8 |% f2 j. e1 [
temp = readl(IO_ADDRESS(RCR_ADDR));' X3 `- Z) p4 g$ Q
printk("temp=%x\n",temp);" a/ H1 X l" T6 [! R
//XCR' ^) ]! I# x% _( s" s
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-16 j% b: Q2 f7 v3 T; w# h
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
' q) `$ E8 F$ i temp = 0x00440040;
# W+ \: e, F- t9 T writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
3 ~( \: n" }4 z# J7 ?/ ^' y+ U temp = readl(IO_ADDRESS(XCR_ADDR));
; n$ E% V' @) ?/ p4 v printk("temp=%x\n",temp);# _# }7 X5 B" _8 B% l ]2 e
udelay(100);
, b( S8 D0 s. i# P$ B2 A# E: W //SPCR Register. k7 O( \3 y, Q* g- D# _1 p
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 C4 p/ @( U1 ?" V) x
temp = 0x03C10001; //DLB = 0 VS DLB = 1' p; \' V0 [% Q% @
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled5 B+ @; C& P# u2 B' P
temp = readl(IO_ADDRESS(SPCR_ADDR));
! B& T1 H. a3 _- G printk("temp=%x\n",temp);
8 D; b0 X8 C: X/ Q$ M' i udelay(100);& }% p6 p( j4 p, o) c
: |1 e& b; _# s7 ^4 a/ T ^ G //set GPIO direction# e; c4 d- b/ _
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));/ j3 T# f" p; b) D$ `+ }- W9 Y
temp = temp | 0x00000100;//EPR----input
5 U. {$ J) `0 t# j4 ~ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- R! l: |& L- C __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & N5 X4 i, f; ~# T
) d3 c. p" k1 B/ g
return 0;
( c8 i( _9 }5 o3 `. J}
; a0 l6 l) k/ N/ }1 X5 U% wstatic void __exit MCBSP_exit(void)6 s5 ?. f ~5 F. l# y
{1 O% Q" B- U. G+ B2 S1 E$ U
printk("mcbsp chrdev exit!\n");
) p& }/ Q( Y1 W* K* b, m; U cdev_del(mcbsp_cdev);9 O; i! i0 N; l5 [" X1 ~3 g
unregister_chrdev_region(mcbsp_dev,count);4 p% h1 r+ v7 F' S; z. D/ ^* Z
device_destroy(mcbsp_class,mcbsp_dev);! s7 C# _8 f2 P3 r2 @
class_destroy(mcbsp_class);( k! P, U9 U: v% F8 N6 J, C1 ~6 v
}
) M6 T- D5 w' Zmodule_init(MCBSP_init); z$ i( `5 p o- L, G
module_exit(MCBSP_exit);
& c5 u Y( `0 A; p0 j- s3 L9 C
' Q0 T B8 T \MODULE_LICENSE("GPL");
7 {) `" Y6 o! q9 D' G! D1 e* u* Z; v- ~1 b) }
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
. I; Q. j: k- r) ?3 f我的应用层的测试程序如下: y7 |1 M0 g8 Y1 ~0 \9 u0 P& G% k
#include <stdio.h>
7 N1 T1 [8 H/ I& d, \7 ?#include <string.h>
' `, V1 u! [7 b+ C#include <fcntl.h>
9 p" [% |. f) y; i#include <unistd.h>
9 W* R1 z% W% i' m2 q% X. e#include <signal.h>& k/ I1 ^6 e' v D6 S- G
#include <pthread.h> //线程1 i* X$ g8 ?: F( f' K
#include <stdlib.h>) ~/ G2 s& R7 E8 ]/ q5 f W
#include <pcap.h> //捕获网口数据
: X+ a0 O! l" a' q' l. U# t5 ^% U#include <semaphore.h> //信号1 W1 E) S6 N: I% y/ u) w9 @! f
#include <sys/types.h> //消息对列9 u' M5 Z, w) ~& n% g C6 ~
#include <sys/ipc.h> //消息队列
8 {+ F0 a; G2 `#include <sys/msg.h> //消息队列
, O- y4 e1 _$ n2 \#include <sys/select.h>
K9 V4 ^9 _% {% m. n1 m8 y( k#include <sys/syscall.h>4 X) L2 C4 t: n* v6 v+ Z. q) a3 i
#include <sys/stat.h>
% a) g* E$ W5 ` `3 f2 s9 l/ Q1 g#include <sys/mman.h>$ e6 x* m8 e1 {. m% N" y3 i
#define msleep(x) usleep(1000*x)
, P; ]* }. j$ g( ]
7 D' R3 D# B" A) o" `int main(), k7 Q7 @4 N. i
{
2 n( h. K: ?# F //MCBSP,ARM与AMBE2000交互设备
) c; E ]- e9 Z int fd;4 P2 ^8 f; E9 H1 G1 t7 C, Y6 u% R
unsigned short data_write = 0x5555;
5 ^( _( G! B5 S# ~" o unsigned short data_read = 0x00;9 K8 N, v& O+ r/ ~5 B
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
A5 S3 n, h" M7 a# H8 y4 E // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);+ G% z% A# d, M) V5 m- v1 k C
! D# o7 X% k4 k& y0 {; C- o/ c
if(fd < 0)) @' F! |. x3 T1 C! B0 x% e
{
9 w0 w* ~1 _$ V' ?1 j1 ^ perror("open failed\n");* V7 F9 }+ ` _' C9 Z* s3 b& f
return -1;! d1 R& e+ S3 B3 @2 Y+ X7 i1 e
}
2 A4 H+ n4 J! M- o3 Z6 j * W8 ]3 v. x6 {( }; P
while(1)) P3 e8 E! r0 O: ?0 p+ K8 b
{
6 y9 b# H+ F+ r5 c7 q - v! y( \! K8 c% D3 `
//AMBE2000每次读写是24个字为一帧* f- K, z" a% u8 X
//写数据时将数据在底层存储起来,等到中断的时候再发送
% y& ?. _7 B( }7 }9 j* {6 k //AMBE2000输入数据是以0x13EC开头的) ~1 V4 L- P' g; s) U6 e |
write(fd,&data_write,sizeof(unsigned short));; i1 p' g4 l% R" s% `
9 E @; c3 ?$ {4 K- [! ?' B; T //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 6 S. \' u9 A6 G* L; L6 T7 n
read(fd,&data_read,sizeof(unsigned short));
8 P0 B8 y- B, p! P- i5 B
8 ]$ h' P! c/ [# b: m& k! w0 Y if(data_read == 0x13Ec)6 b% j2 M1 d6 E9 X% g
{
* M0 E& ` N5 h3 v- R# A& j% [ . K* Q1 |) a; f x2 \& O$ O
printf("data_read = %x\n",data_read);* `8 d( L( m" _' _9 s
} p. s; j$ q+ a2 I' `1 s3 p s
. z+ C# e7 `" P7 v- ?5 O$ _% K
msleep(10);$ l, U5 j3 j c" P0 s+ ?
( i! _' x8 i0 G+ \, ?
/*
) e9 L0 D1 L& w- g3 Y' j ioctl(fd,1);
& |- [7 k/ d _; H9 ?, h sleep(1);- E+ i& s1 l9 ^) W A
ioctl(fd,0);
0 b+ m8 z( \( p5 `% o4 `, s# K sleep(1);8 o: f4 z9 w, Y# b, z0 X
*/ , q5 k% ]# a o2 ~% ?) Q8 S
}
+ J8 E, \/ H: l; }7 j return 0;- V: ?! Y- t$ i5 t% N2 c
1 b ? w! _( M# C, D
}5 n. H; D- m4 W& n- ~! s
6 a/ l) N9 z6 m# r+ M9 |" u多谢各位指教,谢谢! 急' O0 M4 ~* h8 Y
. _* `# X3 o9 y' t' a6 ~
& \) A# U X7 v: |+ w8 w
' e3 w5 N) \, H& U0 Q" g
5 x: Y# J9 c4 J7 a: ^. Q, I2 [
0 d/ p4 W: ~1 ?5 S6 K |
|