|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : M- a @' a9 z, B
/*
" A0 n+ Q5 C V: \# R) M* I * Copyright (C) 2009 Texas Instruments Inc6 h8 n$ |6 K4 q* z0 s+ ]' c6 R
*) C) e- i0 D3 _* Q' }* |
* This program is free software; you can redistribute it and/or modify. C+ H$ J" t6 G% S+ n, `' f% m2 G
* it under the terms of the GNU General Public License as published by, N6 m0 ~+ `: \! t c$ V- f& z: Q
* the Free Software Foundation; either version 2 of the License, or
, |0 o7 D& q: U: H* o6 q * (at your option)any later version.3 F+ M8 `8 d6 b
*
- T7 }% R; @9 i4 }: j& m8 r * This program is distributed in the hope that it will be useful,
! g& g8 H. x6 d+ X- T * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ p2 S# P( E: j6 n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 M' E& p( R5 O4 x5 o * GNU General Public License for more details.1 f1 \" x4 o6 R2 m3 R
*$ t, ], y6 k: g- ]$ F
* You should have received a copy of the GNU General Public License
0 t- G9 E' g' I; X$ y/ y * along with this program; if not, write to the Free Software
* ~3 }4 V6 V3 k- @ * Foundati" b8 X2 D T2 A3 r% [8 n$ w
*/9 E7 u9 z i& M; x* `' x
#include <linux/module.h>
( _1 u+ D+ f4 |* X#include <linux/init.h>& _( K: r" A; f/ `: G, ]" X
#include <linux/errno.h>
( s4 n# y7 A) ~" U#include <linux/types.h>& |! b! k" s$ U1 v2 r# K# @' H& ]2 Z
#include <linux/interrupt.h>
% w, ~) b" P5 i9 J: w1 X#include <linux/io.h>
' m2 `* l8 M V) G8 z#include <linux/sysctl.h>2 [& m' y. H* P
#include <linux/mm.h>
3 i2 K8 E: t. f5 j( H$ n+ f#include <linux/delay.h>! _1 ^2 ~% f7 G/ A
#include<linux/kernel.h>
) R6 k1 a9 q" @" x#include<linux/fs.h>
% ~" c! A7 t: D5 Y) R#include<linux/ioctl.h>
7 y, K- d( Q, o#include<linux/cdev.h>" H3 E$ w7 N# ^: ?
#include<linux/kdev_t.h># \3 G/ _$ ? s
#include<linux/gpio.h>
: q+ ^, j* q, D" _#include <mach/hardware.h>. w, j$ I! Q8 f! g) ?& y! a5 N
#include <mach/irqs.h>
. P1 q8 S+ |9 M* Z, N8 ^; N% W7 t: o, T7 w: [. q' ?/ S( U" e2 l
#include <asm/mach-types.h>
) Y) R/ M6 \: D#include <asm/mach/arch.h>+ { y7 t. E( E# e, J: d
#include <mach/da8xx.h>
) V- A+ r4 ?1 H1 k, V9 ]4 _#define SYSCFG_BASE 0x01c14000
! H( \- ] w, y#define PINMUX1_OFFSET 0x124 $ F) U1 D8 O2 | y1 P/ z& \) A
#define PINMUX18_OFFSET 0x168 |$ \: [8 A( ?3 w
#define PINMUX19_OFFSET 0x16c
+ }( i1 S, d. }2 h. Y#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR8 _: ~7 f6 I8 [0 F4 G
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR3 S7 {% U$ D+ v* S- k7 D& l9 v
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR" e5 t* j' ? Y2 ^# u) }
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR6 \2 E! \9 |4 G3 [9 v3 G
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
2 M4 q% C" e$ U5 s1 u& j/ L # R. g9 ^+ g; S g
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
- o7 I4 J' d/ K* a6 i) j+ B% p#define DRR_ADDR 0x01D11000 //MCBSP1_DRR0 g$ E) u% l1 O6 j! l
//PSC
+ v- s$ p6 m$ C! J: K5 J#define PTCMD_ADDR 0x01E27120 $ M1 B3 z7 G1 s H$ E6 R3 P$ }2 v8 q
#define MDCTL15_ADDR 0x01E27A3C4 _. s) t1 o! Y
#define PDCTL1_ADDR 0x01E27304
$ m8 p+ g) q$ L//GPIO8 direction
5 u6 C3 Z( u" @9 }#define GPIO8_DIRECT 0x01E260B0
, o. ]0 R7 v# n4 p* N" v#define GPIO8_OUT 0x01E260B4/ w) S% s1 e) b% S/ o
#define GPIO8_IN 0x01E260C05 }1 r6 ~- K$ Y Q. M* G! m* k1 L5 u
2 j1 s1 W) S; Q I
//#define MCBSP1_RINT 99 ^5 V! {4 \3 W" j
//#define MCBSP1_XINT 100 ' L. z% |- W% t
static int MCBSP_MAJOR=239;
' I& V `8 J! ~' C5 wstatic int MCBSP_MINOR=0;- v! W) t( V# ~! T. L( G6 R
static int count =1;
/ Y8 O* G' [5 @, Z" Z7 A
$ Y+ C$ d) c" C9 x/ X m#define MCBSP_NAME "MCBSP-device"8 Z7 Q. p- c& i8 m
, N% a5 d" Y9 v+ Wstatic struct cdev *mcbsp_cdev; ~" {/ m, V& O/ s7 c
static struct class *mcbsp_class;
4 ]) {( B4 H. \static dev_t mcbsp_dev;
- r4 V/ e' J0 h& K# u5 Z9 l0 m6 z& ?unsigned int DRR_data;
) W% k) O/ S& c5 |$ \, R% e7 xunsigned int DXR_data;3 \3 u; H& G( F
static int mcbsp_open(struct inode *inode,struct file *file)! u% [1 |- F7 D3 z& ~
{
# z9 z9 r7 ^( W + v/ Q9 ]6 H% f: I p B( H
//interrupt enable,initialized2 k7 r& e9 V0 w. \6 O! G5 `
unsigned int temp;3 D Y x5 E% W; c2 R; p9 w
//SLEEP_EN(GPIO8[10])---0
( w1 Y, F2 |) k2 A temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 e/ |: z0 |5 v% S: {. s
temp=temp&(~0x00000400);% J) X, P. F, q, m8 k
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( F+ M! I( ?4 z9 {4 G
//RESETn(GPIO8[8])----0----1
# l/ i$ x: \3 ]6 u, R" z temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ {$ `; Y4 S8 [$ G3 }+ q; D temp=temp&(~0x00000100);4 T; ~, t; f. X8 s2 O# Q* [7 l- q
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
0 c% T& {# S" |: D1 K& c3 a udelay(100);
8 ~) p S% `( J0 d+ \/ ? temp=temp| 0x00000100;& K# x- N' q! v
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" r) S+ t/ A- {6 X
udelay(100);9 n6 J, Y7 q0 H! X5 b% e/ S
printk("open success!\n");
/ z0 F/ A. c) n T2 J2 J return 0;
( F C. ]" X* F( |( G: Z9 `}- M% @2 `" J( c: F% `
4 L$ v) J7 V# ?& p
static int mcbsp_release(struct inode *inode,struct file *file)
2 d! w1 M! f4 l- p5 v{
" H" G" C- z$ K, N7 n$ ? printk("release success!\n");
7 n7 i& i @$ W* }/ w: Q return 0;% T0 I) w W9 i5 ^8 M& D
}# W/ i2 j% _- v4 m$ _! i
' [" a8 }2 H }8 w2 [ ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
: H' W M! ^* O, v! R$ e s{. N+ y* \( Q+ t% a. y/ l
copy_from_user(&DXR_data,buf,len);
/ @4 C2 e+ \: j8 r& i5 V' `% ] iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 2 f8 h- K5 k8 k
return 0;& J6 T" ?5 m% m9 O1 p* Q# r
5 O9 q% X: h+ W! W: R) e- Y
}3 s; g% }5 ?, f+ I6 j' W. U, W
; F3 i$ F: d5 m& r! Y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 P- g# w1 N0 n9 x+ Z( } R{
: a7 ~; O* t" T' X& S6 h DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 P* j6 K5 U. h" K& N
copy_to_user(buf,&DRR_data,len); 8 P/ L( H. W+ I6 n# B
return 0;
0 M) {, N( o! n4 y$ }1 c6 ]}
6 D* s+ v/ W; ]5 K. n- A2 w' ]9 {8 `, B. [+ u! }
* b) O# G A5 g- X+ ^6 |$ H: x
static struct file_operations mcbsp_fops=
6 ]4 J% Y% f8 F8 E9 c{
; _* L+ R% s" @ i" B. t .owner=THIS_MODULE,
- d& F, O7 z+ Y& [9 X4 Z .open=mcbsp_open,' m( f, F/ ~; g6 `2 o4 R- A! R
.release=mcbsp_release,
/ _7 ^. a& e! q$ q .write=mcbsp_write,
$ h, O. W0 y& z, M& J" I .read=mcbsp_read,
8 q9 {, w& H! t. _5 D" U8 \ l};
d$ E! q. r8 @# A& kstatic int __init MCBSP_init(void)
/ ]7 x; z x, B ?8 {{
$ M8 @2 ]5 u# B2 @# e int ret;7 J9 }( z* |# m# f: S! p
unsigned int PINMUX1_REG_old;- @/ h7 R9 @& q+ q& o2 {$ n
unsigned int PINMUX18_REG_old;
5 W9 r! m; V- t, e1 T unsigned int PINMUX19_REG_old;2 b/ r! J8 r# u5 s
unsigned int temp; 2 o$ G, b- G" [& w0 t( Q/ x6 c
if(MCBSP_MAJOR)
! z' S8 @, L' P$ U* L {* d0 _0 @3 O; B' d
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 F8 Z7 {+ g4 Y& C- G# V8 A/ Z$ ^3 [: _ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* ]' s. @+ d0 [# g
}. z$ x4 j) y: B& y$ X# A
else' n5 Y3 i2 e9 Z7 [" e8 Y4 X8 H# x" L
{
" P& g; T: d# I" K v! a ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);% j! H* a! R% ^- S3 z- `
MCBSP_MAJOR=MAJOR(mcbsp_dev);: `4 j, g( B* D1 j, U: Q
}
0 k' b( d8 {: ? A- t2 L' C
. k( _+ j0 S* G7 e a7 m if(ret<0)
+ ?, W% Q2 B, J5 |2 v {0 d( g0 X5 K# z) u; h5 h- U/ t
printk(KERN_ERR "register chrdev fail!");3 t+ w" u& l5 J& H# b2 T
return -1;6 A5 H; q" F0 F, S6 L# K0 p; I
}/ j; N& J- C1 z$ l
3 t9 V; t( {+ t8 t5 S7 S' c3 Q) s mcbsp_cdev=cdev_alloc();
0 C. Y9 b) t6 I5 x% N
% P! u0 l+ O. ?8 A/ T+ s: d if(mcbsp_cdev!=NULL)
# L" t5 d+ d4 w" Y7 P {
- L0 w: V' Q; r8 |6 z3 }( y. Q$ N- f cdev_init(mcbsp_cdev,&mcbsp_fops);
. Y' m# \$ ?8 `7 M mcbsp_cdev->ops=&mcbsp_fops; {- D* {! S) m* N/ Y7 d
mcbsp_cdev->owner=THIS_MODULE;8 `2 V+ H# q1 O' d
" u. }+ ?: d; W, I if(cdev_add(mcbsp_cdev,mcbsp_dev,count))' \: V) {" h* L0 I; i: U
printk(KERN_ERR "register cdev fail!");
; t) x0 @' J( g else
, D1 p* ?6 `. u! L9 G) `1 S printk(KERN_ERR "register success!\n");
2 Y3 M# _/ e# S0 ]' \& C }
7 A8 S! ?; E& y) R. _; \( F else' T2 \2 Q$ v* T& z( K# E
{" J. g9 t, f/ m Y
printk(KERN_ERR "register cdev err!");
. [- b9 C6 m1 j" z; [: n4 y return -1;9 |5 h& l( V6 z8 e0 X: C
}4 k8 x8 D3 Y2 E. `
: f Q; B2 I+ M8 C, f, \3 ^
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);; t) c5 h/ b- p) f: _
if(IS_ERR(mcbsp_class))
* \" q( {7 G8 q( J {
2 U! d" d# f; k0 W% S5 p O& U! ` printk(KERN_ERR "register class err!");
* e' O9 E; u- |2 {# e9 w7 \1 @ return -1;
9 B% x; ?. o' h }
3 B$ a: C" E! _+ F device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
# D- x, d. c7 W$ }2 t0 @6 L6 }9 S5 F3 U& n
//PSC& E2 ~) T) q$ n# z' U |
//add Enable MCBSP' F$ v1 P1 c; p! U
//test& N$ C7 |; j! C9 x; V q7 j; `
temp = 0x80000003;
( `) b0 ]1 J; T7 H a: q writel(temp, IO_ADDRESS(MDCTL15_ADDR));; w J/ y. ^# ~( O& B: Y
temp = 0x00000003;
' J* a/ S" r3 X( C writel(temp, IO_ADDRESS(PTCMD_ADDR));! f5 V0 B2 ?8 f' m& {+ K6 e
4 L2 U; n3 d4 y# Q0 m/ p& y temp = 0x001FF201;
# l& y: M" x( f+ g$ U writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 ]! V1 E6 m7 R4 ~0 _
- Y( ?# s5 ~. W4 C1 @, f //PINMUX
6 _$ o8 `, i& v( s8 x1 Y //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
6 r( r" l" _% v/ C9 g PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 0 h( G2 I' v. V/ F* g. k7 Y S
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; + S0 C' l- i- }) o# a, J8 B
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);) k( W) L1 S) {
) L2 E- z2 ^9 z' J+ ^' e: t //SLEEP_EN,EPR,L138_SHK1,L138_RC' G0 F5 f: b! S8 O
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- _! e2 {% _% r4 J2 O2 Y PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 0 y& M; x+ M9 a0 @
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# l9 |; |, _! A. r) y: I0 o) ]0 [
9 c+ f8 }8 L+ P' J5 T; z7 o //RESETn,L138_SHK2
; {: j# K; d4 ] PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 8 b. c6 L+ ] C' _, e0 L
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
! v% S% H8 Q* {( O. N' R# G) ~$ ] writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 F$ S* K2 J) C7 V B# B6 i / F' Z+ _+ Q3 q7 U5 j& s. ~
8 B6 F, S+ F5 B: R //SPCR Register7 |, D# D0 u/ @2 P2 u0 ` C' `
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset& B& A3 {2 _; K! H1 W6 {, L9 Q
temp = 0x03000000;//(DLB=0)6 l+ I. B5 k# J0 A( b
// temp = 0x03008000;//(DLB=1)
4 a0 _: j2 D8 W* K& v+ J3 @ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
! B' |3 G9 t: X+ ^4 S6 J temp = readl(IO_ADDRESS(SPCR_ADDR));
( B/ B( z: e0 P! N H! a printk("temp=%x\n",temp);
# \+ t# Q) \9 E6 P; `& a; Z
) @5 W( X$ M8 j3 a/ C //PCR Register
& Z. s* N* f+ T" Q //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
4 Q% X( K) G4 z- X% d/ O* e // temp = 0x00000F0F;6 I% f( s$ j4 A/ L" G6 x
temp = 0x00000B0F;
- ~6 ]6 w' y) W2 ~, I. Z writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
0 T5 i$ l* T4 I+ z4 g temp = readl(IO_ADDRESS(PCR_ADDR));
7 A j! E* q! I" u5 k0 D, h* k printk("temp=%x\n",temp); , Y; Z0 s, q+ @- O
//SRGR Register4 K- f2 L5 N. N* X2 n$ T. t
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11: i* U' }' n! M
//temp = 0x301F000B;
7 m P2 Y8 ^; }# m6 T writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 0 w1 o: g X# s5 M$ o
temp = readl(IO_ADDRESS(SRGR_ADDR));
' F5 P* s/ m. ^& N$ Q printk("temp=%x\n",temp);
& N, W3 M! ]! F: {4 r8 ?* I //RCR
; [0 w+ h" c; k( a, u //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( _8 t( `- b4 v4 ?4 _
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
' y7 A5 [% ?; w p1 C1 m5 p5 x temp = 0x00440040;/ P% c' w7 {6 B. S+ z
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
6 I) Q( f6 W- g$ j4 E. P temp = readl(IO_ADDRESS(RCR_ADDR));
4 a, P& ^! S/ t0 m, u6 v1 A printk("temp=%x\n",temp);
( F* H0 _( Y$ |9 o& g8 O1 |5 \" | _ //XCR5 n4 \. k7 @8 s
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1+ D- b( T- N7 B3 X- L; m6 J0 Z1 S0 N
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0( q8 R& r* `) B- Z4 ]- ^
temp = 0x00440040;
0 ]; o: G' r p7 r$ I* [ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
1 n3 z- n8 Q1 g: p) Q! f/ t temp = readl(IO_ADDRESS(XCR_ADDR));! [5 S% U* H7 v3 C' u! L: f$ F
printk("temp=%x\n",temp);
5 I1 q, X6 e9 m" B$ X# o udelay(100);
7 x& {% m) ^! b) c( p, l( S- z } //SPCR Register
+ B1 O1 T* a4 S' g1 K$ F7 h* n- ` //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; ~& F, H5 `! J# f" \+ K& V6 y temp = 0x03C10001; //DLB = 0 VS DLB = 19 ] x+ x) l4 Z1 D3 S- u
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
3 T6 g0 K- ?# Y+ P+ o. S/ }9 _9 V temp = readl(IO_ADDRESS(SPCR_ADDR));
$ r0 H) E; W# n: u# l) V- w) b printk("temp=%x\n",temp);
% ^" S& A3 W S1 J7 A1 k udelay(100);# Y: {" [1 O3 l; Y0 v# x
8 m# q" J* D w; \* x! u7 R K0 R9 e
//set GPIO direction4 R7 E5 u5 I7 h7 ^+ F
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));0 ^ w& A6 M0 F/ x- D6 C
temp = temp | 0x00000100;//EPR----input) \. H( S. R" G& [9 M
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 z5 c+ `; ]/ P) F% Q H4 G
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ' P. x6 v: Z+ p
( I0 Q8 \6 Z+ h
return 0;
( S, l3 |; B+ Z4 y}
! j9 f4 V& u9 P6 J- b1 V5 o' Lstatic void __exit MCBSP_exit(void)
% A8 n. y9 ?+ f9 J# ^- N{. m5 R2 c* |. \% A3 R# {" J
printk("mcbsp chrdev exit!\n");
5 J. Q# H) L2 f- t* Z8 B* m cdev_del(mcbsp_cdev);: y/ h: }+ [9 X3 Z+ O8 t
unregister_chrdev_region(mcbsp_dev,count);/ p6 y/ @3 A. O7 ^% ^$ A
device_destroy(mcbsp_class,mcbsp_dev);
4 D f5 J9 ]/ v class_destroy(mcbsp_class);
6 Y$ Z3 R1 H8 h}" o4 g; K; D @$ v5 C4 _: M
module_init(MCBSP_init);4 ^5 g0 [+ m6 L, ^( U0 k
module_exit(MCBSP_exit);5 X Y) v: `6 ~
: s+ j/ s' p8 B& ?
MODULE_LICENSE("GPL");8 U2 |0 Z: L; E, F
( J) h) E2 a, }7 l6 z+ z! ` m* b( n
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 D: a3 J$ o9 i) U
我的应用层的测试程序如下
( I$ A+ p. i, w8 _+ \+ h#include <stdio.h>
2 _: [, o$ r: r7 G( E#include <string.h>' Y/ a% n0 k3 u5 @: L% a: m5 X# c
#include <fcntl.h>1 P c8 O& `/ G; I
#include <unistd.h>; k k4 @8 A( F& t
#include <signal.h>/ m, h, h: q, b4 W, `: k
#include <pthread.h> //线程
- A' Q3 n8 W# m$ M0 X% n#include <stdlib.h>
% }$ O. ^; ~& h#include <pcap.h> //捕获网口数据- m$ @2 @2 o! {
#include <semaphore.h> //信号
/ [2 o* ^0 R) u% a/ ~, d6 Q#include <sys/types.h> //消息对列
2 T3 ^& j( T4 \#include <sys/ipc.h> //消息队列
9 E+ J8 N- f; I2 F0 n% T#include <sys/msg.h> //消息队列
( T. X* e9 R. |! W#include <sys/select.h>
" J! j6 P( Z+ n6 b#include <sys/syscall.h>+ z T' t2 _1 ~
#include <sys/stat.h>
1 V9 }8 J$ j' |5 T#include <sys/mman.h>0 O5 K2 J0 Y5 R5 b% [, W9 j
#define msleep(x) usleep(1000*x)
- Y' _- ?& O2 A- z W. i
- U) w8 }/ C2 N. Sint main()
/ e v4 Q: q3 ?8 [! z- E{
" k% Z. d5 w! x }6 k, ^, m- j //MCBSP,ARM与AMBE2000交互设备
& A9 C- Z& S% Q int fd;9 \' Y4 R6 @3 e/ T+ _
unsigned short data_write = 0x5555;
8 ? i9 B: m. {( G$ o- P, N& B unsigned short data_read = 0x00;2 J2 f1 J- y3 U* }# n u) J
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ M; a: @. b9 e6 e. r
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);( p: }' n: W/ c# U7 L* ?$ I9 G
: I; f! z+ J, S9 v& `) k: o6 L( e if(fd < 0)
, N" @3 [& E# N* V5 j1 ] {
) E6 ~6 x+ a2 O3 C# b perror("open failed\n");$ q, }" h8 K0 ]* g, W/ v
return -1;1 A7 s" f6 V% ~7 [: C
}( E/ H* O) |( g$ P) D! B( [; V5 \+ M
% d4 L" U$ _! B+ K while(1)
& l, a; v( w8 B) z) A8 ]9 g; A {
) }0 q5 x6 b7 y/ V! Q% V7 q
; v# N& W7 ]2 D* r: s* j: g- D //AMBE2000每次读写是24个字为一帧/ ?( i8 A9 [# w2 |
//写数据时将数据在底层存储起来,等到中断的时候再发送
! z8 T% Z# H1 s# _; B/ L/ ? //AMBE2000输入数据是以0x13EC开头的& E4 |* D4 g1 @& W7 z+ ~3 M* Q
write(fd,&data_write,sizeof(unsigned short));
& m+ \& J! g, N; g 2 d7 S6 h, ]% P/ ^, t7 }
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 : S; N' X3 ~1 B% j3 T' W& c
read(fd,&data_read,sizeof(unsigned short));
W: R$ |. o6 }8 x5 p1 a5 d0 B- o
, n% t6 v4 i' C- N" O6 `" d if(data_read == 0x13Ec)/ H5 r& Y! q, e, W" Q0 p
{0 G1 |$ ^' }* R
5 t% X/ s9 x7 H: J& L0 y
printf("data_read = %x\n",data_read);8 E0 m) d$ d- s+ r( K, u
}
: Q* b; W( D/ q$ ~9 V( D5 e+ [8 P
( z5 J! M' y6 K' I: q7 D2 `1 R msleep(10);$ B# F% F+ ?6 V% e) i* n
5 Y+ l# w/ p& j9 G- K /*
$ L, N& W) E g0 ^5 f ioctl(fd,1);
7 A* w9 l# q# r% R" Q$ d5 w1 c/ p sleep(1);, Y, t8 ?* ?: L+ G& q y; u
ioctl(fd,0);
/ v: e0 F! H3 m% a) |$ ?) y# Q, O3 @ sleep(1);
) k9 ^3 }! v$ d/ }2 W3 a */ 1 r: P: K1 `! T* a4 M" R
} : x5 a! b5 z" j$ D
return 0;
+ ^ ?# D8 c y+ n $ [2 v% x& S8 l1 F5 s
} ^+ X9 `7 h1 D
0 ^; W, `, _: k3 U" {: p% {2 n多谢各位指教,谢谢! 急
/ O* ]. m; P% j' w& I* K( `6 j3 s4 j$ s. j4 K
0 u4 |: L, C) g/ O( _* {) m0 @& C$ K
( O, n% W% ?/ g1 V5 ~; H' R0 @0 |, H4 O
|
|