|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: D) h# P% ~9 r, P, p# M1 Y/*0 q8 d2 I* d# {3 K; ~" R
* Copyright (C) 2009 Texas Instruments Inc
4 }) T3 Q( h% i0 {, ^' P *
2 G, k6 u# F- y& U * This program is free software; you can redistribute it and/or modify0 b* H3 Z' c1 |: Y" ~
* it under the terms of the GNU General Public License as published by% k0 b' N7 L9 S. `% G$ `: \2 D/ Y! o
* the Free Software Foundation; either version 2 of the License, or
( p6 o* X( r0 [ * (at your option)any later version.
; S% @( W- g& d. ~* q( b *
- T, v1 D! }9 e- h1 F: f * This program is distributed in the hope that it will be useful,% C* n q! ?3 c4 y; a
* but WITHOUT ANY WARRANTY; without even the implied warranty of7 S9 M8 J0 }1 S
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, h' s6 w5 a3 h1 j" n
* GNU General Public License for more details.9 D! n2 m9 d) b" X' ]! L; g
*; W( t4 D% |; {6 ]+ F
* You should have received a copy of the GNU General Public License
, J- l& R# A6 S/ ~8 f* o5 s1 m/ E * along with this program; if not, write to the Free Software" ?$ n2 s$ k" a6 \; R
* Foundati" o: ?7 p! f$ H4 Y8 @/ E6 A
*/# c4 m3 y h5 t6 L3 P
#include <linux/module.h>! _8 o' U- O& ?3 D f/ u9 h$ Y
#include <linux/init.h>2 }& W7 Y2 ]' c3 w( O
#include <linux/errno.h>0 J# p0 `# h+ d( i; \* m8 w- n
#include <linux/types.h>$ ?; @ L; n7 ^& @5 u: b
#include <linux/interrupt.h>- M2 t6 k' Z- q, z! K4 t- c# Y
#include <linux/io.h>
, u$ a+ P* a9 T8 ]#include <linux/sysctl.h>/ l1 ~2 G- ?- @: b
#include <linux/mm.h>; y; K9 S+ V' k1 N: N! ~
#include <linux/delay.h>/ ^; W) B7 b" y# D) k" {
#include<linux/kernel.h>
6 L) d" g" A# l+ l$ a#include<linux/fs.h>4 E; M8 k5 z' M4 Y' W* `
#include<linux/ioctl.h>
4 ]' P+ j+ G& S#include<linux/cdev.h>
2 H5 I- }1 c' I1 }. Z#include<linux/kdev_t.h># T. h9 s# g& v7 P
#include<linux/gpio.h>
2 U) B8 ^2 X$ g% y K2 o0 z#include <mach/hardware.h>
: b7 g6 \% N6 [: t3 j4 K#include <mach/irqs.h>
8 N# E" q) [5 F7 f) u! i7 r, ~0 `1 L; h1 r
#include <asm/mach-types.h>9 j7 m3 M( r3 y. g3 U2 [9 @% k- j4 G
#include <asm/mach/arch.h>' `) _4 e V" {( D$ n
#include <mach/da8xx.h>
- N- l2 s6 x; `0 D% D#define SYSCFG_BASE 0x01c14000" `5 w @) o! o: @5 g
#define PINMUX1_OFFSET 0x124
0 l* x$ ]* T2 K#define PINMUX18_OFFSET 0x168
$ C$ V8 q0 a- H: J1 s, w3 ~#define PINMUX19_OFFSET 0x16c
+ u. {+ ]# W. U ]4 F* ^#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
9 K6 O! t- @' x# j* h9 t8 m#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
& i( R4 i4 {$ R, F* @# m/ @#define XCR_ADDR 0x01D11010 //MCBSP1_XCR, ?# M, w# W9 r: S* n
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
: t0 f, G) U' G$ j% b+ L#define PCR_ADDR 0x01D11024 //MCBSP1_PCR$ W# b, D0 `- c
+ r( q0 P, E, a" C; S/ G#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
$ D' [0 `- o% V0 g: y1 n. x- }#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
( ~, |* {) @. o5 k; B//PSC9 u5 d* l3 E+ ]6 u
#define PTCMD_ADDR 0x01E27120 0 h, b( u$ X& J4 {2 R6 e6 d ] h
#define MDCTL15_ADDR 0x01E27A3C
# g! F; a4 N: M8 r2 U1 D2 d! S" r#define PDCTL1_ADDR 0x01E27304/ R4 ^1 K0 a: q3 @
//GPIO8 direction5 a$ G$ A1 G- w" E5 z( }3 s' h
#define GPIO8_DIRECT 0x01E260B0, f$ W' j: |( G$ E( f: s* k
#define GPIO8_OUT 0x01E260B42 U' C% G+ a( G# [. \: l
#define GPIO8_IN 0x01E260C0
2 B* @$ |/ L; W3 l# Y) h% U+ G/ y: C, E
//#define MCBSP1_RINT 99 * j( Y- W9 V1 }( Y! p
//#define MCBSP1_XINT 100 2 q5 L6 C5 F: \3 B4 Z9 x
static int MCBSP_MAJOR=239;
! d: h- j" Y0 }, [; Astatic int MCBSP_MINOR=0;9 f( r0 {* `: [, o
static int count =1;! |3 W4 I; E& c
( p) J& u0 a! @, G0 V# c3 E8 D
#define MCBSP_NAME "MCBSP-device"
- M3 b' s2 J+ ^: _6 c+ ]4 M- B- r( ` I# {3 l
static struct cdev *mcbsp_cdev;8 B/ D; l6 B5 h5 x+ Z1 E! I
static struct class *mcbsp_class;( p. y, q8 Q& z7 ^6 R
static dev_t mcbsp_dev;
I6 v) e6 r; f3 f) I8 Cunsigned int DRR_data;- X3 B" h3 a9 j1 P
unsigned int DXR_data; P4 ?' R9 p' Y; q) O# c8 U
static int mcbsp_open(struct inode *inode,struct file *file)8 E; F* z# J* ?4 g' m5 w; ~ k; c
{8 [ ?. K, j. `% J p
) w9 \- F" X% t- {* S& r' o( ~ //interrupt enable,initialized
. M6 |( m4 e, F3 @! z5 M/ S: s unsigned int temp;
: ~- N* ^) V0 o% L //SLEEP_EN(GPIO8[10])---0
, O% y1 N9 m& `- H temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 A# D7 H; z) D4 X& C+ D temp=temp&(~0x00000400);
' o3 N4 {$ G% T# s __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' q$ {3 z$ ?* @ //RESETn(GPIO8[8])----0----1
" B) R8 |$ x3 S' y temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 W; z, A; p2 D/ A0 w temp=temp&(~0x00000100);- Z# I* p5 X/ ?& o
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 t$ Z# H8 H6 m, m; l# \9 n9 ]! }& C
udelay(100);
+ X! K7 S4 Z4 y temp=temp| 0x00000100;. f5 M- W3 E4 W' s' a+ ~
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; ]* D l/ X2 J/ i' E& C
udelay(100);
0 M% b: ?' i. j5 X T1 @1 L7 K printk("open success!\n");
* X+ x$ N. Z6 [- k% S" J& } return 0;
! H2 G2 j2 f- H3 A# J2 }; C}
# F3 ]# y( i. j& n" f
; q B, ^5 N; A T' Fstatic int mcbsp_release(struct inode *inode,struct file *file)
2 w2 x T5 y8 U* T r{
$ M9 G6 e" W7 b( } printk("release success!\n");
. f9 S: y8 Y- e4 w- D return 0;
! G4 B2 d, K6 \0 H. M, ]: O- x}
( J: l1 ^* T1 V( H: ]3 W; s
2 O5 T3 r( L Q( P' ?" g0 L- z' d# Ostatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)% r; {+ O0 C& u( x6 V
{' ], z" |* U$ T: l! L8 N
copy_from_user(&DXR_data,buf,len);
* u( P: h9 i: s' ?1 K: T/ i iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
& l1 n4 b& ], p4 q! X return 0;
9 s* d! O0 X O9 q+ o
' o) r, J( H& J1 o}# q2 c1 `9 q4 h9 Z
9 @8 R% k' J- r; X- ~static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% A! @. l/ W+ b5 F$ V{
8 W, I7 v" C4 Z$ L, p* X j" J7 S DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, U3 S! m: n0 f+ I
copy_to_user(buf,&DRR_data,len); $ [3 ~8 n- @. C' l7 P
return 0;1 f4 K6 n- r9 H
}/ v F l0 u) J) a# _( c
- b7 f# d$ T, ~7 f, X+ _& R& k: o2 \# k1 |# M6 Y0 i1 ]
static struct file_operations mcbsp_fops=
+ R8 g3 \/ Y) ~9 {/ L* {! ~{: [$ Y1 Z' B- E( W1 \; l: g! Y7 e8 L
.owner=THIS_MODULE,
9 V& Y& K7 S1 d5 V .open=mcbsp_open,
" \6 I, G, O. b" W6 o .release=mcbsp_release,4 g3 O% ]9 f9 Y; v$ P1 ]
.write=mcbsp_write,
) l5 G+ z: L% N' b9 z .read=mcbsp_read,1 M- V; e' c1 ]& X
};
9 U+ t: n7 E+ y" R: Q/ _( ?static int __init MCBSP_init(void)6 F0 u* j6 @# k2 @. R& h
{
3 o2 ?) e m6 m+ O# H7 l int ret;7 K$ S* O+ v# R: U/ y
unsigned int PINMUX1_REG_old;* K* M5 ]8 q6 P* \+ C9 _9 p9 G
unsigned int PINMUX18_REG_old;0 c6 u* ]) Q: k3 m
unsigned int PINMUX19_REG_old;: U/ }3 f* z- ]# Y2 j' `$ {6 {
unsigned int temp;
0 h7 o Y, d$ h, H/ }+ W if(MCBSP_MAJOR)2 ~6 h3 t4 N' J; [* d0 M9 q
{
/ m2 g; I/ h; s; C; }1 B mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 K; ]: e# v/ v" p, e$ [
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);, F/ i5 }0 f+ a& o2 j4 @+ s8 G
}4 B* T, V0 I# m( ] p0 E
else8 T5 s H; V; g5 i
{
# F. g& d: n" B( k6 C6 l3 L& I ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);( r- h/ F( s. j8 C$ g! h- P
MCBSP_MAJOR=MAJOR(mcbsp_dev);) h# A- a* W6 i6 v' c9 v9 P
} @( o9 q; p+ \* J; P) A2 r. l
b+ c) A3 L3 I3 ~5 p' G' x2 s if(ret<0)0 [2 p7 X) u3 S- s2 Z. v; Y; K
{
4 T3 g! d* V0 N- z( Q printk(KERN_ERR "register chrdev fail!");. q: c- d$ v8 E& a7 Y
return -1;* [' Q. x: ~$ E; r+ U1 B0 [* l
}
& m+ W* e; Z* ~% p' [; h + V$ S! M. ?. e9 J' \
mcbsp_cdev=cdev_alloc();. L8 f7 F0 F! j2 G; Z6 c' Q
7 p( L6 K+ A6 [( F4 L4 E2 u if(mcbsp_cdev!=NULL)* }$ z9 g9 @" m
{" {2 h* i: ]" l4 k4 v
cdev_init(mcbsp_cdev,&mcbsp_fops);0 y9 S z4 r0 i* g _
mcbsp_cdev->ops=&mcbsp_fops;9 d" R, V, O3 B% ?; B/ y( Q* i
mcbsp_cdev->owner=THIS_MODULE;
/ B) g- J/ F. H0 F" g5 c
# g; O/ |+ l. Y; Q9 y2 V if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
; d: M; W" U, L! b; W h printk(KERN_ERR "register cdev fail!");
+ C) k4 C( a- ^% a5 V else
- X. a: j L4 J; Z( o% o printk(KERN_ERR "register success!\n");& E l3 N' s9 u7 j
}( g) c6 _. \5 [) [: O
else
U7 t6 G) B9 i1 P0 Z {
8 I T' q* f- d! G printk(KERN_ERR "register cdev err!");
+ `! A' z: X, l return -1;6 j) u. p/ A0 l6 N
}6 r9 D" o, A$ }
% I, w$ F* \6 t: k
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 [3 v3 q' J- V8 l# z/ h6 A3 K! l
if(IS_ERR(mcbsp_class))
4 I. H) C& }5 w% Q {
' }! p5 v$ f! v! \& ~ printk(KERN_ERR "register class err!");
. b( {4 }5 W% ~3 w return -1;
, P1 P9 l, ^5 u8 i) [ }- G" s& M, B* X: X8 G+ k
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);& N& Y* V6 i. E" I0 H. ], |$ W1 C
, {) ~. e* x( H$ L4 m0 Q7 h4 `
//PSC
9 `; H$ W1 f& | //add Enable MCBSP. ^% k$ g7 n. c2 T- H
//test
; J4 `7 P6 F6 P$ s6 N temp = 0x80000003;1 B( ~0 M) a/ p' D! ?; v
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 [ Q5 O$ v; p) j temp = 0x00000003;5 R" d. ]3 H0 u" F
writel(temp, IO_ADDRESS(PTCMD_ADDR));; j( ^, R8 N _( U
* x+ k( v' w9 G9 V5 E! M
temp = 0x001FF201;4 l- m+ d/ B9 T9 h
writel(temp, IO_ADDRESS(PDCTL1_ADDR));, S1 v5 c$ f) Z. x$ l% P( q! ~7 r
0 s0 G! f( H2 ^' j- }' y2 b
//PINMUX
4 D. A* l% F4 v3 N //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
! i. Q' v6 r8 L/ y7 r! @) E3 K+ ^7 r, g PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
# i* ?/ @, C( c: C* o3 B PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 0 Y Y6 b! G. E, ` H2 k$ _
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. c- D( c+ v9 L# _5 [* N
' C( w+ P: ^9 E; G8 \8 }8 s1 R //SLEEP_EN,EPR,L138_SHK1,L138_RC
. i& ?3 L- L# V4 d PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& S0 k+ M; \5 F0 B PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
) n* b# Y( \7 P R) m$ l writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ f% X4 z& V7 U$ I7 o$ Y# x
7 ]7 ]0 V. U0 g //RESETn,L138_SHK2
- x- `. Q8 t: B PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 P& h( X8 g* ?3 W0 ^+ d PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
. C! o% [: w$ r X& ]8 ?1 a/ \6 T writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);1 Z+ ^; {) N/ @) e- w9 @# C' D
! ~$ Z4 b6 f, p+ z j. F
" D& P' N6 t6 { //SPCR Register
) d" X& `# `: N4 G* k //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset$ ]2 b+ ~3 c8 }) o) b' a
temp = 0x03000000;//(DLB=0)
' B. X; Q- k/ q2 s4 _" K& r6 D // temp = 0x03008000;//(DLB=1)
# {4 B m0 H. f8 C" f- r! d: e writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset4 j' h+ j% N q; ?
temp = readl(IO_ADDRESS(SPCR_ADDR));
4 k+ g6 `7 n" s* r0 N, | printk("temp=%x\n",temp);
! A- i4 \( _: G9 i/ y" D
/ r* Q# I }. L3 ] //PCR Register! [: K: d2 w- W+ q8 ~
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
E7 g6 t. _! e* \, v; N* Y // temp = 0x00000F0F;
/ ]1 ?: U' N9 j, v% |$ b" v8 } temp = 0x00000B0F;) A6 P2 [2 K- [, O
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 8 V6 Y' p. |: i7 q+ x
temp = readl(IO_ADDRESS(PCR_ADDR));" @# ^$ Y- t( z2 S D6 u8 w
printk("temp=%x\n",temp);
3 B7 d K8 ]- y4 g- P1 g U- {3 @ //SRGR Register, C* }2 B0 n0 D" ^
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
- K6 p2 V/ z0 G9 R5 D //temp = 0x301F000B;
' I3 k( U# m0 P4 S. Y writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
' t& B( N5 c1 z temp = readl(IO_ADDRESS(SRGR_ADDR));
9 g( u, A" A Q printk("temp=%x\n",temp);1 x9 T# F9 p% D" S7 }
//RCR& e& l/ v$ `0 h8 d1 D# v. F
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
- e X! F/ u$ f' I0 d //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
$ Q! ^/ K( R/ U: W# ~- q/ |: J- z0 S temp = 0x00440040;$ V9 X* C& D0 p
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ( v. W( D# b, F! f1 B B
temp = readl(IO_ADDRESS(RCR_ADDR));% Z# r/ Z# R9 q
printk("temp=%x\n",temp);
. E9 T6 }" Q; A+ A" L //XCR: Y# N% p7 A# f2 A5 x9 U4 f5 a
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 y; O+ _! J, [) r9 x: [
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) \/ R! ~5 d' w
temp = 0x00440040;
2 T, n, \0 b, u; R9 W' m* F2 q writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 1 \0 @' E @" F) t1 h; X' r* s
temp = readl(IO_ADDRESS(XCR_ADDR));
( b' [8 L( W* A1 | printk("temp=%x\n",temp);7 Z+ A* y: k/ t; v7 Y# ]/ @* e$ ]
udelay(100);
% e0 F% h& e d/ T0 C/ i //SPCR Register
- T9 \: ~# L. U& K //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
) X2 }7 z; e2 l9 P8 t2 a% D# K6 Y: S temp = 0x03C10001; //DLB = 0 VS DLB = 1
* I6 A0 [2 z/ y0 [; @. j5 z! x5 @0 s writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
; U7 R& _ i, j, C! _8 ~ temp = readl(IO_ADDRESS(SPCR_ADDR));
7 r5 F9 N# M0 J printk("temp=%x\n",temp);4 [, A5 {8 Y7 k7 Q* p5 ?3 p
udelay(100);4 H$ T* y+ \; t4 P) b' F6 V7 K
# l/ [1 h# q% I5 p/ ~
//set GPIO direction H3 o6 D, y9 l$ ^2 A
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT)); Z. g6 ^; N: j0 x
temp = temp | 0x00000100;//EPR----input8 Z2 u, W/ U7 t9 d
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
/ F9 }; Y3 s8 e __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 4 S2 K# p" L; N
& H8 u G& q; n& O* K4 A2 G, V# G return 0;* b# d9 P. w- m6 b
}
0 O. O# f3 s8 ]0 s$ _static void __exit MCBSP_exit(void)
* E0 {5 R! A `# {+ N) v{
z6 k# R$ I5 l: U& W; \! Y printk("mcbsp chrdev exit!\n");
- y$ R* _& d/ V8 T4 S1 y; J+ K$ @! M cdev_del(mcbsp_cdev);
& U4 {2 W0 F1 Z( L unregister_chrdev_region(mcbsp_dev,count);
% @* F& T& S+ s* B8 p$ U device_destroy(mcbsp_class,mcbsp_dev);
: V2 h! r# _2 h class_destroy(mcbsp_class);
( g4 @) v, s( }$ R+ m}
- `9 W' E) I2 ~+ @- _1 k/ Mmodule_init(MCBSP_init);
# V+ o# u- [- kmodule_exit(MCBSP_exit);
2 Q5 m6 T) [* L' x; W, k+ F5 I: `" g2 d! Y" s. j$ }8 G* b9 @
MODULE_LICENSE("GPL");
$ n l6 J0 U# ^3 J8 m8 G2 w) e
# F) ]6 t7 {" j8 H% K5 J7 |8 Y我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。& F5 u0 Y( y" Y/ n
我的应用层的测试程序如下! Q) E2 H) H3 @
#include <stdio.h>
0 ~: x+ b+ _3 {( x, A$ [6 T) A: Y#include <string.h>2 b: b' {' X! l
#include <fcntl.h>
; C5 e1 M( _$ y) z: ?#include <unistd.h>
" o+ c( j7 F# R/ D7 C#include <signal.h>
) P1 x) c5 N6 Y) F#include <pthread.h> //线程: L; i; q+ }' z
#include <stdlib.h>
3 k7 K8 j6 o- c! C7 {#include <pcap.h> //捕获网口数据1 F4 E' | u- @- e7 r- @9 t% w4 C
#include <semaphore.h> //信号
5 X8 J8 p1 B8 [, v6 I' [#include <sys/types.h> //消息对列
" `6 N. O( |/ P o3 E#include <sys/ipc.h> //消息队列
- D' U4 ]2 h8 g+ I#include <sys/msg.h> //消息队列
! ~* ^0 u- N1 C6 C+ t#include <sys/select.h>4 `1 J2 l7 r' i/ B
#include <sys/syscall.h>3 Z4 W: b! \$ l' g2 i
#include <sys/stat.h>
3 y8 B9 K6 H8 k9 |. E; y8 w; n#include <sys/mman.h>
4 V0 B" x5 c- Q8 `#define msleep(x) usleep(1000*x)
; ^, g) i$ S( A) h s6 Z% V7 J5 g1 }( G+ F3 @
int main()
' F- p' I$ W- |8 s# F/ p& S2 A{
7 P6 }" _! L) {4 r7 L //MCBSP,ARM与AMBE2000交互设备; R6 y8 O+ \1 P* k* V) k9 C4 H
int fd;
/ ~6 }! N) Y/ T unsigned short data_write = 0x5555;
. E' ?- Z) M: \2 S8 N unsigned short data_read = 0x00;" U( D3 n1 M( r: z" a$ [9 e
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);9 } D' j. V, h4 M+ l7 m
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 i; s7 d# J7 v3 z+ l/ U8 G & {* [# N7 L( O1 G. o5 }
if(fd < 0)/ q7 e: x0 M# p; x9 f* Z
{
. a, a0 {. _$ _: I" ~$ m perror("open failed\n");. q* O0 n5 _2 U: L: g
return -1;7 w! U, ]1 p5 _* B: X- ~
}7 c$ N% W7 ]7 J4 k+ b
# l) L5 M _0 W while(1)$ P5 l4 T3 o* P; K$ O/ c% R& X
{0 ^" H8 l7 z! c6 x$ u. X* \6 B
( t5 z s- G) m4 b, W* d9 L //AMBE2000每次读写是24个字为一帧! K+ X5 ], Q0 y9 q: h
//写数据时将数据在底层存储起来,等到中断的时候再发送/ ?! w0 E# ], ]
//AMBE2000输入数据是以0x13EC开头的
& O5 N0 M2 Q# ] K write(fd,&data_write,sizeof(unsigned short));- y3 u& f0 Z2 s$ L+ p" K
' v3 z7 k% J2 q7 R
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
$ n! ]( a( Z: W9 h/ g read(fd,&data_read,sizeof(unsigned short));% |% a, L+ [/ t) J8 V5 J
* I. @. ~4 N4 x0 ?+ b2 }* s if(data_read == 0x13Ec)/ M( Q# ^! a+ A$ e; O' w, h
{6 }- C* }8 G9 \0 A) K
3 T+ t6 W# v5 O- s9 h$ \3 e7 ^; j D
printf("data_read = %x\n",data_read);- M8 Y" Z* s# N& U8 x- c3 S
}' y& Y; P. E9 u: g4 u6 u* D2 n
8 P% V6 w& Q2 x; p* D
msleep(10);. Q2 x# s9 }" ]
5 r( J' E. E4 D8 t6 E /*8 a, d6 G' |! K. a g
ioctl(fd,1); " h9 p: V+ V1 t% {# l# Z$ `) P
sleep(1);, N5 x, G8 Q1 n
ioctl(fd,0);
k9 N5 @9 }7 ] sleep(1);
- l3 O7 I' _2 s" r */
6 b# l* }& ?; v+ d' {8 \2 C } 5 o4 n, U T/ G! F' X8 D
return 0;
. a# s$ P1 U" w- Z; z! ?1 z 6 }% i- m% H7 ~0 p+ Y f8 M! a( P
}
# n$ a) S8 F D4 `0 K5 E! P$ K2 O0 c+ M
. U* b* z, l6 X; g2 h6 a多谢各位指教,谢谢! 急
+ n# O- c8 W2 Y& d4 U
" T/ f ]0 ~% E* f3 L) k* L
; p: d" P- }( e9 }' S+ x1 Q4 I) l$ \' u0 p* {+ h# n5 @
! t/ D2 [! \+ i" I( f' D- {3 I
8 k; Q; y: ~2 V: [. H0 W |
|