|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
' |3 D( d ?. }2 u& H. k/*: Q8 _! L4 R, f+ y) T
* Copyright (C) 2009 Texas Instruments Inc
) s8 ~ f: Y4 P8 |6 | _( g: D *
9 b$ T0 ^2 f) N; R7 k4 R# x * This program is free software; you can redistribute it and/or modify
6 T/ S: A0 C- D. j7 q * it under the terms of the GNU General Public License as published by
8 ]( f. g" y6 R" }* w/ x( v * the Free Software Foundation; either version 2 of the License, or# u; B. o* V- ]" J
* (at your option)any later version.3 P, W" E( W) c8 }2 B0 ^" _% Q2 D
*- _$ m/ ]# W6 i6 g) {- F. B
* This program is distributed in the hope that it will be useful,
; G! t8 X" y7 _ * but WITHOUT ANY WARRANTY; without even the implied warranty of
& ^# W }' e; |: L1 a3 B7 c% ~5 V * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# R I6 h: G% o2 z/ n
* GNU General Public License for more details.9 e& n" Z# O& R+ e1 A- }( }- }
*
$ u9 J* o& z( B* H3 ^: B* l * You should have received a copy of the GNU General Public License' A9 i5 c3 S& X, w
* along with this program; if not, write to the Free Software8 N, {2 ]) O1 y) x
* Foundati
( |) ~: }! g3 E) X6 B) D6 {*/
: {8 j. F) |5 W$ e$ C4 }#include <linux/module.h>7 |+ l# _& d) H% K9 W
#include <linux/init.h>1 C! [: d8 T) r7 N& ]
#include <linux/errno.h>* T# S" y- Y) |8 P* s2 ^" I
#include <linux/types.h>
, }/ C" J! Y, m7 N& Y9 g#include <linux/interrupt.h>$ o5 Q1 Q7 } s6 W# i# z$ q
#include <linux/io.h>
4 J) E# ~' I) i9 o' s#include <linux/sysctl.h>1 r$ R" d/ ?: B! v% m5 N
#include <linux/mm.h>, Z- | F9 {' p, i6 k" c
#include <linux/delay.h># U/ K( u" x: Z5 _9 ]" p6 `
#include<linux/kernel.h>. O. A# ~1 Z9 C+ J
#include<linux/fs.h>( x) k( a) q$ s7 E2 i
#include<linux/ioctl.h>
: ?4 F: ^) J, k! ~/ U/ Q9 {0 ^6 {9 S' {#include<linux/cdev.h>
# o8 d U1 S; z! h#include<linux/kdev_t.h>
$ V$ i; m' p ?0 o#include<linux/gpio.h>
5 _- m6 |1 ^0 R+ n& b#include <mach/hardware.h>( t) M6 B8 x9 _2 z
#include <mach/irqs.h>. q. u; X8 l+ n+ e! W$ u
/ M7 c. r- |! G7 ^$ Z: F#include <asm/mach-types.h>
8 I, N A% u- U#include <asm/mach/arch.h>9 u3 o4 P" p- w! M; R7 _
#include <mach/da8xx.h>
$ B4 d7 _. R |+ D2 k1 A) v#define SYSCFG_BASE 0x01c14000
* |: P8 o3 S) q#define PINMUX1_OFFSET 0x124 6 ~: h7 D; V4 D
#define PINMUX18_OFFSET 0x168 7 [5 X! h: l' T% L8 m
#define PINMUX19_OFFSET 0x16c
+ D& p" b) S, O% ^$ n#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
* Z3 _! ~3 l2 x6 G4 d( L T+ V#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
) g! I7 Y& o6 b#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
2 j3 O$ E1 T" d6 Z% Q" o' s" r#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR9 Q8 U# ~* J# ^& ~
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR3 P0 k! A- ?( o. f& F
, y$ K& s% L7 E5 j. ~" o$ U#define DXR_ADDR 0x01D11004 //MCBSP1_DXR# }! R/ {6 u( S6 R1 u& n
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR5 ], }5 L% Q% i7 b D$ k- d
//PSC
* |# U* N) P. `1 |#define PTCMD_ADDR 0x01E27120 . g' m* r8 N( m m" T
#define MDCTL15_ADDR 0x01E27A3C" f. L- c3 X% ]3 X1 [% m
#define PDCTL1_ADDR 0x01E27304
5 n, X" }6 e" N& w7 F//GPIO8 direction6 o. M/ X; N. H+ K2 r0 R* k
#define GPIO8_DIRECT 0x01E260B0: w, j0 K+ h# c f
#define GPIO8_OUT 0x01E260B4
- W Y+ ]0 ~ ^( t5 u#define GPIO8_IN 0x01E260C05 u, |- `! |2 \
7 k/ B+ E. B8 ^//#define MCBSP1_RINT 99
% l K% c4 N5 q8 \. X//#define MCBSP1_XINT 100 ! w( o# q8 d4 m
static int MCBSP_MAJOR=239;
% A7 P( i7 E0 T! n7 X8 cstatic int MCBSP_MINOR=0;
' F! x/ I7 k" j6 Wstatic int count =1;+ Y$ J1 F( Z" _0 o
+ ]* k- s: j! }. X# `7 a
#define MCBSP_NAME "MCBSP-device"' l; U' Y. i0 e0 v/ F# B, V* Q
* m% `* Z8 d5 d1 q. ?, Q$ V
static struct cdev *mcbsp_cdev;+ c3 M, o( t. |
static struct class *mcbsp_class;
7 J. u* ]' n9 V6 J4 B7 }, zstatic dev_t mcbsp_dev;3 d: a+ v1 B3 ^! I& i, E# r& ~
unsigned int DRR_data;
! x5 F( ~8 Y4 A- Gunsigned int DXR_data;# j7 R4 {/ y0 h2 f0 T
static int mcbsp_open(struct inode *inode,struct file *file)% L" n2 ?% A1 H4 ~" x' m
{. o- G( Q0 {1 ^- k: O. V
6 ^" F4 G1 I' _
//interrupt enable,initialized/ _) t7 T; q7 b& s4 G
unsigned int temp;
4 W" \2 {' D8 T& U5 t //SLEEP_EN(GPIO8[10])---05 B/ j- ^; \% ^
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 l1 `1 o1 h0 U# U! R temp=temp&(~0x00000400);
$ L! L3 W, l! t) h W6 ]% x6 s; u __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
0 w/ i! H1 e% ?3 v8 d9 J //RESETn(GPIO8[8])----0----1
; {7 ~! O- ~$ z- O9 G. | temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( @- |& T2 Z$ V8 @
temp=temp&(~0x00000100);
3 N* Y0 A$ m: z9 w7 i3 ` __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 O) P; Y7 c. \. c! y# p3 t udelay(100);
, n1 T3 N) {2 A C1 G" d2 W! D temp=temp| 0x00000100;
+ u$ f& O9 B4 ^0 F0 ~1 S# _0 @ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 @+ @/ D# e" B; A" u0 B) U udelay(100);6 X9 C3 Z# n: V3 Z
printk("open success!\n");1 ~- U/ y' O% _# M# w
return 0;
* o5 c4 x8 X! a/ l! W: k( k}7 w7 A) f3 c1 o/ H8 u, U
# V8 |, I% v( {- Y2 S$ r
static int mcbsp_release(struct inode *inode,struct file *file)6 i& P# s, T9 v: P ~* G
{
" M; E' X+ s3 ]! U6 ]0 M& H( ~& R3 v printk("release success!\n");, \; |1 O- Z8 s0 o8 V! S9 @. L5 `
return 0;4 w- T# x2 t, i, v2 i
}
$ S8 |) C- |, ]
* B; H. E6 I, R4 A; W3 t& nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)) e. y. {" i4 C8 Z+ K- |
{8 Y M* @! L Q. V
copy_from_user(&DXR_data,buf,len);" ~6 O5 J" ]! e7 d0 [6 G7 N" C
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
6 [1 @ }% w" H/ O' a( M) G- ~+ C return 0; F" ~. y2 Q* B) |: j
, _9 \+ N; P& J3 a4 r& @& L
}+ A5 U9 J6 v# J1 l9 G* D
+ y& i, r% W0 C' k6 f' _0 }static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)8 c( E: V- k. @0 I
{
, _( K* Q. K1 u1 H5 m DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: Q; @. @0 N6 r
copy_to_user(buf,&DRR_data,len); * N; }5 X( Y! ~) v. Z$ d% A
return 0;* @* g0 h* G( L6 Y* R- d
}8 F( f+ M: D: l2 g0 g! S8 k
% a1 d/ h8 J& y1 s& \8 S
4 o1 v7 T( g* e8 q+ ]3 gstatic struct file_operations mcbsp_fops=
+ G! Z G t+ a7 v1 U0 S{
% }6 Q3 q3 P* h3 A. M9 d; f9 a9 A9 D- j .owner=THIS_MODULE,
) P) u- c/ z: r7 \ .open=mcbsp_open,
9 O& W$ E9 r) {# j9 ]$ F .release=mcbsp_release,
" [ l9 x; V5 t3 J! O- E' _ .write=mcbsp_write,, P$ [# I# D. j9 z
.read=mcbsp_read,( @ S( L6 N2 v& w3 J, C
};5 _% U) ^3 h* l" q1 _
static int __init MCBSP_init(void)( h3 L( g+ Q* N" ]: ^: M
{# M/ O# x' W6 Y ]7 Q: F( w
int ret;
6 @: e4 c* g' s s: f; D; O unsigned int PINMUX1_REG_old;0 ^. b7 z% [( G( q. w2 @; i
unsigned int PINMUX18_REG_old;0 d! }0 i. C# W4 u9 l
unsigned int PINMUX19_REG_old;: t1 x7 @; t1 k- r
unsigned int temp; " e, B2 _1 H. h& M! h( O' ^
if(MCBSP_MAJOR)
0 |2 `; [& \" s5 m* A {# J$ w+ Y& H9 a
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
! f0 b* b" L6 u9 C: D ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);6 K; g Y A. ~6 N P! M
}5 L9 g! E5 O3 g- [3 ]
else/ Y* @7 [! k# \) x( C
{/ J" E; T, @7 x% b1 q! Z
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ U4 [1 y8 \# Q& ^2 e4 @
MCBSP_MAJOR=MAJOR(mcbsp_dev);, b8 M4 h8 e X4 `0 N$ W
}
+ I! n# ?' K7 l5 J# `& g! T R: U- |, i' R- |" c
if(ret<0)
( P k0 @" U u. E9 ?. g9 I W {1 q* g) j* H# R) j* D' @
printk(KERN_ERR "register chrdev fail!"); L, e' u( \2 ~) L! T0 V+ k
return -1;
: R3 ?1 }9 T( R; I }
& g; m( U) X i& m! w& r5 x& Q
2 b/ ? C P7 J# z, J mcbsp_cdev=cdev_alloc();
% i( W% @+ r* ^: V0 W 1 B2 R/ O; b# \; ^; W# w* b) T
if(mcbsp_cdev!=NULL). j# M6 d O& b6 E) m0 ^
{
) R# r( t M, a) V; C6 S cdev_init(mcbsp_cdev,&mcbsp_fops);
. q Y) r8 Q1 S; k mcbsp_cdev->ops=&mcbsp_fops;9 I4 g# Z' D" E5 X" _9 s
mcbsp_cdev->owner=THIS_MODULE;
9 [: f- V0 I1 J( G+ M# T B7 X1 d8 {7 D 6 {! M; v# `& H# e8 Z
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! t/ D( C+ U( k+ a% F% y printk(KERN_ERR "register cdev fail!");& C" M$ k; U; c+ ]7 E/ K$ s5 H
else
. L/ {+ h( @- {8 Q; V1 h/ t8 w printk(KERN_ERR "register success!\n");' i+ l2 A6 s i x) A# V) b
}+ o$ T5 ?! U' g6 H
else' ?. f* m9 V1 k4 j& T' Z: E
{
I$ t' r) T! D7 H; m. @, Y) b printk(KERN_ERR "register cdev err!");; K9 P! h% I5 ] u0 r- [3 X
return -1;
4 v/ [, d: `* G( O- j; x5 j }. g- e t6 q4 N
1 S& o: {6 k7 b0 U( m: H mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);0 y' O# I, k5 {0 P, t/ h
if(IS_ERR(mcbsp_class))
: S$ i/ i, D/ H$ C {( T) d5 ] Z7 g; k/ s: E- n. h
printk(KERN_ERR "register class err!");
* o9 F8 `& w! Q. [& v4 [/ q return -1;
" H! I( A1 |4 R( r" B) N3 |0 N }
6 a& G Y5 o* Y( g: ^, W" h( \ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 T5 h* X! S& @& ^
- n4 Y' l0 r: c5 O: \
//PSC
) Z5 ~6 I5 @. F& {5 `9 T //add Enable MCBSP
/ f; K' Q! q8 f/ p3 h0 W //test
! V% X$ c" i- l3 }) d4 H3 B$ d temp = 0x80000003;
- R9 A7 f" L8 M' S) J writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ k6 d4 p7 K+ B, B4 S1 \; w
temp = 0x00000003;+ J) d# p2 u8 J7 w, i! B
writel(temp, IO_ADDRESS(PTCMD_ADDR));
9 {! P9 b4 Y B; F# x
# X) Y0 V5 P% V9 I! E6 s( I6 | P temp = 0x001FF201;' N2 ]. `* O% N) Y3 S/ `4 O
writel(temp, IO_ADDRESS(PDCTL1_ADDR));9 M# ]7 `. c% k( \/ V) \
# ?8 |! y1 k6 h' ~. |0 p/ y/ w //PINMUX
2 q1 v# X1 H+ S- i& m/ S, ` //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
k+ K% u+ T6 K& Z0 [ PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 8 L9 U- k. u" G+ X* z
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; / F' M) Y- ?7 Q- C
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 A, q) ]9 V7 e3 V7 s 7 Q. }+ B# g0 C" [. U* Z8 d
//SLEEP_EN,EPR,L138_SHK1,L138_RC! q' r8 y3 M0 E4 e
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); + i- _0 h' m- g5 h! _
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; - {( l( p; P( y; R3 X& c
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
1 q/ `4 a2 {6 |
: e$ d q$ _$ e( i1 ]# J$ }/ z //RESETn,L138_SHK2
' z, K, B4 h9 @1 o( u f PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); $ F, @0 c( ^* w# W- U1 d- d
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; & F6 I0 X8 t# g) C& Z
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);0 K) W9 b0 z) F% L' U e9 j
) V2 x6 C J( e" D # q+ G2 T$ e7 \+ [$ T
//SPCR Register- f% f @# G5 e5 b2 t9 Y
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 c+ \7 |# h5 e# s, z temp = 0x03000000;//(DLB=0)
2 C! l, a# e# a/ a* U. I // temp = 0x03008000;//(DLB=1)7 Z9 n' w3 h" V3 Y5 M# a
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
- ^, w, X, F) @$ w5 @+ J, K temp = readl(IO_ADDRESS(SPCR_ADDR)); x* {$ s" G3 X; F9 T1 v
printk("temp=%x\n",temp);) T0 k; V! V# E/ ?( `7 H* h
& A5 n7 C( p; _% M
//PCR Register. W, l; K' I. B$ F+ u
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; h& y9 Q8 q: Z7 @4 K
// temp = 0x00000F0F;9 @% k# m) ?9 Q. J$ q
temp = 0x00000B0F;# p7 ~1 T4 v( H5 o
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized P- X) P3 m& E! I# p
temp = readl(IO_ADDRESS(PCR_ADDR));8 W% j( ]# _; v F
printk("temp=%x\n",temp); 1 g$ Y6 P! P# a6 A5 M, \( ?, B% _
//SRGR Register
; K$ `3 s% t* n: D8 { //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 p- K4 w: y1 ]7 U# |
//temp = 0x301F000B;: ^9 @9 n$ g, B" ]
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
4 _! q5 F5 t F8 v* G temp = readl(IO_ADDRESS(SRGR_ADDR));
$ f9 c- A+ ^2 L% A, X# [' E printk("temp=%x\n",temp);6 o2 b4 i9 O, `9 K, H
//RCR
6 D ]# G: L/ r //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* P$ r' l6 l) t! y+ z! p- N- q //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
5 Z ~ ~; g2 W s9 L& ]) z temp = 0x00440040;, P; |7 @& O' I
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
, Q' P0 o) c3 o9 i0 `; @ temp = readl(IO_ADDRESS(RCR_ADDR));7 L' D `- S: D! }
printk("temp=%x\n",temp);
; M; q1 @, x9 ^9 n u( H //XCR
! b$ c+ Y* s) u //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
- W3 n# I9 g8 B% b0 c //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
& N. {) T0 I* n+ c/ l) q! \+ [4 N. l: h temp = 0x00440040;$ b0 N! o* e' I$ |' t" D9 a
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ! w# x: Z; U1 m" ]3 Z- ]3 ?, |
temp = readl(IO_ADDRESS(XCR_ADDR));
* B8 B5 p0 A6 v% u printk("temp=%x\n",temp);) u9 N7 Y/ |5 g% S
udelay(100);
$ O$ A4 S/ ]; `1 }4 a a: d% G //SPCR Register3 f! L) R4 j: h% o! f) ^, Q: \
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
: j7 ~& c& m6 j2 F7 O' ? temp = 0x03C10001; //DLB = 0 VS DLB = 1( x3 V- ?) o x& ~, S; x
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
7 g2 l5 \/ ?2 g* [ temp = readl(IO_ADDRESS(SPCR_ADDR));
& c+ i- y/ ^8 O5 n d printk("temp=%x\n",temp);0 c; _4 T/ i. o2 L
udelay(100);" a( p' K; r: x/ S0 W+ b2 z
" \/ M6 i3 R; X
//set GPIO direction) Q# _4 A& z$ K2 c
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 i1 Y8 {' {/ {1 L# Z5 U# Y
temp = temp | 0x00000100;//EPR----input, \: m! r0 _8 |2 S$ M0 @
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 k. K' g6 A. ~/ y* q# K5 V% ~ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
2 H! } @( n( y( _ * O& B; \& n: y/ F: b
return 0;
$ {/ E8 r/ p1 ~! c}
3 [& b9 H3 o* p' d5 B2 D3 i8 hstatic void __exit MCBSP_exit(void), ^# }, e6 {3 d% L6 |
{% }% q7 P5 d( e* n" a
printk("mcbsp chrdev exit!\n");+ ]! @( s5 i' S
cdev_del(mcbsp_cdev);" y2 W' a6 H5 F( d
unregister_chrdev_region(mcbsp_dev,count);' e2 F- A4 b6 a6 E' J" W' J6 t
device_destroy(mcbsp_class,mcbsp_dev);
+ u9 |+ }1 s2 O- s [5 u* n; Z) H class_destroy(mcbsp_class);6 J9 s P" m# T! Q
}0 F; U8 u+ {2 ~1 K
module_init(MCBSP_init);+ \ Y9 R; z# I
module_exit(MCBSP_exit);/ N+ M2 M% R/ R1 q0 B: m2 l
- Y( i+ ~2 L: b9 j+ u" mMODULE_LICENSE("GPL");
% {3 G# }( M7 b' F( k7 o+ Q# `0 c, d+ G2 P0 ?; w3 m0 M
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 s& Q& K" n W) k% w9 J$ t6 u4 A: D" [我的应用层的测试程序如下: W' ]4 o. c9 r9 P
#include <stdio.h>$ H! X1 w7 o* ^* Q8 \
#include <string.h>& |7 ?# E* k/ M5 a
#include <fcntl.h>
( P& u& f5 g$ x% i#include <unistd.h>
9 H( v, s4 y; [+ z* X7 E8 X#include <signal.h>+ q! l+ d6 A f8 O
#include <pthread.h> //线程% V. i/ W; R! A' U7 j# _ Z1 l
#include <stdlib.h>3 D* j2 L1 t* F2 n
#include <pcap.h> //捕获网口数据9 M! x+ F( g8 \; ]
#include <semaphore.h> //信号
, W0 {/ E/ a, J) f0 C#include <sys/types.h> //消息对列
% g; S2 I, s4 B* i) y N3 N#include <sys/ipc.h> //消息队列5 f1 h( Y; O, X1 S3 W7 C
#include <sys/msg.h> //消息队列3 C! ^4 w, X$ o5 j$ G
#include <sys/select.h>
& d# B$ v5 Y0 R% S0 K#include <sys/syscall.h>
1 w' q' @' J/ c( @6 ^9 D" T#include <sys/stat.h>
' R0 f/ |6 O+ V/ m" o4 D! h#include <sys/mman.h>
* h! q' f- @* R1 K9 S9 |#define msleep(x) usleep(1000*x)( f" A/ F: F. e# [ T u
$ Z2 [. S8 @, X5 Q7 E" c3 W
int main()
) a5 p. {9 o& k1 X) E v% K* f/ o{
- p" Y h1 j( _& k //MCBSP,ARM与AMBE2000交互设备
% @0 B; ]9 M$ ~4 c) w1 Z int fd;
0 U0 l2 y6 W1 x% J unsigned short data_write = 0x5555;
) I/ P- ]+ C+ V, e e* n unsigned short data_read = 0x00;" q7 C; D: |" c
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);" f3 f' [) g: z& ?
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 F0 `6 I+ N3 z/ G6 w/ h $ }- I: v$ G2 X, b, J- c
if(fd < 0)
3 O/ p% X4 ?4 M# q1 m2 z: p, Y {
" D4 b! g4 I0 }! A/ @ perror("open failed\n");
& q4 _. K% L) H; o9 I: F$ B return -1;
/ y Z% {8 r, M$ T }
3 C' D! `$ j: D& l1 n4 J: Z
) Y1 d: M1 Z; M' d7 {3 S while(1)
$ t8 l' Q3 }# [; ~ {
! Q0 w& C! T! C- ~/ W; o$ h" d1 k 6 n7 I4 N- y6 Y: n% b/ G
//AMBE2000每次读写是24个字为一帧
$ t: O+ r/ ~6 A* u0 n: [5 `2 B //写数据时将数据在底层存储起来,等到中断的时候再发送
3 y3 _& ^, q5 i! T& ?' p7 u //AMBE2000输入数据是以0x13EC开头的4 F9 F4 {+ B8 w: [8 a
write(fd,&data_write,sizeof(unsigned short));1 j. B% F( B: T) G* S. g
( V: [3 y; ~8 Q
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 * ~: h# l, \5 k/ _% S" _, a
read(fd,&data_read,sizeof(unsigned short));! Q& r! K" T& Y% h5 r- v
$ E0 B, E* Q( H# z, E5 l4 Y3 f
if(data_read == 0x13Ec)8 Z/ F: U- M& ]% u" }
{, C- Z! g/ m: f9 I
# L" T* h% z+ i+ h" w" b B) B/ \
printf("data_read = %x\n",data_read);$ X1 B0 a. p) D
}7 v9 s# Y; Z1 ]' L+ z9 x
8 Z3 |9 a4 j' q3 S
msleep(10);
# q2 W7 Q- @9 i( K 6 D: n. [8 a1 ?! v3 O! d' {
/*7 [) e% ~7 F) f1 q+ b+ F% a
ioctl(fd,1);
4 C5 c: J; `6 d7 u3 [ c6 y: b+ e sleep(1);
: S, l) @8 l! ?; b ioctl(fd,0);
" l6 {. L' p! F/ B: Y3 i7 t sleep(1);
) f5 K+ Y4 D% N' U9 C$ c4 _ */
7 H4 R8 n+ _3 k% p" C0 m7 z }
4 m% h* c& F0 f% h z7 R$ f return 0;
1 Z& s% f$ L+ i0 ?( K# r) v
$ N o" a6 w, S6 R. y7 _3 V% ]}" D4 _7 @# q0 y6 k; i
& l/ Y: G y7 E$ g, y# m
多谢各位指教,谢谢! 急* w$ J9 i9 ]* f5 C( T, \
, y8 `. t% p! \5 L b! w& W9 C
' ^4 u& Y) S/ |9 ` k8 O) J2 y/ G1 l
' \3 x% l+ ]& M0 E8 U- g y- C$ Q9 v- v
|
|