|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
m" K1 ^1 z# s% K/*9 B; C; J# X8 t: V
* Copyright (C) 2009 Texas Instruments Inc5 d6 o' o9 O! c- p: N
*& J7 h8 b' f1 T
* This program is free software; you can redistribute it and/or modify
/ Z1 ]7 W" X8 C * it under the terms of the GNU General Public License as published by( ~2 n; W5 u9 p# V% Y3 i: _
* the Free Software Foundation; either version 2 of the License, or
$ H( G/ E" m+ {$ W* b * (at your option)any later version.
% Z2 s1 U `! `) _* n *
: S% w) O) U& p+ w7 u * This program is distributed in the hope that it will be useful,; R( q5 E3 N7 D1 f o+ [ {
* but WITHOUT ANY WARRANTY; without even the implied warranty of( J+ q4 q2 `4 d. w, b. v
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 D. x! S* t( j1 V * GNU General Public License for more details.' R7 \& j. N4 _. d
*
P1 y- D0 K4 P9 Z6 g4 o& T4 P6 V * You should have received a copy of the GNU General Public License$ ?: o, V7 Q7 T, R0 B5 d
* along with this program; if not, write to the Free Software
" x( N/ _% {" O * Foundati
2 t6 m4 Q. u! K* ? }7 E& y*/
- s2 ]* E" T& a9 U! R% Y: u#include <linux/module.h>9 g$ |# d+ u2 A1 D7 c) n$ u
#include <linux/init.h>
% g* i* l1 b8 v#include <linux/errno.h>
4 h/ h2 U) H0 Y2 P#include <linux/types.h>0 C" |; X& g F) m _ u! F# s: Z
#include <linux/interrupt.h>
0 j4 F5 W1 s- _& c3 ]3 \+ c#include <linux/io.h>; S" x/ H: K% g* ]) P
#include <linux/sysctl.h>
, h# H) a/ z% A; x#include <linux/mm.h>% w( e4 [# q* N6 }: w1 B+ @: T2 D
#include <linux/delay.h>/ j8 c6 {! M5 U# }9 b6 O; c7 M
#include<linux/kernel.h>
0 H: [; M6 `0 }, m#include<linux/fs.h>
% x# h$ \ b9 Z2 f, @#include<linux/ioctl.h>% l# Z. G4 [# ]1 X
#include<linux/cdev.h>
2 F, Z+ k U' ~# u8 y! N( p, h#include<linux/kdev_t.h>) z& w4 H3 Y; [" F+ T( V
#include<linux/gpio.h>
R5 u% w8 N$ h- S#include <mach/hardware.h>
$ J0 n& d0 i; k$ I/ |#include <mach/irqs.h>
8 m. }; |( \6 _/ [+ ^% I6 a
+ R( x, }& f- K+ [: W#include <asm/mach-types.h>. }. H! q: _- Y
#include <asm/mach/arch.h>
g% r7 y5 r- G% |0 l; _#include <mach/da8xx.h>. y( I9 y! n a% l( W. d* O- \
#define SYSCFG_BASE 0x01c14000+ k2 h3 m1 v1 | @# O, S
#define PINMUX1_OFFSET 0x124
' P, [6 Y& @" ~3 [) w) M; _. J#define PINMUX18_OFFSET 0x168 1 x$ ^$ [+ s- ]$ q
#define PINMUX19_OFFSET 0x16c% D8 k( f: E) ~. \5 b
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR( N8 s+ E0 @/ {
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR) O; C8 w" g0 \1 D, N
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
% l+ A0 v9 E# D, Y#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
3 b) Y- @7 c( y- h" f h8 f) q#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
" h) m4 P: x' u0 O
# l' F5 D8 I! E/ x$ W#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
( Q! ?6 x1 v& }0 y8 R#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
, N% B* |, o4 y6 o//PSC2 \6 c( v. L( y1 n# D9 O1 h
#define PTCMD_ADDR 0x01E27120 7 j3 [! l1 G' F/ S$ S$ {1 V" Y
#define MDCTL15_ADDR 0x01E27A3C3 T" r5 I r9 O3 W- ], k
#define PDCTL1_ADDR 0x01E27304
) J/ M! w$ t0 G& i//GPIO8 direction5 [! @* y6 ~8 I( u9 Y
#define GPIO8_DIRECT 0x01E260B0
0 B. n! q! O6 |4 Y+ F' Q& [9 i#define GPIO8_OUT 0x01E260B4
/ h0 B( D8 t" M+ e% v) @8 J) ]#define GPIO8_IN 0x01E260C0
1 _" d; P* F6 Y
9 W! k9 D/ x' W. J+ I8 z//#define MCBSP1_RINT 99
8 Q5 E% f6 `7 }1 p% o( S+ u2 \//#define MCBSP1_XINT 100
. g5 }! @, b l( T: s0 \static int MCBSP_MAJOR=239;0 v; |: m0 z5 |% `: L% L3 f
static int MCBSP_MINOR=0;
) M/ {9 A" k+ Z5 T. e/ n. ystatic int count =1;
5 m6 b/ r4 }; z9 K- @4 ?# m u9 k# B- {9 E9 }
#define MCBSP_NAME "MCBSP-device"
1 Z2 n" g% f- Y# n9 l0 u! \- i) V4 [+ w4 Y) h5 X) u1 \+ I+ {
static struct cdev *mcbsp_cdev;7 G; `' D( Y# S3 }2 o
static struct class *mcbsp_class;) C8 `4 [0 ^; d( l: o8 c
static dev_t mcbsp_dev;% R: Q! {' s$ Z) @1 R$ O/ R# g z
unsigned int DRR_data;
8 j* H7 N6 t1 zunsigned int DXR_data;
9 C ]# n. R" L. v; astatic int mcbsp_open(struct inode *inode,struct file *file)
/ H: `3 `: X( v' s8 U/ r{$ [) s% w# C0 H1 ]# k2 e
" a' T1 ?2 S3 O3 m+ \& J //interrupt enable,initialized8 K( Y+ m5 @, `6 D( N7 E/ ?
unsigned int temp;, K9 f1 y4 Y) } t' _
//SLEEP_EN(GPIO8[10])---01 K( B6 Y c5 e. R
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( E( o; \9 v4 g/ |, E. z, r/ k' W temp=temp&(~0x00000400);0 z6 ~; ^' s6 G9 ^$ H
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]: r' f; z4 Y) W/ t& U! `+ [
//RESETn(GPIO8[8])----0----15 g- c% {9 {. U; \/ d
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));5 H6 z" g" W* Z0 h5 B: U
temp=temp&(~0x00000100);
: z& x8 A# @; x2 a4 l0 }9 x4 M8 v __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 Z8 q" ~ _, k' r/ }* P
udelay(100);+ P8 F7 `! l( i4 t( d6 c1 i1 \
temp=temp| 0x00000100;
/ l( ?) c! x6 A9 Y" f i3 Y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
1 ]! B/ f; T% x9 F udelay(100);
; H' `- r# j4 V+ B& F- e& Z printk("open success!\n");9 y4 n6 N4 X' b' h
return 0;
0 i4 I W% \( ]/ v0 F}
/ Q3 T) D5 W" K" j, ~* j6 V- t: A8 B# ^- J" ^* o
static int mcbsp_release(struct inode *inode,struct file *file)
0 a n, ?1 z5 c9 J( |! h{
/ T" i4 d4 ?- A2 v! G; G printk("release success!\n");
. O' t L9 v. {5 P" k% f- z- ~ return 0;3 w# ? R7 v( y( `/ h ^- n8 o
}/ y/ T) i. r1 c* f, {% H
- x+ Y2 r& ]2 B
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
: C: t$ O+ [8 g, N j6 Y& c{
0 Y$ Z" ]+ ~" x8 `) N) R' j8 ] copy_from_user(&DXR_data,buf,len);
( V% t6 f6 u Z' [7 d, A iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 6 l* W2 l9 R, k" W, K. l
return 0;
- q8 k! R; M& x! Z# w, p q6 h 4 H0 @5 w4 T0 h _
}
* [2 R0 {* X6 A) {! m* m: y& [; |2 s4 C2 M/ k$ T
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 j2 g* t7 i6 f* `" [$ |7 [* O{
) F( ?* G% U0 P# @# k DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 _3 y6 G4 E% o x4 R7 e8 v
copy_to_user(buf,&DRR_data,len); 3 D1 u' a$ Y2 F6 ^% w$ O
return 0;
/ b( R0 m! p8 F7 x" F. P N$ k}
/ m* F7 }( _8 E. K0 \( R4 i: }9 u) c5 Y# E
. w$ k" f9 q& _0 q& sstatic struct file_operations mcbsp_fops=- G. z' M3 M6 \# _- x. s- y
{
% W# B3 i1 v8 q, w2 W6 O. f .owner=THIS_MODULE,. p: H4 y% k3 p
.open=mcbsp_open,
4 ]7 C; `" J& j0 c: j .release=mcbsp_release,
- }3 ]1 h8 E9 b0 v% K; k .write=mcbsp_write,5 _) u2 a( `8 j8 K* x( q& S) P
.read=mcbsp_read,0 w: h& N1 y, v1 P& ^
};: A. A7 n+ \9 m* T7 z
static int __init MCBSP_init(void)- v" l4 U: a/ [
{, Y1 ^3 v3 I4 T$ B
int ret;8 |4 C8 G' @- y! g/ t
unsigned int PINMUX1_REG_old;
/ W3 F# V/ D) H+ O unsigned int PINMUX18_REG_old;9 d6 j. C% W' `" k& u
unsigned int PINMUX19_REG_old;5 O" {# @* h3 d+ R
unsigned int temp; % S' w7 d0 x8 G' p& \
if(MCBSP_MAJOR)
n x/ z; ]: M( y" T! c {* g+ y/ N% ~) K' r! A; A* b" H
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);* B, b: m% }' L. T% O% ]
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);/ j1 e# I6 R9 c* y& \2 R u
}7 [6 }! X5 M& E, M8 l1 F/ o
else+ a8 S8 I! w. @, W
{
) g" h- }) T$ @/ T' ^* K ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( q G+ u) s! B7 d MCBSP_MAJOR=MAJOR(mcbsp_dev);
; f4 b* p7 z0 W/ F0 ` }
# y' a. {5 D- T Q2 w$ |" f & k2 h3 k( F. s7 i$ v* K4 J
if(ret<0)
3 ^8 n/ h' T8 H+ a) h9 Q {
; A& |0 `2 M4 G+ @6 N) z c7 ` printk(KERN_ERR "register chrdev fail!");* @! ?/ i* F5 z( D
return -1;. d& |: E7 Z+ v$ c' M
}
i( \: I5 I2 T5 E. h! \( m9 H ( _: p9 C/ p% d% S) S' s: v- j7 v
mcbsp_cdev=cdev_alloc();
9 ?0 e- f7 O' }" K: a8 A5 V 6 ~* ?$ T! t/ y8 ?
if(mcbsp_cdev!=NULL)8 p0 G* e+ z) e& T
{
& \$ C# `! G. ]. c$ a cdev_init(mcbsp_cdev,&mcbsp_fops);1 q( d& `& C/ P9 u2 @4 f% L) C
mcbsp_cdev->ops=&mcbsp_fops;
3 w, d+ l: ^2 ^* l# B mcbsp_cdev->owner=THIS_MODULE;
) Q' i$ A; k# t* i5 H& ~& E# l( Y
6 u$ v" Z8 k, n3 C" N" Y if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( s; l0 _: D& T/ s' J
printk(KERN_ERR "register cdev fail!");" p9 N0 k0 Y7 p8 @ b" M
else
( O6 s' N. S0 M0 F, ^+ G% [- l printk(KERN_ERR "register success!\n");
- k5 z0 x# G8 ]: M/ ^) l# s& a1 g- V K }2 D0 d t( d" W( X( R: ~3 ?7 A
else
- Z7 h2 {, {$ f7 g- |2 D {$ F6 n0 L) U9 U0 p% Y0 ]* n9 ~
printk(KERN_ERR "register cdev err!");2 H9 e' @$ S' P% n7 F2 B3 c
return -1;/ ^3 k) l. b. R; N4 Q* }, K
}
$ Q& W- ]* r3 | + Z. v" h2 q, z& q" U3 b0 u. S
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);. F1 G2 A% ?; ^- Y
if(IS_ERR(mcbsp_class))4 h0 s2 Z7 k+ E
{
; M c! s) X4 D$ u! O- X8 u printk(KERN_ERR "register class err!");& ^) x+ P! V2 |0 r. _ L5 T/ k
return -1;9 j0 x# Z& S1 I1 ~# m |4 I
}
. }* @ ]$ x9 K1 X1 l device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
: m4 E* I: i1 t# K; c% z5 C& {# P0 I* C* S1 _
//PSC6 I* K$ r9 l, b$ _6 r, |
//add Enable MCBSP
& R/ Q# F" M) m: B/ O& r' x6 ~ //test
5 t$ U5 ]. h. a/ T- I; j temp = 0x80000003;. `. X. S/ T# {4 a4 S
writel(temp, IO_ADDRESS(MDCTL15_ADDR));' e# j# m3 M/ T2 L; X! F
temp = 0x00000003;" ]: P4 V! @$ k6 r) Q/ z [& j
writel(temp, IO_ADDRESS(PTCMD_ADDR));
: B/ X, C3 R9 B) _1 l" g6 c
" l5 C3 j7 B, b8 g2 p6 _" Y temp = 0x001FF201;$ }5 t% q4 d0 p [3 B! v
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 c, @9 W( p$ } 9 I& l+ }1 S9 G6 @
//PINMUX
0 u0 u) M8 Z* M5 E1 `, y, U; I# M //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,7 {. P6 ]. _' H, `8 p
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); : j. F$ b6 h- A( [1 T6 T- t$ Q P
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; $ r! L4 R- d A# z+ F
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( E* s5 h+ ^4 g3 l H" Y+ y4 t 3 M5 ?: [0 H; s( _, j
//SLEEP_EN,EPR,L138_SHK1,L138_RC
% x1 x9 a7 R' O7 f* A PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- A# b% ^' F, {$ Z) r$ B PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; Z& P' w8 a! {1 Z7 |
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);; [* Q' Z8 ]0 M. R8 ~7 q, R
$ y' C9 r, J& H) |8 ?! T //RESETn,L138_SHK2
/ i( ?. o$ u: r PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. L. l/ y" e t PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
0 f4 r( }4 Z* V- P' k& s writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 a( m6 a) K+ _6 H8 h
; t) p) ^/ @* \4 D9 N i$ O 5 [2 X3 D. ?# ] p0 O& l) X
//SPCR Register
8 `4 _5 Y4 u( w7 z1 V1 X //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset: S7 v1 ~/ A) `4 P- x9 [
temp = 0x03000000;//(DLB=0)
/ e9 `3 ?$ g& k // temp = 0x03008000;//(DLB=1)' e) R1 d8 x* |- x
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset4 r/ B3 c, Q5 P6 I
temp = readl(IO_ADDRESS(SPCR_ADDR));- m5 j- I7 B, P
printk("temp=%x\n",temp);' q1 p" P2 I& _
1 `5 |: C& S3 `, @- g
//PCR Register
1 ]9 [2 s- b; M1 { //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-03 D* W2 ], u1 \7 u+ D2 {
// temp = 0x00000F0F;9 x2 W s q- A4 U4 T
temp = 0x00000B0F;
3 q* a3 Y; G, r% n3 f4 s writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ) x. ^* Q3 C( r$ m# v
temp = readl(IO_ADDRESS(PCR_ADDR));
6 p) g( T/ Y- [ O2 Z& o printk("temp=%x\n",temp);
( I' ^5 u. T$ @ //SRGR Register% D( U) P* \0 U6 u
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11$ h4 X7 ]4 Y6 z) |
//temp = 0x301F000B;/ [. N" D- D# S+ a. D& r& ?; ], e
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 4 V& \* g$ v8 H# p7 ? Z
temp = readl(IO_ADDRESS(SRGR_ADDR));% M) L8 ?6 A! W0 X9 ]+ X8 q9 Z
printk("temp=%x\n",temp);, D7 ]1 a. k$ q9 _1 k5 L
//RCR! c, ^2 \$ _! n$ H- G# O
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
7 M1 P8 w0 N0 T/ t3 a+ H //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0- J6 p" E; j1 y. m) ?
temp = 0x00440040;: S5 e2 ^$ h: m4 C
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized - L; [- l) G3 R" \' [
temp = readl(IO_ADDRESS(RCR_ADDR));
# f" o5 i% V6 k$ H2 }* x( P printk("temp=%x\n",temp);4 y; V1 q% T% z/ p- A
//XCR2 y# t" y6 F0 G6 z" p
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 [9 X! X2 T$ z' `" z; C
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0$ N: p' E( z+ y$ ^ R5 o6 A1 x
temp = 0x00440040;
' O( P& X7 n h: ?( E writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
! x1 [$ u; N3 E temp = readl(IO_ADDRESS(XCR_ADDR));
- O1 \7 u% o( i, ` printk("temp=%x\n",temp);) }4 r; X J/ M- J! y4 G. M
udelay(100);. {1 O* |8 C1 [/ M( A" r
//SPCR Register. _, ]. L- N9 _( \1 G
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
+ X( W" y" p a( D! K7 ?1 ? temp = 0x03C10001; //DLB = 0 VS DLB = 1
) A) U/ z1 ^3 O7 V8 y) [ writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
$ ]& o5 K0 Z- Z; c7 R temp = readl(IO_ADDRESS(SPCR_ADDR));
! H0 Y' n! L+ a. [, Y0 r printk("temp=%x\n",temp);; {/ f! S4 K- d$ U! L
udelay(100);
4 j' q& }( n- b- P
+ }- _( e2 G0 y5 j* b //set GPIO direction
% u B/ L& ^0 s2 w1 s3 h; F temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 H5 G. d8 m$ p5 e
temp = temp | 0x00000100;//EPR----input
( T7 G8 b6 D: r1 ]. Y3 v) ?; G temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 J! @3 i8 }* y q' t5 J
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ( ]: T/ r# r% O! _; F
) ^% R2 L" O4 \; e8 R- h+ C
return 0;
3 ?' E( L; ?; V" K6 s+ {5 u}
0 ^1 j# X, u# P6 Q, F# [static void __exit MCBSP_exit(void)$ R' A7 Q! g$ W: N/ s
{& h4 z1 Z( V' K' v" D6 G
printk("mcbsp chrdev exit!\n");
' S9 z5 B% P+ o3 \/ h S cdev_del(mcbsp_cdev);. u. x7 @% {& l4 }, Q7 |! u; X5 a- u
unregister_chrdev_region(mcbsp_dev,count);
" N0 |. S: O$ ^4 v. }6 ^8 E device_destroy(mcbsp_class,mcbsp_dev);( ~+ u- p; U1 v* w+ o3 K
class_destroy(mcbsp_class);
' ?5 D9 W6 C5 N& O1 Q) o}
+ x1 | p# `. a: mmodule_init(MCBSP_init);
% K3 s% n, f1 F. y* ~6 T+ zmodule_exit(MCBSP_exit);
( A! h7 t* `' D' c: r, |/ d! ]' R, \' ^! J q3 d8 ^0 L
MODULE_LICENSE("GPL"); o' U- w* k4 J" N! {
# }0 x) k5 }7 }4 c7 F x6 J6 W
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
& _! m8 H, H2 M) U% r+ @$ _我的应用层的测试程序如下
8 k2 D$ O: |) o. j0 S2 L. @#include <stdio.h>
3 |9 }3 z9 ~; B9 ]. t4 [#include <string.h>
9 L+ n$ h4 W3 S. K# w; R7 z& D#include <fcntl.h>! i& D1 k* M7 l1 x3 Z! x: o( L' r6 d
#include <unistd.h>, o* t3 v$ s: ^2 Q0 @& U- \
#include <signal.h>
3 G( e& b6 H, B% h: S#include <pthread.h> //线程
1 W% c4 B5 G! o, S#include <stdlib.h>
% l3 t9 x7 O) m0 F#include <pcap.h> //捕获网口数据4 P P0 g" I( O! i' S8 Z
#include <semaphore.h> //信号3 T, E Z5 v! G, h. {! E
#include <sys/types.h> //消息对列
W$ Z, w9 \' u5 e/ W6 k#include <sys/ipc.h> //消息队列9 K- L' b! Z: d3 W% ^
#include <sys/msg.h> //消息队列
3 [+ [% K* o: {% Y3 g$ c0 Y#include <sys/select.h>: ?$ i, }7 b8 G& d6 a) g* `, M
#include <sys/syscall.h>9 E Y. U3 `, m3 W* Y0 d2 D) n
#include <sys/stat.h>
2 c: b/ A4 K z J3 N#include <sys/mman.h>
) L" ]4 ?. [ B7 a#define msleep(x) usleep(1000*x)
; w# [! v" o! e: o
, {1 F1 g9 L0 B7 i/ u2 S: D, aint main()! U2 ^( Q. Y0 h: ?
{
7 I. z; W; [$ x2 M3 @% S //MCBSP,ARM与AMBE2000交互设备2 A3 x: I) F$ O+ m
int fd;
5 t( u, C" ?8 o# u* H D unsigned short data_write = 0x5555;
, L9 s/ N3 c4 M6 Y5 T unsigned short data_read = 0x00;, Y4 g( V: }& O* A
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, E7 L" h1 i) w- a1 m7 Q* C
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);7 L/ W- V* p6 P. g/ D; W5 k5 D
' [! j" n: s( Z. f. T/ ^
if(fd < 0)7 ~; h% |+ X" n
{/ a) A% a9 e% G- {$ T; r7 I
perror("open failed\n");, U6 M! X2 d. y8 h
return -1;
6 N& z9 T, `1 ]: v6 w3 M3 e% F5 n$ I$ H }
' n3 S* h* f$ b5 p; r ; t) z" k! q* w9 X1 C) E
while(1)8 D' q) X+ ^- J: ~9 ~
{
/ M! T0 r7 e' S! _, K
" d) P6 ~- w/ _$ z) m //AMBE2000每次读写是24个字为一帧" P$ b0 @6 u ]8 W. g9 A
//写数据时将数据在底层存储起来,等到中断的时候再发送8 L( o U. N% L+ q" F! d w! D
//AMBE2000输入数据是以0x13EC开头的4 Y* l4 A9 Y% P1 x- E9 [4 ]
write(fd,&data_write,sizeof(unsigned short));, L2 m2 @( i' |
Y6 ~, O9 r, `' | //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
K" C X2 Y2 Q9 J read(fd,&data_read,sizeof(unsigned short));
6 S& s" J8 J5 b" s $ [ H5 j% V! [5 x' w4 x
if(data_read == 0x13Ec)
) [+ e8 s; {% ~ {
3 K" u A/ m K% F$ k! ] % e# x2 D: U0 D6 }; A1 p
printf("data_read = %x\n",data_read);
1 q0 Q0 |4 u) K3 y }" N `8 L9 F$ s' ?
! p# ]. f6 d3 j; i1 u* d2 @ msleep(10);$ N! l: z, Q ?! m& r8 O; z
- J0 F& c+ t& O+ V /*
( G0 P% i) _* t. N3 |$ V; C ioctl(fd,1);
+ h' M1 [4 N' m: t5 j+ w& \ sleep(1);
$ D- b6 [3 j9 N ioctl(fd,0);
* a2 h- b" f, k" f; Z sleep(1);: W# W% h/ i# x) k5 U
*/ 1 U: _5 }9 v% k! m
}
5 K, d# n; h0 G U return 0;
9 Y4 l/ `& H" V7 s) r1 L X1 n
# T* ^. |) o# e$ M% S4 l4 v- M, a* @}
& {6 R3 N% P8 q v0 L
) b2 p1 V r4 a! l多谢各位指教,谢谢! 急
8 C* b) a+ l1 c4 T0 \; A8 r2 }" O3 O9 R
9 R2 `4 h. I8 U
' E4 W- t0 t0 u2 r( m& x# }
0 |% \ V, O7 x& T: N D& R
* J, v4 U3 s" O, W |
|