|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: G3 R* w: ]6 F3 W; s6 g3 o/ k/*
$ d! q1 J- i% K4 W * Copyright (C) 2009 Texas Instruments Inc
2 c6 {2 Q+ j, x0 E0 z" r *& M3 [- ~' X) B9 U( H
* This program is free software; you can redistribute it and/or modify
& f! E3 S( s/ ] * it under the terms of the GNU General Public License as published by; T! q! q/ j$ w9 C: O% s, a
* the Free Software Foundation; either version 2 of the License, or! D( H7 X. ]9 F) x% p9 v# I- Q8 L
* (at your option)any later version.
, h* i/ [3 J' T/ [' t/ ~ *+ p F% T) o: O, g1 h
* This program is distributed in the hope that it will be useful, e( {0 A# y' n: x4 g9 `4 v
* but WITHOUT ANY WARRANTY; without even the implied warranty of
5 S. x8 }& M1 u5 J * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ ^' Y. W( p7 N6 p
* GNU General Public License for more details.
" y0 T! Q) E3 Z$ l1 q- d *# C: D3 ]* O) n5 W0 l; t; c
* You should have received a copy of the GNU General Public License5 r) M) c. e, A
* along with this program; if not, write to the Free Software
% p, G; a4 F i- I: n/ K5 G * Foundati9 N% M) ^$ w* }% H7 G. x, g; h
*/ B) L) ?+ _* `0 i
#include <linux/module.h>0 u. `$ H2 i! N) Y
#include <linux/init.h> x d: l1 V7 Q D) }( _: a
#include <linux/errno.h>
+ R* X- X( d) c. V' q( j9 x1 e3 J( k#include <linux/types.h>
4 S _, D( j3 q; v/ G#include <linux/interrupt.h>. O. t2 o* F3 h8 |
#include <linux/io.h>( O4 [5 [+ |7 e" d5 P( V# g
#include <linux/sysctl.h> K+ ?3 o0 @/ O2 D0 v
#include <linux/mm.h>
" U+ `$ m$ J% j5 k2 }#include <linux/delay.h>
# R- E; ~* {3 H#include<linux/kernel.h>
$ k1 U3 d+ R' j: U: Y" D4 F#include<linux/fs.h>
! r4 _! R& I" h#include<linux/ioctl.h># J! ?% ?! R3 b, X# j0 v% ?
#include<linux/cdev.h>
' c X5 ~8 k% f, h#include<linux/kdev_t.h>
/ I! s2 E$ h. ?) y/ ]" @/ ^#include<linux/gpio.h>
2 W( K8 X4 u- a' k( p) a5 g#include <mach/hardware.h>% G1 ?- [- a5 L& [9 m7 g
#include <mach/irqs.h>9 R% Y G7 s3 u3 C2 u8 R6 ]; M
6 y) a& p5 X8 v% B# ~) a' _& h" o#include <asm/mach-types.h>
# r& F7 ^! x! z8 {& j) [#include <asm/mach/arch.h>
7 k$ L, R" V0 h1 s% q' k& ~/ D#include <mach/da8xx.h>
H% S! a9 u, p, q, k( {#define SYSCFG_BASE 0x01c14000
: k5 t: x) ]6 ]9 ^4 A5 D' P#define PINMUX1_OFFSET 0x124
4 G% X" l' f P, x6 C( b ^#define PINMUX18_OFFSET 0x168
! T0 v/ L! j* T- y, O! P6 e; K#define PINMUX19_OFFSET 0x16c9 J. @0 S& v) W& ?( R
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
+ e% E' c2 O' k3 P: W+ h1 V#define RCR_ADDR 0x01D1100C //MCBSP1_RCR, e0 @/ y/ c1 A
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
" F" L0 _/ ^6 G1 n" [/ o4 P! Y& k#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR' i" F2 z6 y$ `) |- b
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
' ?0 s$ [, I* m8 S% @& D
! o; R% i4 O+ E" @* \3 p4 R; B#define DXR_ADDR 0x01D11004 //MCBSP1_DXR' B* V% y$ {4 o% g* s
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR- y" @5 A- R5 k$ z) V# y
//PSC* G" P& \3 D- e$ I# m6 ]
#define PTCMD_ADDR 0x01E27120
s& G6 X8 L. V: i% f6 r- N0 B/ M#define MDCTL15_ADDR 0x01E27A3C5 N' N2 ~- ?( r/ d; K5 b2 }4 J
#define PDCTL1_ADDR 0x01E27304" q6 @# b2 Z* U4 R4 X- H. Z
//GPIO8 direction
2 E$ B) b8 P0 u7 D8 g- E: _, ~#define GPIO8_DIRECT 0x01E260B0% [& l6 ?1 s- O& {2 `% I% i
#define GPIO8_OUT 0x01E260B4
3 P' y+ V$ Y' K0 J#define GPIO8_IN 0x01E260C0
4 }! H/ o+ `) U5 n1 e4 T( o: v& N6 o7 o+ P& E% J
//#define MCBSP1_RINT 99 : O# v* ?* M; F
//#define MCBSP1_XINT 100
$ z9 k; `% ^! Y2 F" mstatic int MCBSP_MAJOR=239;
; m0 G. I, C/ m9 rstatic int MCBSP_MINOR=0;, r( O" E6 Z8 s9 W
static int count =1;
7 A# A* ~6 o# u& U3 N6 Q7 y# V z& B4 @, k
#define MCBSP_NAME "MCBSP-device"4 q& X7 `6 S' a( j9 l" V
( S1 q1 B8 u+ U% s4 ~4 a* m" kstatic struct cdev *mcbsp_cdev;; f& D# W- S" R/ m
static struct class *mcbsp_class;
) b. n% A% Z" W' f& P1 jstatic dev_t mcbsp_dev;! @. T+ m7 o$ e
unsigned int DRR_data;9 p! n3 m4 @/ @4 [& u
unsigned int DXR_data;
& ^; E9 Z" I g6 t) s3 `& ostatic int mcbsp_open(struct inode *inode,struct file *file)8 v' ]( }" _8 p8 R+ u5 v" {3 m# d
{
9 a- `/ z2 n( f
$ h/ O& O+ K! v' L+ f4 m //interrupt enable,initialized
1 L9 c w0 c5 ^2 U- { unsigned int temp;* ^( R1 s B3 g' }7 L/ [" {# {4 C
//SLEEP_EN(GPIO8[10])---0
3 s# l2 O- K1 }) @4 ^- V temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- h; _5 f! S. w! o4 r) E
temp=temp&(~0x00000400);% Z4 k& C8 c* Q( [' e2 M
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
. `9 H/ ^2 F; \( R* ^1 a //RESETn(GPIO8[8])----0----1! h2 |8 z$ H5 J
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: h9 t# ^" z) R; `& c8 C
temp=temp&(~0x00000100);# r. q9 c( F5 O/ v3 D0 u$ I" m
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0( j1 l* i) o5 w; Q: w+ v
udelay(100);/ Q' i$ L* N7 x8 G, C
temp=temp| 0x00000100;6 ^1 Q0 }' e: m0 Z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1( S( E/ H$ H. B. W9 J
udelay(100);- ]+ O, ] X) v6 e8 \1 x# }
printk("open success!\n");
* `- s: v& R9 s& q return 0;/ A9 n6 W* o! W1 a( u
}
+ F# d7 |) r( Y' J: S2 c* W* Y+ z* S3 p3 U! T
static int mcbsp_release(struct inode *inode,struct file *file)4 p( \" }0 C$ {
{
) Y* ]; v9 g' R- O, M0 [6 ~- D printk("release success!\n");: {/ U5 P7 I: W8 @2 o7 `: Q
return 0; a6 J- n/ p. Z' _6 P$ i
}( X* S* b% ?' K) A
8 }2 C _+ J& }# O+ d3 w; R
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 e/ C R! u$ u5 S( Y" N0 H
{
/ z( ^: o( {' h4 F# A' L0 y* g% A copy_from_user(&DXR_data,buf,len);2 B4 U* d. H8 M3 i8 {8 Y
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); % L) [4 L4 q4 O6 u7 {2 t
return 0;4 A/ [2 d M6 ?- q" O7 K. B
+ g( G) V0 J+ @/ m5 G8 b}
9 N* n% k$ ^" z/ M. Z; R
2 A3 D: f, j) K- ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)' _* J; i1 L: o
{ 2 c6 P% B$ `* E
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 \. \' {* e6 d- h- E copy_to_user(buf,&DRR_data,len);
+ R% y5 f+ t0 g! z1 K return 0;9 f! {2 t0 J6 V. P5 j( S6 r
}% B! V$ P6 a! r6 I% t9 n
) z" Y0 [$ e5 s9 M- i2 @) \2 w/ ]0 F( G4 f+ K" n* B8 }" m
static struct file_operations mcbsp_fops=- |+ [" d' k6 x H) C0 Z) t
{$ n7 F. q5 c7 {' O
.owner=THIS_MODULE,0 S" t/ F+ w$ b0 c
.open=mcbsp_open,
( q; P/ x6 t" c* \5 T, S! \' F .release=mcbsp_release,) _3 c/ P- {5 y5 x; @
.write=mcbsp_write,
) ?0 c5 V! b2 x! l) ^ .read=mcbsp_read,
2 Q3 P: q$ ?* A( x P};
" }8 T/ Z0 U4 r7 hstatic int __init MCBSP_init(void)
5 b, G% d" U- R6 [: O, S- U{
; i4 j2 S3 K9 I2 { int ret;' j; Y z7 K$ p! {! o6 W; s
unsigned int PINMUX1_REG_old;
/ f1 X# D/ g- _0 _( u+ Z unsigned int PINMUX18_REG_old;
# h# |- `( M {5 f) x6 R) e Q unsigned int PINMUX19_REG_old;
5 h5 I/ V+ N( p' w6 x. W, A% r- ~ unsigned int temp; ) _( G9 ^" V, K( z7 C0 v/ t; K
if(MCBSP_MAJOR)
; R3 X0 T. a' M( \0 d- @/ ] {; C4 Q; G/ w8 j9 Y# z+ @2 j
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
( h6 i+ Y* Y/ T. m ? ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
) M; K3 I5 }) r8 V/ a3 u/ I+ @ }
4 t7 b6 _2 w5 w- Z' ~/ L else4 \4 O% B5 v, ~% h8 T1 V" B
{
" }* @, w$ L) v! f ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);! M. m h1 Z) O/ j) o# a
MCBSP_MAJOR=MAJOR(mcbsp_dev);
, {4 N9 ?* U5 z( C, H }9 a D1 R. n2 c- z
/ ?+ h# H: b2 x7 p& A
if(ret<0)0 K# a& A8 w* Z) o. Q9 r
{, u3 v+ G, M, {. E
printk(KERN_ERR "register chrdev fail!");1 j3 a: u" `. T% U" v$ x) E0 `
return -1;) M# ?% ^+ v! m
}9 Y' c: T% C4 y0 ]- @9 W
8 _1 A# P3 g, @* ]
mcbsp_cdev=cdev_alloc();8 H) {9 r2 Q% r
7 b, F& b% }% Y( x if(mcbsp_cdev!=NULL)
& l1 U1 f3 n9 u4 X D y" B, R {
7 L( o. Z! Z2 _+ e cdev_init(mcbsp_cdev,&mcbsp_fops);3 T2 U- q; B( o/ f& D
mcbsp_cdev->ops=&mcbsp_fops; I6 A9 L3 r3 ~+ ^+ l) Q- j
mcbsp_cdev->owner=THIS_MODULE;& q* O5 W" K& \ e3 F
. h; _7 w) ]: h2 ], \& y
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
5 E$ L$ H) h( }# x printk(KERN_ERR "register cdev fail!"); k" |: M; G3 D* G$ Z! _- i
else7 m/ d8 M( |9 ^+ h8 M& x+ e8 j' `
printk(KERN_ERR "register success!\n");
: ~9 N \1 ]+ H2 s8 l }
( V4 X+ u5 z) ?7 j8 ~ else* ~! P" M7 A& K
{0 w8 |6 p' ?$ A( i
printk(KERN_ERR "register cdev err!");/ u( _+ `8 X9 X& W
return -1;+ t5 ~. Q6 h# ?1 s5 e0 k
}/ h! n/ P9 [% }" Y7 W0 T" k. I4 Y
+ {5 f6 d7 U" m
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
6 B1 B1 E7 O, m" I" I if(IS_ERR(mcbsp_class))
1 m' U: I# V8 f" @2 r8 ?/ O {6 D3 V6 I* B a) A
printk(KERN_ERR "register class err!");7 t1 F7 _8 @* v' S( t0 ?
return -1;
& n/ W( x1 [; M2 u5 i2 | }
7 }: }; _ B+ B' ` device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
3 a# k, {. @9 Z' h5 T" o( V/ Q, G- h ?) @5 P4 ], i) b
//PSC" R- d( L0 F, {$ I* n. J7 A
//add Enable MCBSP
1 R- v) P# d) d- W- U: C9 M# y //test
6 Z o4 t1 f0 q8 I \9 t temp = 0x80000003;
* S4 e& V4 x6 m8 y4 X writel(temp, IO_ADDRESS(MDCTL15_ADDR));; R+ A8 i( @& [9 K! A8 o# ~/ p
temp = 0x00000003;
) k) d8 B4 S2 {* d" k writel(temp, IO_ADDRESS(PTCMD_ADDR)); d# l7 w' Y/ a& l! t
( J6 S; i: F" I' X2 F$ L temp = 0x001FF201;" |9 S8 N5 B; G$ w
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
3 a( d4 p) `+ V1 n, @ - o( O" [) |# d: \& s
//PINMUX 6 X# w. G$ D' k$ s/ j( N7 ?7 q
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,; k- k# w! x b* z6 N T
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. O, y! F' \" Q7 i1 |* J PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ) u& s+ Q. Z4 K3 j! y. f
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
' t: ~ G; }/ q z' k" E8 Z
' s$ M! G4 a# w: C3 a: q //SLEEP_EN,EPR,L138_SHK1,L138_RC- l# l% I& n6 r+ O7 Y
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
5 i9 s: j+ r, J* |7 |% P6 x6 [ PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; * k/ W- D. p, v
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% S( p9 w7 v# y r+ X2 E! l% B% a' y
//RESETn,L138_SHK2
" p3 A) G5 _6 u1 | PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); $ \1 G+ q. @7 n1 r( ?
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
# Q1 L( d7 V3 q& b writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
: s7 B" I- ]3 E* L; d7 k9 B6 A
, P- S6 U; r! N" K9 g; t 7 z- O: V+ m! b* P* X- o
//SPCR Register* x8 d9 i7 b1 E6 g( v1 X
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset6 O6 C. ~5 w5 j- l
temp = 0x03000000;//(DLB=0) R% i* X) @( o" S, h3 y* _
// temp = 0x03008000;//(DLB=1)" L- j o. {+ S! o% Y. E/ V' `( k
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
/ e' B* V7 _! N' u9 P9 n" e temp = readl(IO_ADDRESS(SPCR_ADDR));
( I6 G5 B( j; V1 d1 r printk("temp=%x\n",temp);$ d4 n# m$ g d% D6 H
7 S( P' p: B" s) s% z
//PCR Register6 s2 d0 A# H/ W" P) m- k/ O: J
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
, e+ B! @+ ~3 ~. _# I3 t. |5 N // temp = 0x00000F0F;
. }3 k, n! T. H% r temp = 0x00000B0F;& l2 Y( h& ]1 o
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized + ]9 [5 {( E( N: u$ Q
temp = readl(IO_ADDRESS(PCR_ADDR));; H$ Q% R" p6 d! [3 u# c/ I
printk("temp=%x\n",temp); 3 p( Q P) r4 {+ q' y
//SRGR Register
2 I5 ~" ]' p1 U9 @1 P# b //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11! E; C j6 d0 H
//temp = 0x301F000B;7 G0 K' s5 ~- z0 A# H
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
2 L& C5 P+ V! O; ?( k6 ] temp = readl(IO_ADDRESS(SRGR_ADDR));
- n+ B1 P5 Z: T# f7 }3 B/ R+ w printk("temp=%x\n",temp); [& }: r1 Q; M& i/ q y
//RCR
( p6 _& q" a$ N# I3 d5 L //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
/ C3 F% h+ {1 P. o: Y! s //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0# v* g% D1 _% G9 |( ]! D, J
temp = 0x00440040;" d; R8 Q* X: N
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
9 U ^* k' d; l+ k+ ?- B temp = readl(IO_ADDRESS(RCR_ADDR));
% h& S6 i! P- w4 Q* x printk("temp=%x\n",temp);7 `% {( R. B2 H9 Q: d3 n7 Y
//XCR
; q% F) Z; p$ P, y5 a, u //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-14 k5 Z8 Q' s+ x& z
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
! R' o9 x8 l) u! t- |/ v temp = 0x00440040;( W7 n/ N$ l5 e0 I! Q# t
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
( |! Y z$ y7 o2 i: o8 b temp = readl(IO_ADDRESS(XCR_ADDR));
7 n- o, A. V: C, Y printk("temp=%x\n",temp);
: t0 y1 ?# @" ~) L8 U3 l" I udelay(100);9 u X& |. @, |) {$ B' s) u
//SPCR Register
+ k5 d/ v% |$ ]+ a' \0 z //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
# S% v- b& e- E2 k q/ ?6 Y5 F1 k temp = 0x03C10001; //DLB = 0 VS DLB = 1
( N& _1 `8 d. N4 c& A# N" u: P+ c writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled; T% ]7 J8 ]: f9 G' Z
temp = readl(IO_ADDRESS(SPCR_ADDR));
* t, W$ q: v6 L, K* u printk("temp=%x\n",temp);
! v0 @: z$ e& Z! r. L T udelay(100);$ b$ O& O! e4 [
7 @& K1 s8 R5 l% i2 g //set GPIO direction2 `4 Y8 }% x! A% S; h0 V: ~- N
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
% K! T! Y! E: s- a& u/ x4 i9 K* ? temp = temp | 0x00000100;//EPR----input
% ?* @1 E7 X$ j( J temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
# c& w! g( [# `/ o __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
: y( g" C) O1 \2 j; G
* ~( g# M7 ]+ V c return 0;
0 x' v1 g* h: `/ `, X}
) }+ C) J5 k, ]; E/ [static void __exit MCBSP_exit(void). ?) w% v2 f/ [( N) Y* E* Q
{8 \& M" `. q# S& E& i2 r
printk("mcbsp chrdev exit!\n");- q' T- ^2 {0 n# `' S- j% I
cdev_del(mcbsp_cdev);4 R, ?: F2 ? u4 u1 e5 i0 f! g
unregister_chrdev_region(mcbsp_dev,count);
0 h; n7 c$ |" d2 B# T8 h device_destroy(mcbsp_class,mcbsp_dev);6 F* D# h, }7 D
class_destroy(mcbsp_class);5 ]* w. [, t6 C" h' b; Z
}. L3 b/ O$ ], z
module_init(MCBSP_init);% b7 o4 V9 v( ~2 l6 m& |
module_exit(MCBSP_exit);! Y, p% I! o7 n# t- i4 I7 y
) k @/ G, m) o& u0 {4 P, {
MODULE_LICENSE("GPL");
9 n* p6 m) J3 V: I+ X) w
5 |* A; f w3 F5 T1 c w我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
% y8 X4 z7 r8 ~2 i- V: C& I, }& ^我的应用层的测试程序如下$ g8 G; i$ o0 j8 ~# v0 d
#include <stdio.h>0 R9 H# Z5 d; A2 G4 X; O
#include <string.h>
3 `, {1 q: f- j#include <fcntl.h>
+ C9 s: i& ]' P, U+ q) g9 ^#include <unistd.h>
! a! t4 a# ]% K N* L# u; a2 C#include <signal.h>
5 y$ }$ r* E% p9 o4 \. I" ?+ `2 z9 a#include <pthread.h> //线程1 I3 P: J1 ?9 J; @2 C1 P7 ~
#include <stdlib.h>
+ ~! ?- R% z8 ~+ t! h# T#include <pcap.h> //捕获网口数据! C+ Q, \$ n& T* a" ?' O
#include <semaphore.h> //信号
9 E" Q) n6 F. B4 j+ ]6 X#include <sys/types.h> //消息对列7 X( ~+ T. z" r% Y6 d
#include <sys/ipc.h> //消息队列
; X/ `' q6 B9 @4 s( W/ ? k* ] q#include <sys/msg.h> //消息队列4 P/ Y' \/ C% p& `3 T
#include <sys/select.h># o ] x. L9 v0 _: m" t+ d
#include <sys/syscall.h>
; _" R$ E) _8 e7 D1 r0 ~# Y' j#include <sys/stat.h>
8 i7 \+ S; @8 h, R: V6 }' Z#include <sys/mman.h>& f2 l( G" `' ?6 B/ g" M
#define msleep(x) usleep(1000*x)
3 o0 E: |3 ~* ]+ Y- C7 e5 M7 l. c. o9 o0 j
int main()
/ Q$ H, s9 U* W: _" N: ]+ ~; I, W{ ( f9 P' v3 r G2 [+ K/ ^
//MCBSP,ARM与AMBE2000交互设备
1 {3 T1 R* T. l3 K: r# J0 u* C int fd;, \" ?9 \7 h ?. d( X: z( K* ?# t
unsigned short data_write = 0x5555;; n" x6 d# `& A/ u
unsigned short data_read = 0x00;
: L. c1 q" Z0 a2 }( C% |7 z fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& J9 d9 u7 H$ ]" F% p7 ^* L: X
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);: M( H' v h! x( X2 Q/ t0 A3 N
4 p1 U; L3 q- W1 [# k y+ `
if(fd < 0)
7 g& t9 w! p0 W' l {; j- d7 l { s. j5 R6 {. E% c9 O n) P- T
perror("open failed\n");
& w2 ^+ X: u) o return -1;
, @- r% \) P3 g3 { }
% F+ |# T8 W+ }1 X, S0 x L
& ?7 O, |, U, }; n8 H while(1)
) a5 v9 T. N- q" B% ^) I* W w {
% X' c0 \; ~1 v* h- s
/ q+ |1 Q) X- N! `6 O9 b //AMBE2000每次读写是24个字为一帧
7 t/ a- ^+ I3 P S5 n //写数据时将数据在底层存储起来,等到中断的时候再发送
! m8 A2 M% N& |! j //AMBE2000输入数据是以0x13EC开头的0 p- s# K4 c- ]9 g* b0 x7 ~* A
write(fd,&data_write,sizeof(unsigned short));# c9 r2 K P$ P$ _. J
7 q% A) M6 R+ P* u- ~) H //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
2 S$ a2 I( R# U" N read(fd,&data_read,sizeof(unsigned short));5 W5 l' X$ t! G3 l
; i5 }1 I& K& N% g y- s8 U if(data_read == 0x13Ec)
4 G. C% _7 t. r9 D4 k1 X, x {
- ^% g7 U8 ~( K/ K( ^. t8 t 3 i1 l- L1 e8 x4 H+ G: X" K
printf("data_read = %x\n",data_read);
" E1 l, \+ J( J/ V* J; Q9 I }4 P8 Y" g6 f! ~+ G% x) S# I
, }5 n' B7 T. c3 @# q! G msleep(10);
+ b* u+ C# R; e5 d0 s* c8 c- i" T
, Z$ ^/ D( ~3 v0 K /*. S) G8 e/ ^$ N9 A1 ~
ioctl(fd,1); 5 @# R: a0 f& k- k) m
sleep(1);0 J% ]0 h; W- e _
ioctl(fd,0);, D7 c+ o/ f5 g
sleep(1);
( e5 _ P( S# \! W+ v1 i- u. E3 i */ / J) Q% Q& M" o }# g
} : g6 n+ B( T+ T( N$ L
return 0;, N2 Q- k/ d8 f* d
$ C8 P8 B1 Z) \. P$ I}
) |% ^6 x5 O `# W# t' b* \5 j; A0 G
多谢各位指教,谢谢! 急
* n( D& ?3 e8 ~9 ^. C. Y# J$ c) ~* f% \% D4 h
# r: _4 G2 F$ ?! { i5 v7 i4 a* u* G& O4 o8 z# N7 }$ s) z
$ x8 u/ g2 ^- I; e
9 x$ e$ q. ^- K; E7 T A |
|