|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: . e3 q6 x7 x& s! U& j
/*; y- q7 K1 S4 W
* Copyright (C) 2009 Texas Instruments Inc' E9 p- B3 N) u+ s& S# l9 |
** ]# {- q( x) c! `# F
* This program is free software; you can redistribute it and/or modify
" p/ i! U5 v( D * it under the terms of the GNU General Public License as published by% y; X4 c- g7 Z5 H; v& j9 `6 V, q7 }
* the Free Software Foundation; either version 2 of the License, or: D" a7 Y. q# i+ H- J: a
* (at your option)any later version. J, C6 }0 ~& s7 \. I0 s, @
*
! h& y7 u* q: c, L * This program is distributed in the hope that it will be useful,7 `/ C% r% Z/ A% L) d$ R
* but WITHOUT ANY WARRANTY; without even the implied warranty of. b3 ?) B: [$ ^7 B/ \* q9 N H
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the" s _# s3 B1 L' @( _; \! L; p4 \
* GNU General Public License for more details.
, c7 _. s2 J% c" \ u# e! L *
0 t$ e& d! g7 e1 o5 l. O * You should have received a copy of the GNU General Public License
, i& I) p* S" B4 u/ W * along with this program; if not, write to the Free Software
7 N# w: i4 p3 j3 A * Foundati
9 L) z# }, p5 {# U/ j/ N*/
' m' i# J4 u' ]+ O% g' ~#include <linux/module.h>
! v% ^4 ~% M- o" ~8 G#include <linux/init.h>7 l( ?2 }8 j. ~! G' C9 O. w! p' O
#include <linux/errno.h>5 b. ?+ \; g3 U' h, E
#include <linux/types.h>
9 p! l3 h! M7 r/ G$ f6 G1 T#include <linux/interrupt.h>
7 ~" |) p# Q, y; d9 `#include <linux/io.h>
8 r3 e, c+ }* ~8 H+ j#include <linux/sysctl.h>
. N- `# k4 U* E4 t#include <linux/mm.h>
1 B: w4 N. y6 i0 h8 ~#include <linux/delay.h>! G- K+ d- p( v* V7 c
#include<linux/kernel.h>
# k: l @3 Q V; ~#include<linux/fs.h>
6 C. f. A4 E8 p i#include<linux/ioctl.h> G( t3 s k8 ^- j+ o1 ]: k
#include<linux/cdev.h>- v& b! ^" N2 T
#include<linux/kdev_t.h>2 g I! J. ?* Y& U% D# X4 R7 H
#include<linux/gpio.h>) Q0 K, I# u! z
#include <mach/hardware.h>
- W. ]- ~8 i" o/ y+ `9 _0 U, S, Q% C#include <mach/irqs.h>
, X/ I$ j7 E, n, k. I2 B$ i8 g% z: k
#include <asm/mach-types.h>9 B" [. `$ `3 H9 F8 [. x- D( y& D0 s
#include <asm/mach/arch.h>
# U" a+ J J/ X; d; |0 s% ?5 }#include <mach/da8xx.h>
( s, w d, Y( p- l0 ~#define SYSCFG_BASE 0x01c14000
% Z5 O# v7 Y+ e3 m( \: [# }6 n#define PINMUX1_OFFSET 0x124 + e$ D4 {( a; t3 u, v4 s
#define PINMUX18_OFFSET 0x168 0 V4 }6 x/ ~% K; c. N
#define PINMUX19_OFFSET 0x16c
2 v. M3 G7 @+ w7 B# I- D" n#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR% r7 V: D4 T, U( w
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR+ x5 K: I/ ~) M2 o/ u' ~# c
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR: ?4 R' S- W M& w: F' i+ T
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR% e0 i# L, h+ N( a! Z
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
* V, r9 n% n3 P
E: M- g1 R! f1 b0 q. C#define DXR_ADDR 0x01D11004 //MCBSP1_DXR+ e& Q- o/ H, e% K4 n
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
# {- t9 N4 q' n+ R J/ L) ?4 o//PSC
4 c9 ], A: G# S' U. g#define PTCMD_ADDR 0x01E27120 8 q' y! t/ b& m
#define MDCTL15_ADDR 0x01E27A3C# _/ I# T# Y$ l: x; e; b
#define PDCTL1_ADDR 0x01E27304
1 N B# ]5 |1 }% }7 I3 H. k//GPIO8 direction6 s: V( u) {& ^. @
#define GPIO8_DIRECT 0x01E260B0
+ ?* p, {) q! Q7 G6 [) \3 G) n#define GPIO8_OUT 0x01E260B4
& ~5 p% A% k; }& f" ^#define GPIO8_IN 0x01E260C0 n6 F# N5 T9 m9 Q) Q! p! z
( X$ `: @/ _1 D
//#define MCBSP1_RINT 99 9 h( X( B/ ^1 D; X) Y% M
//#define MCBSP1_XINT 100
; A' G! u3 _6 \static int MCBSP_MAJOR=239;5 u& }& N: d) a5 ~
static int MCBSP_MINOR=0;
[6 I# O* U& r" k" s0 X9 H1 \static int count =1;
6 l1 A3 e* Q/ U8 q' W+ L% m
2 p9 q0 w9 h8 I# f* z- s' ^2 l#define MCBSP_NAME "MCBSP-device"5 p2 ~- A( g3 e
% @1 ^% a# U/ Q7 u6 J, m$ W& {
static struct cdev *mcbsp_cdev;! A; N+ d4 C Q+ R" ^& a
static struct class *mcbsp_class;7 h" Q" L% Z/ O# v' y' K; }
static dev_t mcbsp_dev;
5 ?. n I9 `4 d+ q9 nunsigned int DRR_data;
" `7 }3 A, e, Yunsigned int DXR_data;" S4 j$ }4 s7 ^
static int mcbsp_open(struct inode *inode,struct file *file)
8 [, M9 |$ t4 ^1 C{0 j2 r5 |, Y3 B4 V/ `. q; b
C' E* u( O: e
//interrupt enable,initialized2 @/ R9 t% ]( K6 F3 W
unsigned int temp;! ]/ J |3 c1 \ i
//SLEEP_EN(GPIO8[10])---0
; o% j5 p3 J' q+ r4 G% I$ } temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 O' g5 a2 ^ U0 V8 } temp=temp&(~0x00000400);
9 | C( i3 G3 U! X% {1 j __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" C# m% p% i) |% R4 q6 m //RESETn(GPIO8[8])----0----1# a- }* ~/ O/ s
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));% N& j2 `( Q5 ~# j3 p1 r4 ^- U
temp=temp&(~0x00000100);+ s1 J9 }$ k% U1 p( k9 k
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 a; o2 Y. z1 ~% K/ O9 F
udelay(100);
' [( z/ K% g, J; Y- _$ G temp=temp| 0x00000100;
$ Y- Z' A4 F+ A4 `9 k. f, B __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1$ B5 a1 A4 T1 c, y9 h7 E, R9 @
udelay(100);( [ Y" j/ u! \. G
printk("open success!\n");' y4 t' e' d) ` o7 i# @5 H
return 0;
; x( z6 W) o$ h8 c}' s8 _4 u5 q2 F! [! x1 ?
6 B% N( M8 N7 e* J$ `# x( d% q
static int mcbsp_release(struct inode *inode,struct file *file)
1 y; R' _0 k; X7 w1 Y; y{8 n8 l/ ]( a* |. _/ Z2 M
printk("release success!\n");
* E* G% v1 ?" ~- S return 0;
, v2 h" O/ f* o}: p5 Y5 }3 i9 i& a" G; j' Y
7 W h. ^! g9 ^# W) S0 [) l \4 Vstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)9 h, \4 i+ W2 L) g* z
{& O. Y+ `" i6 u/ V
copy_from_user(&DXR_data,buf,len);
6 g' Y, n" A8 d" X: F, O iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
# W4 l) v- I0 _7 U* F" I3 K3 p return 0;
% |! c4 e. F! }# A Y" m& ^* v; c' O( t
}
$ B" H8 h- @& [) r2 l# d# k7 A: l
w! M5 _" Z& Y' A- e, g- ]static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)& Z/ ?# o' z4 q; f0 \0 b
{
7 K/ h8 E4 _# V! }# w7 A/ a& M DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
/ a9 {, @8 l, N" X# [ copy_to_user(buf,&DRR_data,len); ! P1 L# U5 P% `0 L
return 0;
& v3 a& n5 G2 }}2 S4 t8 {; e% g+ g9 ?6 z; N# Y
( ]/ C% L7 E. l5 S
5 g' E* d4 e. K/ ^( ~- Istatic struct file_operations mcbsp_fops=, K5 Z+ b9 a, d' t
{% Q# \3 D: F5 P, V7 u% g* S3 i+ Q
.owner=THIS_MODULE,7 c( e, ?: ]- _" c
.open=mcbsp_open,
$ I/ O9 ~% i8 X5 ^1 L- V8 ]' ] .release=mcbsp_release,5 M; k3 v! C5 m! G
.write=mcbsp_write,
0 s) ? ?# i$ Y! V .read=mcbsp_read,5 N, d1 U" v; O! u
};
D6 w; M5 u1 t8 w% I' Wstatic int __init MCBSP_init(void)! K" d+ M1 o3 Q) C, M
{+ O: r% H) E b& K
int ret;. c/ u7 {( V! A2 w
unsigned int PINMUX1_REG_old;
& A l* \/ v7 s$ \$ n9 ? unsigned int PINMUX18_REG_old;
# h$ \: j3 z8 ?& }2 T unsigned int PINMUX19_REG_old;0 {/ b1 Y! u8 r4 r
unsigned int temp;
& r* _9 ]3 ~ J o( m; V if(MCBSP_MAJOR)
3 l1 h3 Z X9 ?6 u- X0 D {
/ N& q; g/ T; d" K; A- _4 v mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 F4 ~9 {6 r9 c; P* v4 J% ?2 `
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
. o. p2 ~6 V! U& e' a& z A- P }
" f/ d6 I4 j1 }' o$ W. [& M else
; i. D! i5 T% R1 D. C) f {: C* j# o! X) m$ o! j E
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);. N* Q5 d5 H4 d
MCBSP_MAJOR=MAJOR(mcbsp_dev);- w/ ]5 F1 ]3 r; c/ E& w1 C5 q
} T7 c! X, B0 s/ L
4 A5 B9 w8 Y; J' w
if(ret<0)
: o3 F+ @% P; N+ @4 \$ S {
2 M1 K: K( q: ~: `6 ~$ z1 s printk(KERN_ERR "register chrdev fail!");" c9 B( M' S( d2 `. [: z
return -1;; n, i& W- p* h9 Q& y8 |& k
}
9 n# n' A$ e- _6 s( a! G 9 \6 l$ j- Y5 M8 g
mcbsp_cdev=cdev_alloc();
6 `+ Y: T; ~6 ~, W - @0 ^+ q0 }. k2 u9 X* v. V+ V2 ?0 Q
if(mcbsp_cdev!=NULL)
! x4 v% L( u3 l& F2 I& w! I {
. L; G4 i# \7 S# J+ h0 u' Y9 _ cdev_init(mcbsp_cdev,&mcbsp_fops);6 [1 V& [ c3 ?7 e
mcbsp_cdev->ops=&mcbsp_fops;
/ \& h8 L3 L+ P1 N0 u0 O* _$ O mcbsp_cdev->owner=THIS_MODULE;
4 }8 S: P9 Z2 g( J7 \ # ?8 \( W0 L8 ~9 g
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
8 K3 W R, T) D4 r( G% x printk(KERN_ERR "register cdev fail!");+ v% D/ e6 B: A n
else; c2 G( K, r+ j7 H- B" B8 D/ }9 X
printk(KERN_ERR "register success!\n");
4 `0 H2 X" o j/ h0 C6 }1 ^ }
7 I' k' {& {. }0 ~ else
$ E x% C6 x- w9 U- Y1 \ {& Z2 R6 R+ B% [8 _
printk(KERN_ERR "register cdev err!");3 B& d, w* Q" V* J( ?& S
return -1;+ \0 A$ w' ? F9 V
}
' V8 U8 m G# p- N! h: P) e# Y
8 j2 l8 G% |9 w3 n5 k mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
+ o6 x: F, s8 t8 [& o9 O# S- J if(IS_ERR(mcbsp_class))6 r0 S5 M6 A! U5 I
{- ^: }6 o- G1 ~* Z8 x* d
printk(KERN_ERR "register class err!");( ]# a. y, @4 i+ U0 t
return -1;7 F* s- J# f6 x; c ~7 E
}5 o# a: x; j l7 ^
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME); E" Q; ]6 |( q" J
- {& b" B3 G! I; x& m1 f4 H e
//PSC
; w5 _9 c. X7 w" L* ^ //add Enable MCBSP
. q! \, \/ N0 d6 p: [5 M, L //test1 X$ B a4 x" e! b( U
temp = 0x80000003;/ T0 H6 d9 _1 c$ j' x. a
writel(temp, IO_ADDRESS(MDCTL15_ADDR));* g0 l3 f, u/ ~5 C
temp = 0x00000003;
$ W, }9 i9 d) Q9 A; K$ [% V writel(temp, IO_ADDRESS(PTCMD_ADDR));
0 X2 [5 b# [2 _1 ^ $ p+ |) Z2 ~0 i* I& r% ]9 p% o2 Q
temp = 0x001FF201;* }* P& p. R/ n% `
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
y$ R# x% J& a
, a1 g# m* Y' y' K; Q //PINMUX
- ?. Z9 [! e2 s* k4 j5 {4 O: C //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
+ ]2 T6 J5 y3 ? PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 r) D# \/ R, A PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
/ _; P. ^6 f# B8 S; C writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); \0 y% o: ~4 F; e
, E& Z: `# b8 ]# v6 x0 u
//SLEEP_EN,EPR,L138_SHK1,L138_RC
6 R' G# C S) [1 b1 l6 L PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 M7 z0 L0 z* ` PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
; j1 d @0 R% e( J) t writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 A/ z R1 |' ?/ b; z) Z9 G$ T 2 y) |- A6 }' `; M4 N4 h
//RESETn,L138_SHK2
3 N6 c( _2 a, c; @ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ! X; G* Y" b. a! m3 J) o
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
: a' h( e$ K: [& B1 } writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% J& @% U! L( E4 k5 \# K7 Q. q # V0 E! o0 q a; G* H0 ?' O0 ^8 [
' [/ m2 }5 w0 o. @6 N) d1 U
//SPCR Register
, J3 _" v+ [2 w //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset+ `# i ~; l/ P8 j( s
temp = 0x03000000;//(DLB=0)
$ U i* X8 ?$ x6 t // temp = 0x03008000;//(DLB=1)* Z6 J+ w$ j& ~; I
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset. K# m' K5 F- T( V
temp = readl(IO_ADDRESS(SPCR_ADDR));* D+ W9 ^$ y' K. ^
printk("temp=%x\n",temp);: f4 C" u, I# h8 _3 H+ q0 M
" j( U/ L3 g' @* `+ m/ W" D0 y. u
//PCR Register
" S7 p4 |+ Q6 F# d5 G //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
4 H) e" x8 g0 p3 u+ _* \0 Z5 ` // temp = 0x00000F0F;- O4 \& h2 `, i1 `1 [" B- _/ n9 N
temp = 0x00000B0F;8 l3 s% P2 N" e7 `" u, V; t, i
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
+ W7 h( x. B1 J6 J temp = readl(IO_ADDRESS(PCR_ADDR));0 ?7 x( ]1 y6 v% {+ g( }+ R
printk("temp=%x\n",temp);
) ]: `$ M. K1 e) D" \: h6 n. k //SRGR Register) {* f8 K5 t5 W, `- e; D
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
) t' f% a. V$ f- P3 E //temp = 0x301F000B;
3 t( q7 Q/ J1 M7 F2 L7 | writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ( t8 \/ J' H* e' ^( a* ^$ y) U
temp = readl(IO_ADDRESS(SRGR_ADDR));8 L4 Q8 R( r8 v5 Q/ h
printk("temp=%x\n",temp);$ g* C! m6 q. e5 T V6 v6 e
//RCR/ t7 M# _5 i; q, a
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
+ E+ c! u3 ] u; l0 A //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
. Q$ R7 R; h R/ E& T temp = 0x00440040;: r# h! Z; H1 h5 S- v+ c
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized m/ A# T. R' { e) v" ?
temp = readl(IO_ADDRESS(RCR_ADDR));
8 g' U4 ]: B) }) h4 o+ b printk("temp=%x\n",temp);8 C7 [; V5 P# \
//XCR
3 R5 ~1 u; L; Y% A, z //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
7 k5 n( q4 ]: {1 Y I$ p8 q9 m) V //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0& `4 X! L: C% I6 M3 }, {
temp = 0x00440040;( ]- s U7 |" g6 k; u
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
2 c- x+ I& O( I" O temp = readl(IO_ADDRESS(XCR_ADDR));# _. k" X+ T( s; @: @# y+ m s
printk("temp=%x\n",temp);
( [/ q2 s" z6 Q9 s) o7 R% E udelay(100);
8 B2 p t6 C+ M! `; q //SPCR Register9 {) n" ~. g* D: Y
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
* s0 z' c& z) [3 `/ O7 | temp = 0x03C10001; //DLB = 0 VS DLB = 1
9 n; J6 ?' K% @; R9 ?% u writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
) K+ l7 u/ `8 }4 @+ A temp = readl(IO_ADDRESS(SPCR_ADDR));6 v; Q6 F. {* w. k1 s5 G3 U
printk("temp=%x\n",temp);5 x1 e+ _! u' \
udelay(100);
1 s# ]6 u/ ^7 g9 E# m9 I3 ^! {/ }( o6 Q) x; d$ J8 r
//set GPIO direction
" U1 h5 ?- u3 p5 q, d temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
) b: i) m3 K8 {) I temp = temp | 0x00000100;//EPR----input# ]: @8 T4 q! C1 f: ~
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
, Y+ ~' q( ?( o# p; Z% n __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 7 e# C( e; s0 F1 L7 q/ Z
2 v) ?# [5 Y f+ C4 Z+ `; u( W1 K
return 0;% r0 \& l0 }9 X2 T
}5 p8 E! V$ i$ _7 J1 \& T& |- c' Q
static void __exit MCBSP_exit(void)) `% [% N& I4 @/ S/ w
{
0 L2 _ z- j6 W: I+ j6 D0 B; S1 _, Q printk("mcbsp chrdev exit!\n");% ^. i" q( ] C9 _' H8 J! n9 s
cdev_del(mcbsp_cdev);/ W+ C$ R( o# R) |/ {4 ~( W( F* i3 I
unregister_chrdev_region(mcbsp_dev,count);4 I" _4 W3 c2 l& K' f6 [
device_destroy(mcbsp_class,mcbsp_dev);2 e& [- w. r, M7 g. D
class_destroy(mcbsp_class);9 }6 j* ]$ A! X5 ^$ b' ?
}
# E. }/ d6 _ x/ q# hmodule_init(MCBSP_init);" z* ~. b/ a8 d/ d2 F: j& Y
module_exit(MCBSP_exit);. T( k t: d' o2 l W! |* ^: E5 G& m
/ f5 b" L% l( [+ i( ~, p2 R# BMODULE_LICENSE("GPL");
7 g0 S( n& K9 ~! A3 Z/ I; O' k q$ b2 R0 W1 e, G; s
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 g/ p( U5 W9 p) S' E我的应用层的测试程序如下) v( ], q4 P* ]9 ]
#include <stdio.h>
1 a6 r/ U, J; F# H#include <string.h>
% _" w5 Y; i0 ]: X. a! l3 I#include <fcntl.h>
2 T1 h. o" M, ?( J, C8 r#include <unistd.h>
% x" a" r* H6 R! F) r* K#include <signal.h>( }: u) j [$ ~. ]6 q0 H9 V
#include <pthread.h> //线程- D% H5 P: N& z& `6 ]7 C' E& |
#include <stdlib.h>
+ r. ~& q0 p _#include <pcap.h> //捕获网口数据
3 P" g% K- @. j/ `* h v#include <semaphore.h> //信号3 u& D: B% q3 b2 r* [
#include <sys/types.h> //消息对列" N6 A0 S, q3 |/ S/ ~
#include <sys/ipc.h> //消息队列
6 T. M5 q' m& ~! \#include <sys/msg.h> //消息队列
+ u1 K: n2 K! j8 u/ l$ d u6 B#include <sys/select.h>6 ~5 h2 p1 h# n: `% w# c( m% y
#include <sys/syscall.h>( c+ q" A. D$ u4 o
#include <sys/stat.h>8 i4 _% L1 l p
#include <sys/mman.h>
4 @. I p& k& B8 q#define msleep(x) usleep(1000*x)+ b0 o8 R& y! O" ]
- s( l+ a- i: E$ S% r7 P6 o
int main()
+ O2 }8 R2 O2 _{ 5 ?. V: |: C4 o2 n
//MCBSP,ARM与AMBE2000交互设备7 ?- ~/ L3 G/ R' m. C; u5 E
int fd;3 O5 ~1 }& ~7 Q
unsigned short data_write = 0x5555;$ x7 K+ p( U& y+ q3 @$ I- C! |
unsigned short data_read = 0x00;
% \6 Y/ l' Y; ^: [* r' { fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ O8 D. Y' A. w9 x // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
- P( l' ]3 | J. C9 w
( ^7 X& m/ |3 [7 ]1 W if(fd < 0) s2 ]3 G5 j' Y, e
{' k; S2 ~: C" w# ^. a- X
perror("open failed\n");
, B% p8 k4 t9 ~' v' [; k return -1;$ Q5 K8 F( A5 _: ~3 m
}9 C7 M% H4 J0 i6 O
7 x& E5 X6 H+ i while(1)
- o3 g* n: Y, d) i, j# s/ ]9 y {
& E+ F, I9 S1 l& s
: y4 A+ Z" c1 C6 l2 g- z( U //AMBE2000每次读写是24个字为一帧1 T: p9 o5 N+ H* _2 V
//写数据时将数据在底层存储起来,等到中断的时候再发送
& h1 S3 i, m; _+ j) l9 K //AMBE2000输入数据是以0x13EC开头的
9 ?; e6 Z4 E [# o) Q- F write(fd,&data_write,sizeof(unsigned short));! e3 ]- C1 D8 x% y" D; A1 G
+ A# ^, N0 M/ J$ k //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
; Z+ F# Z2 @5 g& c read(fd,&data_read,sizeof(unsigned short));+ ^9 B! m) w4 d& B* h3 @
1 e$ }/ [. u, o8 Q, _( z if(data_read == 0x13Ec)5 G+ C8 z$ r+ T, P l) Z- J
{
$ s6 v4 d2 I4 @+ j9 P 7 {4 i3 \" b C$ p% F
printf("data_read = %x\n",data_read);/ ?% x3 e$ ^( [/ t
}
* a' L6 y; t; W! F3 X9 J7 y
+ c* O. ?( Q% y, `) ? msleep(10);
0 ?6 }% M0 K% l. v
/ j: {! y* v+ c3 N7 I /*
) r7 G1 |$ A9 O4 P/ K/ v9 O ioctl(fd,1); 7 w6 ? d' f4 X9 }
sleep(1);* \5 q }- W7 e" F, S
ioctl(fd,0);( q4 w5 x O! X" i' C
sleep(1);9 m5 e) c& K; c( z' k
*/ 6 z6 X: K* Z( d% z
}
" O4 E: y8 ~ M! P w1 x return 0;
9 O5 w- K8 }3 l) a
: @' I1 ~' ~% r- p$ v& B+ C7 t}3 `. K. s; ^' r0 s0 p' O1 \8 x
/ f/ | p( {# E" P2 L: u5 B5 p0 K3 n多谢各位指教,谢谢! 急
# _6 o& b" o2 K9 U* @1 w
, p, ?1 p% ]$ S8 K& b& ?/ f# |: Y* E. ], K* _
: c# x3 M' H% P8 J; x
, G" Z! v, f3 O- O( g& }
6 i6 w. O8 I, _+ }' V |
|