|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : T; E1 n0 r: {$ W% G& t
/*
1 ?9 ~9 b1 Y0 u2 D * Copyright (C) 2009 Texas Instruments Inc, h6 G4 d2 {* y; y- }5 E
*
- P0 Y6 c/ [8 J7 m2 r; Q/ P q * This program is free software; you can redistribute it and/or modify+ i6 \) z' j! {/ f1 Y, ?. ~) S
* it under the terms of the GNU General Public License as published by; i" J4 @$ c# V& ?" [5 s9 l! B
* the Free Software Foundation; either version 2 of the License, or
0 `2 `; l( l. e" P * (at your option)any later version.2 m, Y* _# f% p. f
*& L7 N. C, Q5 x$ q
* This program is distributed in the hope that it will be useful,8 y S3 y& }+ q1 e# Y4 I ^
* but WITHOUT ANY WARRANTY; without even the implied warranty of6 e' Y* G4 Z! @. ?2 O$ V- z4 x) d' ~
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# @; M$ o; I) Q4 u& q( l# m
* GNU General Public License for more details.; O+ W, H# a% }0 Z5 m8 ~
*+ F% |' E+ s: e# ^
* You should have received a copy of the GNU General Public License
, }9 r6 E3 b- E: I/ L7 E0 D5 d * along with this program; if not, write to the Free Software
r2 Z' r6 M, M) D0 B# a& F* I * Foundati
+ P- y9 ]: c; T- x6 W4 f5 W1 f*/! N, S; F3 z V: Z
#include <linux/module.h>
' A" ]& h. j$ g#include <linux/init.h>
; P5 \0 U# y7 ~# z3 E#include <linux/errno.h>
2 Z5 I$ w$ s+ h! H1 s3 ?$ Q3 j#include <linux/types.h>" E2 R8 M# O2 x. X" a3 R
#include <linux/interrupt.h>
( G, ^( _. s3 m#include <linux/io.h>
$ f) g% V7 T9 t7 ^#include <linux/sysctl.h>+ Q6 X2 {% s- R
#include <linux/mm.h># H M4 a t9 F; d: c
#include <linux/delay.h>, R0 E$ w/ F2 e0 T
#include<linux/kernel.h>, I" P" I) ^3 X9 o8 {
#include<linux/fs.h>, E6 j# c# P' R5 s- ~+ c, o
#include<linux/ioctl.h>* Z7 n5 T+ s& @& N: n! |8 p
#include<linux/cdev.h>7 c9 J/ \8 V6 B6 c; W, Q' C
#include<linux/kdev_t.h>
( Q. _( e! J" t( n#include<linux/gpio.h>0 D2 p+ ^% I5 G
#include <mach/hardware.h>& q/ O+ J# Z1 V$ u
#include <mach/irqs.h> R1 b7 Z! [1 k
# O- i3 q" t+ y& z( D! U( J0 n- B#include <asm/mach-types.h>& g4 N! p) J& K: t9 Y g
#include <asm/mach/arch.h>
# D$ m. X; K- S ~% F#include <mach/da8xx.h>) f4 I) V; K- U, A3 g% h
#define SYSCFG_BASE 0x01c14000
& @6 c( c* F, s! F. q- P @#define PINMUX1_OFFSET 0x124 $ n6 o1 h1 R& g* |
#define PINMUX18_OFFSET 0x168 ! G0 X" J! e4 s) o. ?+ Q
#define PINMUX19_OFFSET 0x16c
7 I* U* L2 B1 O#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
m6 `) U; o6 q1 D#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
$ |7 i, l& v8 l#define XCR_ADDR 0x01D11010 //MCBSP1_XCR: _( o4 t' a8 y) y) A f
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
- e& v' P5 ^9 |& j3 N( V* K#define PCR_ADDR 0x01D11024 //MCBSP1_PCR) y' s1 n' j, m' d3 b
' `: |' R0 \8 H0 P#define DXR_ADDR 0x01D11004 //MCBSP1_DXR# T2 v7 t z( C1 \+ ?- |
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR# N2 U) b4 q3 T7 @4 b
//PSC
9 ?/ c2 o4 ] Q; t5 s#define PTCMD_ADDR 0x01E27120 . [! E1 y6 p+ c
#define MDCTL15_ADDR 0x01E27A3C( W6 H; P$ h; y+ L; a
#define PDCTL1_ADDR 0x01E27304! Z6 @' O, J8 k, r2 z
//GPIO8 direction
( S1 T5 o$ P4 |#define GPIO8_DIRECT 0x01E260B0
: Z! J2 q$ Q1 ^, ~7 W+ u#define GPIO8_OUT 0x01E260B4
& J% R/ `3 ?) X) y* {' w x#define GPIO8_IN 0x01E260C0: ^5 x# _( n( h- |, A
( m4 {8 S# h3 c, C6 ~% B//#define MCBSP1_RINT 99 # [) V/ E( k# }) Q. C
//#define MCBSP1_XINT 100 7 B2 w8 C, P+ D! O3 O, G7 n
static int MCBSP_MAJOR=239;
" N# r0 S$ L+ h+ ]! [* f, m- q; J) xstatic int MCBSP_MINOR=0;8 j! T* A4 w1 D1 k. g) B
static int count =1;$ y; M' A5 T$ _% x% x2 j
1 {! c: h+ c2 i* s7 I5 ^1 W* l#define MCBSP_NAME "MCBSP-device"0 O, |1 e) x' s5 a
+ v3 g7 T; `' x h/ i6 b
static struct cdev *mcbsp_cdev;- e6 K# e3 k; i1 k1 S5 A! `
static struct class *mcbsp_class;
9 r( J! z+ U& Z5 w( w3 e4 L3 ^: ^static dev_t mcbsp_dev;
1 `* Y. H2 b5 e# Uunsigned int DRR_data;
7 }1 e K6 P& ~unsigned int DXR_data;
/ Q& n! ?2 h; ~+ ]. X* h/ A3 \( i8 \static int mcbsp_open(struct inode *inode,struct file *file)+ w) T" k+ z5 \$ Q' o
{( s w( e$ w6 F7 h. q
0 X/ k9 v2 }! K) t
//interrupt enable,initialized4 Y' q! G+ H; O; I9 L; ?
unsigned int temp;/ l: \: k8 k; }. F; Y, `0 Q2 O
//SLEEP_EN(GPIO8[10])---0& S9 f& V0 d3 s" i
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 i+ W m0 K1 s! \4 y
temp=temp&(~0x00000400);7 w( P7 h) }8 Q' U
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]3 e0 l% m, [5 \$ L* j" Z0 i
//RESETn(GPIO8[8])----0----1
: X# _1 n' ?+ x7 \1 L$ | temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 a3 _6 g7 T& a% g
temp=temp&(~0x00000100);: ~7 y( l( B0 v; z W
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 _5 D- [$ H# R udelay(100);% c, q: w" D- u/ L0 ?; `
temp=temp| 0x00000100;
& U' m+ B! z3 P9 P4 s+ q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
6 z Y4 u7 @9 [& h. E udelay(100);
) f8 ^) i" t1 b5 P9 y4 p7 f' V; J. M u printk("open success!\n");* z% a/ |! L1 \+ `0 \% m# p4 L
return 0;3 d+ u/ L; s0 v4 O1 X# n
}
( P* `% U u& N' v( W+ k. }% O
3 ]3 `6 |4 \& Q c. Istatic int mcbsp_release(struct inode *inode,struct file *file)( V2 e' n2 f0 g
{
. A! C# `1 x; l$ N printk("release success!\n");! g9 T+ c. d; G
return 0;; n K! }' m; R
}* F, ?6 z, J6 q; ?' D/ |# b) X
( \3 N4 h& ~# H. S
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); w* f7 Z( g5 C: ~% p' K+ S$ E5 M6 T% `
{
4 `0 W3 c1 }3 ]1 |5 y |! e3 v copy_from_user(&DXR_data,buf,len);
! T5 A8 P, B/ M# [# o iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); : R# f, w, J' X3 c! _# Q
return 0;
3 v, N! u2 x9 z& B - j' Q: N8 ?) x, j- `1 T
}4 u6 b s8 l/ M) ]" U& {* C. O
* j3 R) _. F- m/ n- ^; f- Fstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ B s5 x9 I/ f0 P, ]! S4 m* m7 U, ^: a{ % [' A4 x( J& K) U' }( ?: o
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; v3 c; q" K+ F, z& Z
copy_to_user(buf,&DRR_data,len);
# D8 ?7 D3 d' _9 ^ return 0;: M9 f3 S$ T2 {
}
" }# C2 |9 R' w6 @1 f3 s o2 n- i. {" k) F Y3 L/ N! D; x
0 v2 ~3 T: V5 E5 x+ g" ]. ]
static struct file_operations mcbsp_fops=
* v: _" E }( H2 q" r{
0 ]3 v5 |$ L! h2 J$ Q .owner=THIS_MODULE,
- z1 o2 g8 D! O. ^ .open=mcbsp_open,, l, A2 ?/ b! p% `( f
.release=mcbsp_release,
2 P1 }* e/ V# y( O# o5 n .write=mcbsp_write,
0 d. L& A7 S/ K4 M6 V .read=mcbsp_read,
. |5 d& m G3 h+ p3 |4 M};7 a; }( y. Z1 Q$ `' k) ]4 c3 {
static int __init MCBSP_init(void)
. t4 U8 D( w" [9 z! n$ C, w/ }{
3 A5 P, [. o; _+ f int ret;
$ V+ {/ d$ G1 x" \6 y! v% \1 N unsigned int PINMUX1_REG_old;
- v& q1 ^. B0 ], f/ p, K: U unsigned int PINMUX18_REG_old;2 I' z. E J7 @' x8 {
unsigned int PINMUX19_REG_old;+ r8 n0 R0 c& O- O
unsigned int temp; ; F5 R6 L- {: w
if(MCBSP_MAJOR)
3 `6 X) G( m$ V, o% y/ l {
( Q/ ], @7 {$ a& }. W( } mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* N E( M p& z! X ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
2 [0 @: J7 Y {) e; g; L! \+ Z }$ _9 G# @8 C7 f5 _6 J5 O
else+ d( @+ Z& h; C
{' n( t% u7 K3 k* a% c
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! ~6 F; G' V0 X* t+ J, [ MCBSP_MAJOR=MAJOR(mcbsp_dev);2 i' @3 s+ m6 a+ w: q
}
( s3 R% a8 b0 l% ]" |2 P2 b - P, I" {5 t8 Q1 h/ u
if(ret<0)
+ Y/ z: t+ E5 p7 ~& Z8 z# _1 _ {6 P# v) a- R, N) _& N* Z Y% o
printk(KERN_ERR "register chrdev fail!");
. L# G" w3 T8 F0 W return -1;* b% b1 `/ [. y& `6 a4 O
}& G* [; }7 h9 v# W, L4 h
! C8 Y& b- h& Y9 a: I/ I
mcbsp_cdev=cdev_alloc();1 K6 h0 v; N* N6 i f$ V
! t' A/ F9 a8 v& v9 g if(mcbsp_cdev!=NULL)
: [8 ~7 X& B. p {% |" D+ @& r/ l, P* a& Z
cdev_init(mcbsp_cdev,&mcbsp_fops);6 a/ F7 A8 O# h- _ H; Q
mcbsp_cdev->ops=&mcbsp_fops;
8 s: x& ~" M) f& N# d5 L: x mcbsp_cdev->owner=THIS_MODULE;2 v; U8 f# h, Z
3 q1 {$ i( x6 j1 g7 b
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))6 G. y1 z: s; E% ?* J
printk(KERN_ERR "register cdev fail!");
* k. G/ X+ P# T/ B& I else
9 @9 o. ^- m7 u' Z" v+ g' J printk(KERN_ERR "register success!\n");
" {4 u |; L4 U4 P }/ B7 B4 }2 V; A* z& n- e
else4 s2 p$ T4 `" i) U4 u! U2 z
{
" g s! G# S% \- F8 Y printk(KERN_ERR "register cdev err!");
/ n% c1 J. t/ ~, M6 y7 L9 i; D% r3 N o return -1;+ G, x) W* i0 j* \* o6 `
}6 r$ v4 F+ H6 j& k! C H
( t% U; P6 h4 F' k% N) w mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! X& |4 P0 P F8 |8 A0 o
if(IS_ERR(mcbsp_class))
, \1 t* s$ B9 V* U8 @5 S: y {- x, @1 p- l+ C. l5 u
printk(KERN_ERR "register class err!");
% X0 W( P" }# [6 Z return -1;
& u( h& o/ S# e; ~ }( P/ @/ V) ]4 m; C
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 g7 A1 `- M9 L0 x* z
1 N4 {! n {, ]/ F( W% F //PSC
- q- x" @/ F8 i) M/ o //add Enable MCBSP+ }5 w! N* T( g [7 N5 O
//test' r4 D k5 g' N9 c
temp = 0x80000003;6 o8 q) K, N( Z2 |4 l! N
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
; V I- R1 u& c) F: X temp = 0x00000003;* D& \9 i& u" K) `7 J* {8 \7 U( c- {
writel(temp, IO_ADDRESS(PTCMD_ADDR));& M# _' G: D' C& x- f Y, w
2 K" k1 k0 P" E5 x0 H6 S, o temp = 0x001FF201;# ~" a) `0 T0 @& `/ w: @
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
B3 _4 F" Y. b( ?3 O" W; o7 @! K7 u: T5 A
V5 x" n; D$ ?3 i1 O //PINMUX
3 P+ E% `$ N1 b# K4 s7 |# P //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
' F. @3 \6 R2 T( a PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); # e( O+ b, M" N/ `4 k4 ?5 a: u4 u* h
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
+ |( c6 M' W; f! N" j1 x9 G8 n3 C$ I writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* a% W' O$ U; F" w/ t 9 S- N, A# U4 k: j! Y' X! I
//SLEEP_EN,EPR,L138_SHK1,L138_RC0 W! b5 I0 r) p( A$ U
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ( y$ _, i6 `. _% G1 ^6 h4 G; T* U
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; / i0 k: W# |) E( c( O
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
0 w- X4 c' j$ w j
" O1 c. Q. z$ U. ^3 { //RESETn,L138_SHK2
+ S/ L* B- p/ D, h- u: l! P& E PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); / F# F0 w% ~) J5 E
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
9 ] Y" b# s. N0 ^+ @0 I' I' k+ I' x$ z writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
6 h. t- O+ e7 j+ Y/ J! Q
9 ]* D/ ]% W3 m. J( ] . e M! Y4 X+ M! ]# `
//SPCR Register
) k f6 I7 V8 I4 H //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 |, J2 G# m7 } [. n; [4 q* k' W temp = 0x03000000;//(DLB=0); W, c- W0 x* {2 e. I
// temp = 0x03008000;//(DLB=1)) q; G9 ~. r9 h! d% ~1 N
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset2 g' _7 g3 I. Q/ J$ B4 J
temp = readl(IO_ADDRESS(SPCR_ADDR));
* n: r- k1 W, e& U; ]2 n D printk("temp=%x\n",temp);4 `4 b3 N. v+ E
& D- I0 p; I9 u: S' O# X //PCR Register
3 R. \* E4 S8 W; s. m //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-07 [1 G% h3 {4 i+ u7 @. c, e
// temp = 0x00000F0F;
4 D1 x0 x9 a6 k5 X& W temp = 0x00000B0F;
2 Z/ x3 D4 t L7 ^* q( _4 ] writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
4 t8 e! x4 T- b' a) r& ]/ Q temp = readl(IO_ADDRESS(PCR_ADDR));( B& F3 w7 _, X- c2 i0 r% c! F/ F
printk("temp=%x\n",temp);
9 V) \9 V# M( F3 z //SRGR Register
" D4 A6 c0 A' c: Q2 |0 | //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==113 v: ^5 @7 d |; W
//temp = 0x301F000B;* ]3 _2 f, x; k& g3 J& c5 J) T2 a
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
4 G. Z5 T( v3 w% q1 Y3 q! X+ x temp = readl(IO_ADDRESS(SRGR_ADDR));$ r$ O& r* U0 ~7 C* Z! c
printk("temp=%x\n",temp);" ^( Y, G3 P& y7 [) x# F% M( Z6 B
//RCR
# u" }0 o# L* ?8 [ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,: y# c$ m) ~- L# m4 [# _
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 H, x1 b9 m; J9 C# X6 e1 v0 g
temp = 0x00440040;
6 S+ G, ]) d1 Q, x, z" o3 [ writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
' N7 a1 g! P5 x! T+ E# v' v8 S! m temp = readl(IO_ADDRESS(RCR_ADDR));
, J+ w& q! Y t; i printk("temp=%x\n",temp);
, ~+ R0 G0 b9 T //XCR
$ V" u' W x- X' g //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-12 {/ d" Y+ o/ d
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 ?8 q# F- k$ L& r* [ temp = 0x00440040;8 g0 l% E: [/ m# o- {7 s
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized " L; ?* Z3 s1 ~, n1 V
temp = readl(IO_ADDRESS(XCR_ADDR)); h1 d4 d4 j. p
printk("temp=%x\n",temp);
) ]" l- r2 @/ d/ R* [+ h udelay(100);$ F) B ?) I1 M( X2 k+ Z6 j
//SPCR Register
) s( {$ ]: r+ N3 e //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
% x- ^% q( {& i7 V5 Z0 o temp = 0x03C10001; //DLB = 0 VS DLB = 1
# A/ S: m' w+ l$ g+ o" k' Z* ?% j/ M writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
5 | R$ |, b( d* G9 @" F5 X temp = readl(IO_ADDRESS(SPCR_ADDR));
2 F4 F% \; a. E; q printk("temp=%x\n",temp);: b7 w& N4 t. n. A0 o
udelay(100);! l, u; U1 _% z+ g W( G# G
- p" s5 o0 W$ ]2 a! Z //set GPIO direction
" c+ r8 O$ s' Y0 B temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));. t% z& C$ k* f3 k. ^- z) G
temp = temp | 0x00000100;//EPR----input+ u& ^/ \3 B' l# V z
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- W8 g4 Q0 d1 k% F. t$ M' \7 P, W __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 0 Y; Y( W" k9 W
' z& f$ W, E$ c0 \ return 0;
& @4 |- Z; r8 |0 l; I' z}
* `; j: y( H0 D6 sstatic void __exit MCBSP_exit(void)) ^3 v( ~" U2 e9 C+ E) u
{
2 Q* ]0 O9 H/ _ ]9 Y printk("mcbsp chrdev exit!\n");
& Y) M2 z' [: _2 M4 u cdev_del(mcbsp_cdev);
. ~# [5 g& \: N2 s9 z7 o: j9 C unregister_chrdev_region(mcbsp_dev,count);
. E! C& v& B; p% ?0 O% d$ b device_destroy(mcbsp_class,mcbsp_dev);
5 B9 e4 C3 I" N. x$ d/ [. | class_destroy(mcbsp_class);
; p7 r8 f3 ?3 v: r* p}
. C3 k* z- y' U) W3 O% v- z6 c* H3 qmodule_init(MCBSP_init);
m9 z9 V' A, R8 q- Umodule_exit(MCBSP_exit);
: y. h# ^6 `; G5 j
3 n# v' |9 ]2 N' ]4 b- c1 {0 KMODULE_LICENSE("GPL");
1 U4 ?. F. E: U& p6 i1 v8 m1 u
, U: c# ]8 a+ ^( w0 L! {我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。0 ^4 w5 k0 U; X. I+ V" E9 v0 g
我的应用层的测试程序如下
4 i$ b! J8 D5 p6 r, e1 k#include <stdio.h>
' f+ m! ]- y8 A/ `5 i4 t( w#include <string.h>
5 t& o) y& N) W2 c3 J5 A#include <fcntl.h>
) O6 W; G0 J" _ q' z#include <unistd.h>$ I' ?- ~$ i% p- J- C
#include <signal.h>5 Y7 }, g. X1 Q4 i) I5 \
#include <pthread.h> //线程
6 i2 q+ | w, m m) L6 O) x#include <stdlib.h>
; m4 @% n1 N8 i0 B# H#include <pcap.h> //捕获网口数据
8 y; j$ w( Q4 i/ m( q#include <semaphore.h> //信号
* O, b8 ]; M, f7 P% B; e2 g#include <sys/types.h> //消息对列
/ Q( m, T/ ~8 b, C#include <sys/ipc.h> //消息队列
( Z1 ]3 k6 G6 h9 G- i! L. U& y# p#include <sys/msg.h> //消息队列
. N, w5 a# ]$ [* a#include <sys/select.h>3 J O6 b' E: U9 l- r
#include <sys/syscall.h>
& e1 J1 e* S: Y# z. \# } D4 V" W6 p#include <sys/stat.h>2 H9 U! ?& j" f% `; A+ c- [- k
#include <sys/mman.h>
! R& |: f# `7 n! J- M( l#define msleep(x) usleep(1000*x)- M2 g& }8 Q1 v; O% V7 R
! W# H% I7 ]- Q% @
int main()
0 Y' j8 A4 ~# C' J# K# g0 ?8 A- m{
% w$ f. H; V4 e; k+ Z3 i0 N& K/ y+ F //MCBSP,ARM与AMBE2000交互设备
! _+ w9 E2 c( b% G; C1 C7 w9 G int fd;
; d6 L" `4 X6 ~; i8 h$ S7 V unsigned short data_write = 0x5555;
. [0 x2 E/ a9 j1 p9 p unsigned short data_read = 0x00;$ a0 o6 J, Y: j" u
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 n" `. O+ _2 T$ g- K5 f: S6 [
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( E) b0 l; `; p% v& z( q7 C6 t! R ; F6 d# [: d* M8 ~* w9 r0 C1 h8 W
if(fd < 0)" _+ E& d) h( k* w) U9 J
{
( V5 R! C+ U3 k6 w perror("open failed\n");* q( E" J$ Y& @: c5 {
return -1;
* p' g/ n( x9 C% X7 N& A& O }( F6 w3 Q$ g$ ?( P( y
* |. L3 [- R6 x! b3 r: q; t' `' g2 ] while(1)
c! I- ]2 o9 `9 [' s {
" ~% {" e/ [, I% r. I$ n
, [# `5 ^+ ?2 ]- L/ v //AMBE2000每次读写是24个字为一帧
9 V: ?7 |$ C0 B) @) L //写数据时将数据在底层存储起来,等到中断的时候再发送
8 r9 h# q1 n1 Y4 P- i4 p) K8 C% n //AMBE2000输入数据是以0x13EC开头的
) _1 G# l8 k9 ]0 d1 p write(fd,&data_write,sizeof(unsigned short));
+ W2 w- U8 W% c1 i8 k( _0 u+ |8 s ! p0 E: ?9 i8 u5 ?5 j; b
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 + p' E8 L( H7 |) _1 z" D+ J
read(fd,&data_read,sizeof(unsigned short));
" }, S) G3 G. b; V$ d' r " q+ f1 k0 e* {
if(data_read == 0x13Ec)+ x2 `9 S0 Y B; g& M# ^
{
( r6 e; B9 }* }" i7 P
1 K. g L$ b0 d6 U# x# T. r l printf("data_read = %x\n",data_read);2 o2 j1 ]: u& M3 G4 w1 M
}
1 `& V; C+ }% Q) @5 H' h* ^ $ U) I7 Q) f9 K, w& X/ L0 z2 i" s g
msleep(10);
: t$ X& \ W# @% _. `, f1 t- y
6 i* ~7 l; W3 b" B k /*
% ?6 J; w6 E0 G' {* o ioctl(fd,1); ) x6 { h9 o: A2 F7 S
sleep(1);
: W$ l" p& ~7 y* ]' _. j ioctl(fd,0);$ F% P8 M- J" w- A9 k% N0 D
sleep(1);
0 @( [" F; b- w7 S" G1 c: @ */ " ]" M. @0 ~# d$ Z1 F
}
' k( i8 S/ V4 T) i5 q3 l/ j return 0; {9 k- ]$ r9 l) N5 O0 S% N
$ M) q/ ?5 W' S0 |0 N$ X
}) z6 z( m7 ^* n- ~- |
* r8 s3 U: ^: `3 v% \
多谢各位指教,谢谢! 急6 e0 M3 k6 s' S" x
# A; C3 B4 S: @& ~* K' L2 U
$ t% }( c) D; g1 T2 G) N# u. N; t) K5 p7 i* w
0 p/ P' r# C9 F! R. E2 C( b
/ \/ c( N( t4 G. i5 P5 C4 Z n* V5 _ |
|