|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : S" [5 s W" _9 Q
/*
# U. l3 Q( w: d8 g* z * Copyright (C) 2009 Texas Instruments Inc9 F$ U( d7 U5 x. ~& S0 @/ h
*8 m+ j. i) k" F
* This program is free software; you can redistribute it and/or modify
) H$ E7 n% x9 l X4 {" ^ * it under the terms of the GNU General Public License as published by' S9 r( K3 K }) S# b
* the Free Software Foundation; either version 2 of the License, or' @' _/ N$ d" v" e9 m( D' P' r
* (at your option)any later version.0 t. Z( ^ q) W( y/ S
*
`" z! v; F2 Y" N, d * This program is distributed in the hope that it will be useful,. s0 ?) z5 ?7 c$ o( k
* but WITHOUT ANY WARRANTY; without even the implied warranty of
9 A+ r2 X- `( [' r/ b* P+ Q' G * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the3 D1 g2 K. ?$ Q& n
* GNU General Public License for more details.' l" W7 S4 F" ?9 N2 X
*
: c5 H5 V: b9 ]" n; v7 @ * You should have received a copy of the GNU General Public License2 p. \# r8 G/ [* U a
* along with this program; if not, write to the Free Software1 s) p3 p4 N; x/ S& p6 N8 K5 h
* Foundati. N* Y& N3 m) j* g# [
*/
( {: h8 T& `& B0 f( u* E1 @#include <linux/module.h>
3 d5 Q$ ?. Y3 Q8 l) M#include <linux/init.h>' b' j- L5 P9 b
#include <linux/errno.h>8 ^- T) {! S) q3 [
#include <linux/types.h>0 I1 d+ V- b# U6 K3 r
#include <linux/interrupt.h>
2 x4 _- j- Z0 P: `8 v. V#include <linux/io.h>, z: q8 Q' ?5 K" w) z5 G
#include <linux/sysctl.h>1 x% J% o$ `5 d* u1 M! p6 f& Z3 v
#include <linux/mm.h>
! f$ k' Z9 i" d. W, X( x* p* F) t) J#include <linux/delay.h>
- G0 q% L( o) t! E8 [# a#include<linux/kernel.h>
- `! K5 l+ p& K8 Z#include<linux/fs.h>- ]4 F7 b5 M; b6 I% Y( V# ^
#include<linux/ioctl.h>
, l7 y. E( \0 p, W. V3 T0 F#include<linux/cdev.h>
& ^% q- {3 t/ q, v! M* E#include<linux/kdev_t.h>
1 X& |. i. f; W. p' D#include<linux/gpio.h>& _, \! I, o0 m" I! ?1 E4 C
#include <mach/hardware.h>
: Q9 j; j3 d& R0 U. j1 Q#include <mach/irqs.h>! z5 r- _3 w8 K0 |( h3 b
6 \$ M7 ~8 B% Y/ l
#include <asm/mach-types.h>
( T3 _2 Q1 V; |#include <asm/mach/arch.h>
; M) H# O0 D) O2 J' v7 X/ M, l' [, }#include <mach/da8xx.h>
. g6 A* Q( O) B- s& n2 S/ _#define SYSCFG_BASE 0x01c14000/ ]3 D* x8 i/ m$ X) ?
#define PINMUX1_OFFSET 0x124
9 P5 N. h; h/ t1 g" M1 i#define PINMUX18_OFFSET 0x168
! t$ R2 a: h3 C/ I/ H' e$ t#define PINMUX19_OFFSET 0x16c
/ i# V7 d# b5 i$ ?) Z, N/ Z#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR' u [0 v% u1 ~& O
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR6 i w& G: k$ a
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
) M" r( j- d3 v) `; ^#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR B Q- W' S. R; N; X, j4 J
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
6 n/ t- U# e2 f3 K4 P6 p
! d) S6 j' T' r#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
# v( h+ w% D- x#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
/ ~4 J: n( _, |" @& @& u, A3 b0 z//PSC
, L/ ?% r6 F0 T#define PTCMD_ADDR 0x01E27120 & r1 C4 x4 @& |' K+ C- ?* v
#define MDCTL15_ADDR 0x01E27A3C2 f. |$ d4 |) I
#define PDCTL1_ADDR 0x01E27304* f; n+ Q; _" h9 h9 f! }5 {, n
//GPIO8 direction
- Q7 Q+ s3 K: ?#define GPIO8_DIRECT 0x01E260B0, p; H2 S+ T5 C& h
#define GPIO8_OUT 0x01E260B4$ @5 a- I/ G0 \ |
#define GPIO8_IN 0x01E260C0: A: L* b9 _2 N Q' \0 ?
; V) P; H' s$ E//#define MCBSP1_RINT 99
6 S4 m, H/ C8 _; W) x) C( G//#define MCBSP1_XINT 100 ' T! b; n) U& e. C* h" Z1 z$ C. F, f
static int MCBSP_MAJOR=239;
. j Y$ R& R! W+ {static int MCBSP_MINOR=0;
2 b/ ]# {) a! Y# [/ p$ M) x& Ustatic int count =1;
T8 [( G m, f" _& M% T! P' O9 |, P4 o; T" h4 p" c
#define MCBSP_NAME "MCBSP-device"
" Q! b/ E: {& T g* R0 F5 f+ M% K4 P" _2 d! H( a
static struct cdev *mcbsp_cdev;
$ b: @' B: K2 {static struct class *mcbsp_class;
4 T& H7 b' }& ^" ystatic dev_t mcbsp_dev;4 r, W) w( x7 J, z6 [' a
unsigned int DRR_data;
" K1 ]: _. A2 g( w/ {, Uunsigned int DXR_data;$ ^( E ]- z! _* `1 G1 Y
static int mcbsp_open(struct inode *inode,struct file *file)$ \+ z! {: |; X6 D
{
2 f) d3 L" }. x5 E6 N
* f3 {. L$ H' }# T, N: V //interrupt enable,initialized
% j5 i$ F0 X, Q unsigned int temp;
; l% @% B9 e( J2 F; { //SLEEP_EN(GPIO8[10])---0) {* N" p" ^2 H7 r5 q5 }3 V, D+ A
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ a, T# p" z5 ] temp=temp&(~0x00000400);' e4 @% o3 H5 a7 j8 U _9 ?1 j
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]1 o. Z1 h3 `5 S" F( v; N
//RESETn(GPIO8[8])----0----1
" R. t p, B" Y. s7 z. L# d' t' N# P temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 ]+ `" i" Y% W! b# O
temp=temp&(~0x00000100);
4 X! U+ w$ D w; [5 G) ? __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---00 b5 g. A: W' @
udelay(100);
% l: l( K% p( Z" C$ Q0 P; c% H temp=temp| 0x00000100; y7 b5 y1 L# t; G$ c' v% c
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 m2 O* D$ C7 Q; ]) ]8 L# s udelay(100);
9 Z/ E8 Q& V, \ printk("open success!\n");# m! l! m/ u" O0 @
return 0;6 h' t) ]" v& b& L9 i1 e8 Q! z, r
}. ]6 @! B: n; a; u4 ^
( U, a- O8 T9 P
static int mcbsp_release(struct inode *inode,struct file *file)
9 D& V% Z9 L" b) P8 U$ P2 O" P J{
& C- w3 J: E- o1 s* m printk("release success!\n");3 H" O% ?9 l' p7 l. g& I) B/ x' e
return 0;
( g; {0 Q( j: ]8 j. E}2 U, z# e3 T A* h3 s
" g% ]4 R2 ?, n) `
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off) X ^9 w; W; ?3 H" `& ]
{1 x8 ]( h, R; k- ^9 [) `
copy_from_user(&DXR_data,buf,len);! n3 I# A$ j) K7 F/ W: }8 r4 R7 n" _7 s
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
& c" x7 W' L! y% J0 k return 0;3 o2 U4 g0 V) b1 _" Z& q% }
6 d9 F* k' I. Y$ `( R8 q}
! x1 x2 M! \/ O" E2 e( i t% F6 Z r$ ]" k& {& u$ H2 ^7 {5 ^
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 i" T- b5 i* {
{ D1 C5 C4 M" X- r4 d, s5 Q- r+ g
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 ]. A: L% T; G$ A+ a A' c copy_to_user(buf,&DRR_data,len); * f( F, F$ w" f i6 B1 u4 J
return 0;
6 N9 r+ e+ v, _}- _2 W( k7 ~4 F, ]/ H- y2 E; _/ {
: S: V1 b' G1 l0 o8 X
9 L3 D/ v% |$ n q+ P" dstatic struct file_operations mcbsp_fops=
: z/ w- `. M' b{
7 H( F/ Q3 S6 T8 H .owner=THIS_MODULE," z# a. z6 l# Z j- f
.open=mcbsp_open,5 k6 s J: p% W) a: F1 K3 S) v7 l
.release=mcbsp_release,
: x" f1 m) N3 h; X .write=mcbsp_write,/ ^. k* O! z: s1 k9 d
.read=mcbsp_read,( f' r) q1 T A
}; d _5 F, @+ J# b" P, L6 [1 w: `
static int __init MCBSP_init(void)1 e: [9 l8 x; l+ [( F
{5 D( [) F/ c9 b
int ret;
0 a* }0 V+ _* ~ unsigned int PINMUX1_REG_old;
% k J( ^& G1 \2 q- W8 s5 U! a8 Q unsigned int PINMUX18_REG_old;* r# c6 W8 R# @ R
unsigned int PINMUX19_REG_old;
7 ] o ^2 [. v* S2 Y unsigned int temp; ) `: J3 G$ v* u! s* l
if(MCBSP_MAJOR)' z; d- z" d" m# y G
{
- \6 R5 l0 a) r/ i4 i mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ L- t8 J* P- f N d/ _+ z& ~0 d ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);% O V( I) K$ b5 W3 ~; T2 [
}
/ z: h( T, i$ A else4 q5 w' J; [5 V9 s
{7 }& ]* N$ C. F3 q1 j0 x# i
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& G& v. L) B9 `. D MCBSP_MAJOR=MAJOR(mcbsp_dev);
6 m; Q* B$ D2 o }
- r/ W4 ~ g2 S- m W2 \
+ |" d0 E2 q; @ h$ O7 Z if(ret<0)
' H% e7 {# v2 G" X8 A9 u& [$ e {( t" X" d, W6 C8 G- I* H$ s
printk(KERN_ERR "register chrdev fail!");
4 S; C) O7 i% C$ l return -1;
0 S/ V: H5 l K7 B }
% j; K% g+ Z1 |% W& t1 E) D4 Q
6 u$ q- a: a' w! F4 | mcbsp_cdev=cdev_alloc();
% h9 S1 X: \2 X5 Z" H : m. ~+ ~4 S7 ]9 s# \8 @
if(mcbsp_cdev!=NULL)
8 w- f/ N* D9 a0 T, K! c1 q9 m { D* H* N3 G Z+ ~+ {1 ]/ ^% U
cdev_init(mcbsp_cdev,&mcbsp_fops);
, f1 r& V I& p4 E mcbsp_cdev->ops=&mcbsp_fops;
0 J, a% T1 S2 B+ D mcbsp_cdev->owner=THIS_MODULE;( [3 D( Z/ R* v; P& g
2 L1 O; r) I- N5 f( C A if(cdev_add(mcbsp_cdev,mcbsp_dev,count)) o! P6 [+ t* g4 t, h
printk(KERN_ERR "register cdev fail!");
' T" C4 l' i0 N2 a3 u" T else
/ Y6 t- E$ b* J* R0 @; C: A printk(KERN_ERR "register success!\n");
% j! _4 G5 R; N) a }+ c! A. v% h" t9 A0 f( w$ g# w
else
8 Z' I( b1 F! i0 y& l( a {: h5 A1 D; O- e) H$ D
printk(KERN_ERR "register cdev err!");
5 B$ T6 H2 D" k7 L. z4 _ b return -1;; v9 x1 w- i( _4 ]! Z. O# [
}0 V" G7 p) L' u0 \( g B& H0 j
* _3 [, f! C& A0 e) _; o
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);; U C& w- H4 k" z& Y0 I1 @$ g
if(IS_ERR(mcbsp_class))- L$ I: w: m% h( D
{% _- u2 N( r% c2 H; ]* K
printk(KERN_ERR "register class err!");0 e9 p- Y- s u# x1 ?
return -1;
; o: F9 p7 Q( i: ? }
! ~/ a6 U1 o+ C" v9 Z- `0 [2 M device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ T6 C q; l5 C5 j. x* s1 q3 T1 R$ v9 J9 g4 K
//PSC
- I( Z1 g0 Z# f //add Enable MCBSP" Y9 e( s5 f4 }+ r+ U; I( g$ N9 T
//test6 v% x8 P8 _6 U3 M# C
temp = 0x80000003;
+ b( X8 T/ o, J% K: S/ b writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( s/ Q+ X' ] p temp = 0x00000003;
8 U$ _4 A/ h/ T; C% j writel(temp, IO_ADDRESS(PTCMD_ADDR));& a8 f0 H$ \6 N+ V8 l
1 }4 d6 J% O3 s
temp = 0x001FF201;+ u' J" e+ Z5 Z* k: `: ~
writel(temp, IO_ADDRESS(PDCTL1_ADDR));! Q5 X, Y5 g) M
6 P3 U4 @ D6 b2 R7 r //PINMUX m; h7 x1 b- P* e8 |7 o
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
8 E% V* Q# c, b* Q PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
8 R) s) |" H! M5 Q1 h/ E; }/ |" ] PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; K0 ^1 r9 L! k+ P2 P0 z
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. w5 o5 [) Q5 v
1 h" y$ W* T% l t- \% } //SLEEP_EN,EPR,L138_SHK1,L138_RC
6 ~- _. @" G2 w0 Y2 j- k: v6 X# |6 |8 b PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
3 H1 I- V. w0 Z6 F PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
' n3 d! r0 H6 W writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
* e: t* \ s# U/ Y* Q' { 5 e; |! k$ [, m: _; g% d
//RESETn,L138_SHK2$ S. {9 d8 i, {" P, ~" ?
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) S! ]5 w- ^8 b. D. U+ s- i1 F PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
" H0 Z$ p3 {$ j9 {7 `% w$ O6 T writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 L9 R% f/ O, U. q* H2 M. ]6 [
' C8 j% n( u1 ^& U/ q, ]7 a
0 k: m' `/ E2 _* w- J ]7 g$ y //SPCR Register& X4 b9 C) c# ]' F3 p1 i
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset! j7 X$ q; ^+ U4 a
temp = 0x03000000;//(DLB=0)
& i- B! e- W- K& R // temp = 0x03008000;//(DLB=1)
; k4 @! C4 H/ q( ~; k writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset. ^1 c, A8 t, T7 |! G' J) M5 p' q
temp = readl(IO_ADDRESS(SPCR_ADDR));
6 D) K' g9 M( n) w! B% \ printk("temp=%x\n",temp);
6 X7 q, F/ }+ j/ `9 ~! n
, X. v6 r9 o P; `: u //PCR Register) C, A# h, l1 L* N) c
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0- E# N/ i8 A3 Z, w6 V; [
// temp = 0x00000F0F;, |; D- Y) ?( F9 l$ r
temp = 0x00000B0F;
% @3 Q( l" `1 z3 ^4 w5 U writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized $ R# |3 P4 `- R" |4 K
temp = readl(IO_ADDRESS(PCR_ADDR));
6 M3 [! C9 f' ?: b2 [ printk("temp=%x\n",temp);
- C7 u1 { o! L5 I' ~ ?8 p //SRGR Register
3 b, `9 T s7 K- Q a/ E //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11" P6 d- L7 d, F/ S/ M" }; V: p
//temp = 0x301F000B;
6 z" Y* r4 z# B" R8 @. H/ B writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
! g; r3 H5 M9 t1 }- J4 @, W temp = readl(IO_ADDRESS(SRGR_ADDR));
6 [) X/ O$ H% f- q- f O printk("temp=%x\n",temp);
, e3 x3 h4 y. Z) n //RCR
! o7 X4 W( r' y! r; d$ q" @ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
8 R4 I- |$ z; d6 o! c3 W //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( g4 C6 d3 `7 x3 |# Q! c9 U# E temp = 0x00440040;5 H" h# J6 R% h+ `* P5 a* p+ r
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 8 O( i+ c5 \$ _7 u
temp = readl(IO_ADDRESS(RCR_ADDR));
4 w, ?$ ^+ _! z printk("temp=%x\n",temp);" L0 |; x7 A# n5 `$ B+ q" G# A% j
//XCR
1 r f" c& V+ T: c0 T M //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 S* `3 P/ K9 J( [2 [1 K+ U" @' K$ j( u
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0- \; C0 D3 k# Z9 K& [8 V& M' ? `
temp = 0x00440040;0 p P: P. X! ] R( Z2 D7 F
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
?8 R$ n' |: F" a! ] temp = readl(IO_ADDRESS(XCR_ADDR));
7 j7 E* e+ X$ ~$ Z printk("temp=%x\n",temp);: \# B/ u: R' q
udelay(100);
* ?+ ~( a% k! B3 x6 }# f/ H! c //SPCR Register
, L0 p8 U3 W+ i" T/ r2 m0 J6 O, J //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 m( n$ P& _' S$ ~: A4 D( k3 }3 r5 l4 \ temp = 0x03C10001; //DLB = 0 VS DLB = 1
3 j( W+ l$ \ a J$ c S: B7 ] writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
$ [! [0 a- t7 g7 b1 I/ y temp = readl(IO_ADDRESS(SPCR_ADDR));5 C' ]$ N0 r, O& R9 e
printk("temp=%x\n",temp);
! Q8 B2 k1 _) Q8 _, W: O udelay(100);+ {# n6 n8 I% E; U4 a& k" P+ r
- r) V8 e% Z4 T% _2 e
//set GPIO direction8 m, X" B' v- w& D
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 p3 {0 A3 ]5 V temp = temp | 0x00000100;//EPR----input
! i" |4 t7 w" z2 o) [ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output: x7 F1 g; @. L
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & G1 G X! b3 r) g- j, ^% G* V
, [5 F9 g5 x1 p- j4 S; d0 m& g return 0;4 _& e2 K4 D. y3 D
}4 h- @4 K6 K3 t1 [
static void __exit MCBSP_exit(void)" e ^7 W; c' n! ?, }9 A8 x) |
{
. s: k8 L3 B( c9 a# r3 D/ | printk("mcbsp chrdev exit!\n");
9 |5 _& G7 B w9 r cdev_del(mcbsp_cdev);% H& [ A4 p/ W* R7 I
unregister_chrdev_region(mcbsp_dev,count);
7 P2 j$ i# F `9 C1 i' ?0 e7 o device_destroy(mcbsp_class,mcbsp_dev);. g _. F( R3 {: S
class_destroy(mcbsp_class);
! C) p. J, O8 |- M/ h}
$ [! p; T: O! Z1 f6 V( i$ `: |7 Smodule_init(MCBSP_init);
( n, k: l' I9 I0 p: ?4 F4 e1 Emodule_exit(MCBSP_exit);
0 g1 P9 N7 o0 R4 c. U9 I
' `$ R. o2 F! v, `: u9 S7 h/ |MODULE_LICENSE("GPL");
1 ~: Z3 S5 s" T: T: P) z5 R* b4 Y2 g; ]: D
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* F6 N' X9 X. e! z
我的应用层的测试程序如下0 Y, {9 P! h* i# P) E" `. @
#include <stdio.h>
- a! a9 @, y8 d. _' d& H' f/ z#include <string.h>) }9 c9 v9 _5 S) t+ {5 B Q% r
#include <fcntl.h>$ L6 X9 D6 |3 W; t+ Q' p2 m4 W# V/ B( A
#include <unistd.h>% K m0 L( w" w; k- g
#include <signal.h>: a6 ~: Z- R$ F- z) I' K7 P9 c
#include <pthread.h> //线程/ B. Y! N8 [; u9 d$ `% T) A
#include <stdlib.h>
/ j; _7 N' N6 @7 _3 a#include <pcap.h> //捕获网口数据* I/ [( p* o, i" U p/ y3 d
#include <semaphore.h> //信号
# p0 a& D; L( v! X% u# N( l: }#include <sys/types.h> //消息对列
& x9 v. P9 C$ A2 c k8 c, G4 f/ p#include <sys/ipc.h> //消息队列
9 X% y) H8 A6 f- A+ j/ b4 N4 s#include <sys/msg.h> //消息队列
+ b- P' x1 S- D+ M: [, \#include <sys/select.h>
) K6 l/ |2 h$ N7 J! `- H#include <sys/syscall.h>+ l. {6 t& h5 j o/ A4 G
#include <sys/stat.h> q& b8 H) G4 v% I/ s2 n' G
#include <sys/mman.h>0 V/ l3 k. y. Y/ S
#define msleep(x) usleep(1000*x)
" c2 q$ p- R8 X+ b, Z) _9 D. D; j
; k' K- {, z5 [6 ?# E% {int main()
3 a) C! ~) @$ ?/ i# ^% E$ @{
9 z+ a# R' F4 A* @! E+ r4 N1 a //MCBSP,ARM与AMBE2000交互设备
3 b6 v+ o1 _& N' u& b4 u int fd;( Q ^8 D% w1 `
unsigned short data_write = 0x5555;# A5 O" T! t# i& d. Q
unsigned short data_read = 0x00;
7 {5 j1 I( N' X9 g1 Y' g @' M fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
% t' }9 H+ h/ } // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 |& k, C2 i% m. v) C" @+ Y# T6 ~
, U, P B1 N, c5 } if(fd < 0)8 h& A W9 g' k/ ?" Y
{" c$ ?& w5 t2 X2 U
perror("open failed\n");7 y4 F6 {7 Y8 b
return -1;
0 c; S5 j/ [5 r. @1 o( ]7 j }( I5 j) k- V% H
6 H6 ?: j( h. k$ \6 r
while(1)
* `* ^8 l4 w+ `/ B% O& Y {
5 s6 T% R* [+ G& ^
" _; O5 R z; T) i# D% Z //AMBE2000每次读写是24个字为一帧
1 t. r$ [5 g1 |. [ //写数据时将数据在底层存储起来,等到中断的时候再发送
y" r" C4 I& U- ?9 s5 z& \' t5 \ //AMBE2000输入数据是以0x13EC开头的
# d/ ~) e* v' I6 c0 a+ X7 o' ] write(fd,&data_write,sizeof(unsigned short));
* F8 ]" a2 D! ~6 N$ X
- a9 P8 Q- K( W: Z //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 : @, q3 t. |2 M# y1 W% Y) D
read(fd,&data_read,sizeof(unsigned short));+ y2 ~; `. {, k
1 b0 Q% m% J! m1 Y5 k5 a( Y; g( _- D( X if(data_read == 0x13Ec)
( `! I/ k1 u6 H: ?) m, e* O {; O9 M& F9 N; ]( a2 G: \) {
% T y$ S/ H0 w5 l7 e
printf("data_read = %x\n",data_read);
6 r5 b- t/ ]: @* T8 T) w+ ~ }) V( F% m/ ~5 n" D% O' R9 g' H x
! U4 d8 g8 { c- V" i! ~7 l$ F msleep(10);
0 K8 C8 ~4 ~/ @1 V / k) B" m" \4 ], g$ ^* ^
/*1 T+ {: x8 O1 r) @
ioctl(fd,1); 9 [$ i+ o1 F, a' T' ?, Y; M* G
sleep(1);( X5 y. f/ ]1 C( e' m# r3 z5 s+ ~; Q
ioctl(fd,0);
. t9 Y0 y! W+ q1 K5 c2 B sleep(1);0 F/ Q, S" {: P |& L
*/
# R5 u5 n! c4 d1 X& S. }" \' ? } 2 F( C) J% r4 j
return 0;( g# u4 D- }. X, k
& s+ N0 j/ y/ g; ]}
9 i$ X9 ^1 F# L* p0 `2 E# ^( ]7 f4 }* q+ k
多谢各位指教,谢谢! 急+ K7 B: K! o; R! n; E$ _
$ O, C0 U+ H9 e1 M8 f3 U3 q7 d
/ O4 W# w1 e0 p0 h8 i5 q
( Z C# r2 Z1 i$ g+ [
' V: }2 h0 D! M& w4 A9 g5 L$ |& B# m; p2 e# Q0 _
|
|