|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 `4 g' A9 j* u2 {% k- }) { G/*5 P3 l0 d$ D9 @/ L; x6 {5 x
* Copyright (C) 2009 Texas Instruments Inc
- E: [% A; q( C *
% x* t; Q9 s- U$ F, M * This program is free software; you can redistribute it and/or modify' A* J* B. L; m. x
* it under the terms of the GNU General Public License as published by# P1 X' w8 T0 z" k4 X& t
* the Free Software Foundation; either version 2 of the License, or
5 {: Q6 a3 R! ^- K- g7 E) z1 Q * (at your option)any later version.
! L5 f4 _. p2 f( U0 K9 L; H: h4 _ *% R2 F; @8 o; K! A* r6 b/ ^/ r
* This program is distributed in the hope that it will be useful,
' U) q, X z- j& m- `/ I% s; t * but WITHOUT ANY WARRANTY; without even the implied warranty of
6 h1 |0 @( a6 \0 D$ H0 H * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the! H8 R6 ?# Z6 ~9 s3 R9 ^7 f
* GNU General Public License for more details.
" y/ P- R1 p% E1 ], k: G *
1 R4 Q! ]" R Q! q( X$ B * You should have received a copy of the GNU General Public License
! x3 N( ?) r3 } * along with this program; if not, write to the Free Software
8 c8 h' m( E5 S; t7 y$ s/ L * Foundati3 R4 G" p! e G
*/
. d, H. k2 H" h#include <linux/module.h>
6 Y2 t. x9 S) w1 @/ [* h#include <linux/init.h>
& ]5 z) e2 p6 J) k4 h#include <linux/errno.h>+ \& \. W1 V( t# u m) ?- o
#include <linux/types.h>5 P$ n3 ]# G& J) ?( h
#include <linux/interrupt.h>4 w' V. |9 @" `/ |9 T8 Z! ]- m
#include <linux/io.h>2 H. u' C" y: A
#include <linux/sysctl.h>0 i# M6 S' U4 w3 H! i
#include <linux/mm.h>
; _: b' z! H) p#include <linux/delay.h>
2 q, t" v$ X6 Q4 Q. {#include<linux/kernel.h>
, T; G. N5 k, |' `4 f#include<linux/fs.h>
$ R0 ]- r# z' l; L7 b- O# L#include<linux/ioctl.h>
7 }$ ^8 T: I# a: u u7 [#include<linux/cdev.h>4 |% i$ R" F0 X# E3 l
#include<linux/kdev_t.h>
6 ^- a7 G o+ m0 `1 ?5 I9 [#include<linux/gpio.h>8 k/ Q( F' S0 t
#include <mach/hardware.h>3 X: G( K6 s: w9 R6 k
#include <mach/irqs.h>( z! A+ I! n) P8 ~4 n
) i; F9 t, H& P* E! j6 C- P
#include <asm/mach-types.h>
9 v, z/ u: A1 n#include <asm/mach/arch.h>! e) V" b! Y o; a/ a
#include <mach/da8xx.h>
' g* j. R0 _* P" c( b$ `0 H#define SYSCFG_BASE 0x01c14000) C% V% i' N& ]1 F& d/ z/ k* F7 m
#define PINMUX1_OFFSET 0x124
/ Z* W6 ` Y* O3 N# `#define PINMUX18_OFFSET 0x168
+ q' V& r) ^2 k" j1 z#define PINMUX19_OFFSET 0x16c9 X8 Q& d& ~# u* {! B! ^4 } c4 T
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR3 L* }% p4 I6 k& O& S% e9 o) L
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR: \2 Y: j! Y0 `6 w
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
1 c2 h0 v x! `7 u! c6 X#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
+ I& V0 n: T4 u. a, c% |#define PCR_ADDR 0x01D11024 //MCBSP1_PCR' o8 t+ T: m. P ?
1 ?% H2 c8 h9 b
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
@) u" U$ @5 J& O& p#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
8 K3 D& l+ Y0 F# a//PSC
' Y) p" V+ p# L6 e+ R) t4 n#define PTCMD_ADDR 0x01E27120
5 L: a5 K9 l7 G w#define MDCTL15_ADDR 0x01E27A3C7 ^. @, q: v1 w3 n1 I6 f
#define PDCTL1_ADDR 0x01E27304
+ Q+ I2 V) h+ M* ]7 l" ?% n//GPIO8 direction
' V. A, S0 f D: \" T$ Y/ D#define GPIO8_DIRECT 0x01E260B02 P2 w; t9 I; P) V
#define GPIO8_OUT 0x01E260B4
* c$ \2 Y0 R' A. y#define GPIO8_IN 0x01E260C0# A0 t5 q B J5 x) d/ p
' [/ ]+ J4 b7 |//#define MCBSP1_RINT 99
) f( r2 q/ x4 C, X3 S# m# d6 @//#define MCBSP1_XINT 100
/ ?2 E; z! D3 u$ E3 c& n9 v% K1 Cstatic int MCBSP_MAJOR=239;
: c6 e" Z, }4 ^% P0 Nstatic int MCBSP_MINOR=0;9 n# i+ t$ j3 ~, C! @
static int count =1; Y# P4 Z" u. s
! H0 }$ }( x1 ^% e W
#define MCBSP_NAME "MCBSP-device". W3 w' i& \* s4 W) {6 @
8 l% i% A y0 N- B$ ], t, I0 \
static struct cdev *mcbsp_cdev;6 G ?0 s& W c3 H* G ? X' i
static struct class *mcbsp_class;( C* n% U$ b: l* D
static dev_t mcbsp_dev;
) ?' [6 `" }; x1 Zunsigned int DRR_data;$ U! s2 [- I! A- p. a
unsigned int DXR_data;( }8 D) d$ a/ t+ V
static int mcbsp_open(struct inode *inode,struct file *file)' [* d" I# i {! R( I
{
/ B3 d( Q# x; B- P7 P" E
- Q9 z" T1 l2 k) }" s( v$ J //interrupt enable,initialized q, a( v: W; W- D3 Q7 t& g7 T
unsigned int temp; R/ w/ L! [3 j6 `& r$ f
//SLEEP_EN(GPIO8[10])---07 X- {' W% e; a, r3 K3 B9 f
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- g% ?4 c7 J7 @ l
temp=temp&(~0x00000400);
. ]5 C+ O1 n' C6 Q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10] V& k) U' V! X) t5 v% ?) c' s
//RESETn(GPIO8[8])----0----1. w4 y- {' C5 f8 j3 i" n9 o
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT)); ]$ ^# N, L# l, S- Y( \
temp=temp&(~0x00000100);
! e" u& x: N" z5 P+ `0 y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 v/ M+ ~9 O' b5 B5 q4 B% e
udelay(100);
: |' ]4 c. K1 J- C( { temp=temp| 0x00000100;! q0 ~6 Z" l- B; w# \7 x
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
( W- r8 V" A! ?& S' u* b udelay(100);* R( r: H" r5 H2 l- I
printk("open success!\n");7 N4 f0 v( A `- F7 e
return 0;7 A/ X* ~; `7 n- I3 @0 p$ ]3 w- C/ v
} j- Z- M& I& g. G& x, y
# \- g& M: G( c$ L! |* A- {) C( [
static int mcbsp_release(struct inode *inode,struct file *file) i& t7 x( x) E; a, p# ?3 F* v- M
{
, c: \- B0 w7 }& V" d printk("release success!\n");0 t5 ^) u9 l) U# D/ R f
return 0;
9 X4 Y2 Z3 q1 l# G# l1 c1 I}0 G7 U3 a: R0 _3 Z4 {0 _
: U4 H; {9 J: q4 ?7 \5 K; i
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): b( _2 p3 m4 R7 f: `( \, S% ?( Y5 W
{
; z& z8 t- ]; w! N copy_from_user(&DXR_data,buf,len);
( P4 x# k1 W0 D: x. z# F% J( s iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
2 x( T) ]* t5 w1 A/ ?* Z5 z) l* P return 0;$ C/ p" T9 @0 ?9 j2 L
& |; j* l2 S0 b
}
+ N& H( j9 r" O1 T3 W6 w% V3 b, ?$ d( D. G. N/ y" F% S2 F
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)1 k: r$ I& D2 n2 [/ k1 Z0 i
{
0 G& V- E E3 O {6 N& P ~ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));" \# Y2 |, ~; [
copy_to_user(buf,&DRR_data,len);
5 r( ?, E4 k( j0 a9 w& ^ return 0;6 x0 u3 K/ |9 V+ ?, q
}0 a, k1 g# [! Q; |# H! x& K7 ^7 b0 }
7 Z8 T$ B. y9 s
' L, @- N3 }5 S; O3 Rstatic struct file_operations mcbsp_fops=
1 G; Y. U3 I/ t- i7 N{
" Y. m5 t6 n/ A8 R: L- { .owner=THIS_MODULE," i8 w. d% _/ S# s$ W
.open=mcbsp_open,. B# t3 C6 o8 _2 K
.release=mcbsp_release,
; L- L& K7 ~4 s8 G6 `' M! M .write=mcbsp_write,
/ Q- o; p6 `1 C2 Q' j .read=mcbsp_read,! n) Y4 f8 Z& s9 d# Q" R
};
" P# m& l: W: r' w' ustatic int __init MCBSP_init(void)/ ]) i9 b/ g4 }4 _# j$ B1 v
{; C* L2 ^- p6 e0 P3 e B7 K
int ret;% _6 `' }7 r' {( T; n: `
unsigned int PINMUX1_REG_old;
+ @5 s" |7 R9 Z( ~% v. n/ _ unsigned int PINMUX18_REG_old;
0 l5 _; {9 O$ s unsigned int PINMUX19_REG_old;9 _* G% t F+ x( ~0 O3 O
unsigned int temp;
, x. j0 ?! _, H- F% [ if(MCBSP_MAJOR)
# i p. ]1 m& A: t {
% C* n6 \; k% L0 ]+ H: l/ g mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);# N% }3 d7 E" y6 V/ V0 H5 Y
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
' Z; @7 [0 p# k3 b0 f2 `# @& l }
8 x, A% K' j) f2 K% `" M. ]5 Z else- ]7 L/ }) m" U9 P+ ~3 N
{+ T7 s- ^2 g1 U' H& T. d
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);/ ]4 ^& \3 g- m& y9 _
MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 c) N: O( F' G1 b' ? }
( p# R* a5 u1 ~ 4 Y" g$ h' I5 y/ |2 {' n
if(ret<0)" @" @6 a" q9 c K5 O% r
{9 i9 `1 n0 w7 w3 ^
printk(KERN_ERR "register chrdev fail!");
: u% Q: ~9 G& b) ^! R return -1;
* N M' @9 T5 f7 r3 \, B: ` }0 q4 q! X/ c3 @0 g
S8 ^ r( Z& c- D2 [9 j
mcbsp_cdev=cdev_alloc();, a) D8 O7 O& I0 s, I3 a2 H6 t" T
: h& x, D7 Z# I4 T7 A9 D) ]$ B- _
if(mcbsp_cdev!=NULL)# ~! T; ^& R+ u
{
- c2 z6 k1 s- S' x5 W cdev_init(mcbsp_cdev,&mcbsp_fops);
1 l6 W# F6 c8 z3 ?' C: o- H mcbsp_cdev->ops=&mcbsp_fops;
$ x; d& X- E* ?5 {: K/ b& E7 N mcbsp_cdev->owner=THIS_MODULE;
" {4 e: m, q# ?# V+ e. @2 M. n " j6 k" P. _! x( ]1 Z. w: W
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))) u2 M& v' p; R0 @- Y
printk(KERN_ERR "register cdev fail!");
9 D9 ^: {* U+ G6 f5 R else0 w) {5 ~4 n2 L
printk(KERN_ERR "register success!\n");
! w6 m1 D5 Z4 d- L& U }
N/ J8 N( _0 z) u2 Q7 z# Y( A else
8 Z8 {# o' J4 l0 ? {1 W% X8 V$ l- Y8 e, S& d. P. W
printk(KERN_ERR "register cdev err!");1 A9 V7 ]# B* V! N% k. l, C
return -1;
7 [+ g4 g5 q' C2 }, U$ T }
1 ^! b$ W' ]( e# B
, f7 _) Z% w- a) M mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
0 b5 U9 {8 R* J ~1 W& U if(IS_ERR(mcbsp_class))
! u) R- a3 s2 U" f1 P {6 l" ?& Q7 B5 B* f& z* B4 D' Y
printk(KERN_ERR "register class err!");
1 Q# G/ W5 I2 O3 L5 | return -1;9 z* f. [1 B5 L$ b1 t6 T
} T' [! G, C# L; B7 f
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. j5 C5 b5 w7 {$ P% d
6 q9 P& e0 Q+ m p8 c! C //PSC& q4 d( V* \( h
//add Enable MCBSP
+ D1 m# W$ s# M* H. w6 P5 c( A& ^ //test
' U. A% t8 N+ X* Y& E temp = 0x80000003;1 r% _9 y; l* i" Y6 O
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& A) q' T7 O! v. Z! C, [ temp = 0x00000003;
. {* W3 l' Q5 | [% }# a writel(temp, IO_ADDRESS(PTCMD_ADDR));) A$ p& U! x2 I' U* X5 ?% n! I
8 g' o0 Q2 P! t; }2 [7 W+ i5 P
temp = 0x001FF201;9 O+ w3 j! F1 m8 o' a
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
- j% k z! V, a+ H" g, y1 ^+ B* u
' u( P& T* S# X3 ]1 F+ N( V //PINMUX 2 d( }# u. H$ m: W
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
j5 g0 g! e6 z5 f PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 [$ ~) Q0 B ^ J+ i! u& ]1 `+ ` e PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
! | ^& y( s1 Z4 z4 r writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);3 O/ y, T# p+ N
5 Z* s! T0 z, t( ~0 ^' g
//SLEEP_EN,EPR,L138_SHK1,L138_RC
) l9 H/ Z U# E: |" ?* C$ i, v PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); . B$ o9 d$ g' E% l1 X" e! X9 A
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 3 x- T, |% M4 f1 R+ R1 w
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);7 I+ o8 ~1 |; j; M+ [
! w `3 x9 M9 n! R# C+ u/ l5 L" N //RESETn,L138_SHK2
6 @3 H# N4 D/ k$ r/ T2 ` PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
! |. {7 |( V P" m- u; R4 B PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
7 U& ^; _/ z5 n" o# [' ?& j writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- O. d* Y' \" Q5 U$ L b) z+ e0 K 0 T! \! V! n! l% O
2 ^4 v3 d! N7 j9 q9 `( O
//SPCR Register
2 S2 T3 i8 D& X) M, }, L //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* i1 R3 J1 O2 ]3 L& q temp = 0x03000000;//(DLB=0)% K* l' a. u# i4 g
// temp = 0x03008000;//(DLB=1)# y8 q" q& Z* R1 G7 D" @
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
8 s0 ^. ?5 Q& `* {, s* @8 W& e temp = readl(IO_ADDRESS(SPCR_ADDR));4 E, C% Q o2 p9 `
printk("temp=%x\n",temp);# p4 ~7 b% v, n0 ?" f. E
' A) f7 u- @9 g+ k* f( E
//PCR Register% l1 Y) {+ }# @2 {1 v
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0: L; W- x, J7 w4 M
// temp = 0x00000F0F;
, j9 ~; `4 o* v8 D$ T5 o t temp = 0x00000B0F;. _% M+ E, A/ _: x7 K* y( k
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
; |+ C# o% L7 v$ R& e. ] temp = readl(IO_ADDRESS(PCR_ADDR));. s' V6 |$ |* t
printk("temp=%x\n",temp);
* h5 d o! }5 ]$ o. m, Q //SRGR Register
. h K) f8 o( x' ^ //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
3 E r2 m) t1 v$ z //temp = 0x301F000B;: {6 c" v E7 o5 S8 e
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
; O/ ^5 z' r" f9 k3 F3 z; x% J temp = readl(IO_ADDRESS(SRGR_ADDR));
! I1 }5 H% y9 D5 {9 X3 O printk("temp=%x\n",temp);
6 z+ L4 |9 R' v+ V$ j //RCR; V0 g# J- C" _
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 K2 K8 e4 Y K& J0 |# a9 x5 j/ E4 d
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
+ y9 f" v3 J% }+ l# Y7 K8 r& @' F temp = 0x00440040;
" r$ I8 X5 p# O$ d1 }5 n writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
. f. q/ U% {5 z c7 M temp = readl(IO_ADDRESS(RCR_ADDR));# h) K p( Q. a$ C6 @ x2 P% L6 [
printk("temp=%x\n",temp);
' k8 \8 D/ t% W0 F- Y //XCR) L* }% D" ^7 l( P% i
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 K2 g7 Y! r6 W* o& h# x //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; G) [" r5 c7 ^+ m% t
temp = 0x00440040;8 s6 @$ A+ [ g. X2 U2 _
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized % F% f" c3 _! e a( n; E
temp = readl(IO_ADDRESS(XCR_ADDR));
8 n! B% }, }' \" ^3 U# Q printk("temp=%x\n",temp);
! ~$ w8 l5 R# J: u udelay(100);4 o Z0 K! o+ y# @+ ^8 u0 O
//SPCR Register8 i- ]" @; [ L/ v8 D4 v3 K
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! s0 T/ }$ v, f
temp = 0x03C10001; //DLB = 0 VS DLB = 1& B/ L+ P: l$ R; \, j: F! Q* v
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
! P/ f @" y, I5 X5 |. o, j0 Z- M1 x temp = readl(IO_ADDRESS(SPCR_ADDR));, M/ e6 F+ W9 V2 t8 o4 ^; P
printk("temp=%x\n",temp);
$ N4 X7 ?- w' h* w udelay(100);6 ~, }6 B1 C3 r" c8 z# D* j4 w
1 o# e _! d) P8 a% ~2 \
//set GPIO direction9 D7 Z v) i, z- z' X
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
% Y# U7 Y8 u: \5 J temp = temp | 0x00000100;//EPR----input- t7 L. ^( m6 ~6 H; j- F
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* J9 ]# w8 y" C
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 6 l% W z) m9 m* E
$ R* ?# r4 P5 G return 0;2 t3 i* N# O: M& D7 ^. O: H0 |" ^7 R
}
* [& u* D8 r9 jstatic void __exit MCBSP_exit(void); c7 \! t) ]& U/ i) v7 G
{
! u ^+ j: J5 g8 p printk("mcbsp chrdev exit!\n");$ N1 f& P- d( P) M7 s* u
cdev_del(mcbsp_cdev);. {# ~+ X w# N* J0 p5 X
unregister_chrdev_region(mcbsp_dev,count);
# n+ w C7 B- w: U' r, ~ device_destroy(mcbsp_class,mcbsp_dev);
9 u5 V* L/ l5 H2 Z class_destroy(mcbsp_class);3 _ i, p# b8 L- U
}+ n9 v+ B0 X8 \9 q; a
module_init(MCBSP_init);
; X) r/ M1 M% c- xmodule_exit(MCBSP_exit);. W/ @' b5 y. z# D1 @# r- i
+ I @) y! {+ g1 n) Q4 T+ J2 k9 n" F, O
MODULE_LICENSE("GPL");% R6 Y; H8 }. B+ w
4 e# f) F) u; m我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
, m8 f6 }0 c) w1 G3 s" j/ T我的应用层的测试程序如下
1 S% }" d _( s4 l- N, f' K- x#include <stdio.h>
" ~9 g" b) F5 t: U#include <string.h>
. {' w' L% C1 T. t#include <fcntl.h>" n7 f7 Q: v6 z
#include <unistd.h>
: V9 R/ j* I. \& Z& F#include <signal.h>
8 h l; U, y: R" Y' p/ V) ^#include <pthread.h> //线程
( }! N: L3 D) n N( a9 A#include <stdlib.h>
* t6 Z5 H. J1 o+ B#include <pcap.h> //捕获网口数据
+ w0 w2 V$ Z# S" b- s! k#include <semaphore.h> //信号5 f3 L6 S- {/ d% o( l
#include <sys/types.h> //消息对列
; |2 k( T" @( b! N& I+ R#include <sys/ipc.h> //消息队列
' j6 R' \% p. P1 l9 A#include <sys/msg.h> //消息队列- t# |$ X: g- a1 b2 `: W- Q& v
#include <sys/select.h>, R' Y( f& I- \* @" M5 v1 @
#include <sys/syscall.h>! |" b ~6 W; z+ y4 _3 M
#include <sys/stat.h>
) u' {% ?+ K, }+ V6 }( t0 H3 z: S#include <sys/mman.h>5 B- r4 \. L; B5 a
#define msleep(x) usleep(1000*x)6 k& N% m) \% O8 D7 ]+ P0 \
) T; g9 F: A" c* ?% ^int main()
" z9 ]7 O2 ]$ k, S* E. k, S{
& v, P$ E8 X0 `- e+ }! m3 ? //MCBSP,ARM与AMBE2000交互设备
7 M; w: v9 ]( b7 M2 h# d$ r int fd;
+ M* ?. c7 C. F' N unsigned short data_write = 0x5555;7 ~, A6 p; _- o5 a
unsigned short data_read = 0x00;
; |) K2 [% X, P) v; G# E& e# @ { fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& F; r1 ]5 }9 u
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
' P% E6 n, ^, P2 j3 [# ~ ' Z f; L% ]& K$ L/ ]- j1 W8 U
if(fd < 0)0 {$ q n0 f$ H, v
{
+ g$ U$ W+ G" o% f/ S! r( ? perror("open failed\n");
3 y' `* o0 V U2 Y/ ?5 f' z, V) ] return -1;
- ~* V i$ C8 z$ R }, V1 E- B- Z z! V6 p
3 Z* k$ H1 s8 w5 S$ }
while(1)
) {$ ?. y' _% y9 V0 J {
: `# @& f9 R% R$ L5 Q; I/ C) A - y x: w- V) \% e
//AMBE2000每次读写是24个字为一帧
/ P; L5 O) f, W, u! E //写数据时将数据在底层存储起来,等到中断的时候再发送
' V F( ^7 e, k //AMBE2000输入数据是以0x13EC开头的
& _* T0 O G! z6 K' J write(fd,&data_write,sizeof(unsigned short));8 Y1 }7 P5 L- \0 }- U( |( o7 [( M
% Y/ K" n; w& l, |1 Y4 C //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
! }* x5 g9 k3 ~% u( v$ i3 P read(fd,&data_read,sizeof(unsigned short));7 N6 ?$ T+ r) i8 n, c2 {* S
, ~$ l% _) M7 C+ _* t! k if(data_read == 0x13Ec)
( G- }, }# ]9 M- T) z6 Z* g {& g2 D) ]- P# G. a# {% S! k$ n
3 B) V( x: q8 E6 D7 L printf("data_read = %x\n",data_read);
- o5 j7 X* m# E* i, t/ X }
/ G0 e( v& W' i9 k
1 o- K2 @% S4 i( r1 M. ` msleep(10);
! M) g% w+ k& m1 m: Q% T4 L6 T 2 ]" ?* L3 T! S1 ?& Y0 ^$ W
/*
, M( {, h& V& C" }( ^8 t ioctl(fd,1); 5 D3 d b9 `9 I) S8 C, z+ R
sleep(1);
" e% @, s+ x! g6 G; b: d9 o ioctl(fd,0);5 y6 R1 e3 v6 C* \
sleep(1);! Y+ K" I/ o& S7 R1 o
*/
5 ]" x5 U- C1 T7 E } 9 N) }. @0 V& j6 R0 m$ t
return 0;- Q' I! R2 X: ?6 q1 [ X; a; s f) i
/ s( f# n5 g. W% _( Y) a* [# `}/ o1 ^. @5 Y* W9 d6 j
; B. @& b8 @. c# d0 z, |
多谢各位指教,谢谢! 急! f5 P& x8 g9 v5 N1 O4 R* C
- n/ d) T+ Y; i; ?5 a: L0 q7 G
$ ?; D2 k' b6 x$ a4 B( E# }" } q$ }. W# Z7 j# Z% i
, Q/ x- k4 V) J2 V; V
; j3 ~' [% F/ i* k' s6 |0 m3 ^
|
|