|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 j% Y7 j) I/ u: r3 z, Z/ k, _
/*
; T1 a- k) R1 M& a7 P( P& A * Copyright (C) 2009 Texas Instruments Inc
* [; |- M3 Q1 D/ R *4 G, d2 m6 ~: T1 G
* This program is free software; you can redistribute it and/or modify
& r& Y( q+ i% i, O: J* ]: \ * it under the terms of the GNU General Public License as published by
/ l+ ?7 b9 t3 r7 h, z+ J * the Free Software Foundation; either version 2 of the License, or
* A# q7 N( R7 J! B * (at your option)any later version.2 c4 X* j: D8 }4 d( t$ D7 I
*
, X4 r0 A0 I( S8 d: B+ C * This program is distributed in the hope that it will be useful,
' ^+ o: U3 Y0 u- x% `9 b * but WITHOUT ANY WARRANTY; without even the implied warranty of
/ M: z/ C8 b k$ }8 y7 u2 @; G * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the3 k0 d$ y* P" u4 ^# I( A& R* t
* GNU General Public License for more details.
2 d& U& ~, j5 @( |' T *! g9 B4 z" k! ]& ]/ e1 U
* You should have received a copy of the GNU General Public License
5 N& n Y, I3 _- i * along with this program; if not, write to the Free Software
% c+ i" U4 N2 Q * Foundati
! s, ^2 L% d( R! t/ S+ Z4 m*/- s1 `- l- W' ]2 x
#include <linux/module.h>8 V5 s6 X/ Z" t& I
#include <linux/init.h>; ]1 Z& s3 H" H0 ]$ h% ~
#include <linux/errno.h>
5 n" O* W4 I' ~1 h: s; d#include <linux/types.h>+ u5 q5 ?) A2 J/ R V
#include <linux/interrupt.h>
9 a4 Z& t: a0 E; M' d1 }1 `; H#include <linux/io.h>$ g1 _: I, u3 o) M
#include <linux/sysctl.h>9 ?0 R5 C; V# \
#include <linux/mm.h>
+ k+ ]3 A9 I+ K6 m+ l3 d; c#include <linux/delay.h># F" }9 b* M: Y4 J
#include<linux/kernel.h>
, b h6 |, U2 r6 z# F9 U#include<linux/fs.h>1 q9 p% o n, G
#include<linux/ioctl.h>
# k: a" C6 y) |- ~. N#include<linux/cdev.h>4 {- Q1 u+ \( T1 i" h8 L8 _
#include<linux/kdev_t.h> p4 g) v1 Q+ _
#include<linux/gpio.h>& {2 G Z g0 m" g3 c. I# C! D
#include <mach/hardware.h>
7 `* E: [8 G1 J#include <mach/irqs.h>
: H, I7 U2 d; [
8 Q6 z- o* @; ~# K) O#include <asm/mach-types.h>- U' J9 M" ?$ L- h1 f0 f
#include <asm/mach/arch.h>( N* F1 x7 i k6 M
#include <mach/da8xx.h># c* \! `/ b b# W. k
#define SYSCFG_BASE 0x01c14000
* {* D' x% a- ?! J( Y; X* @#define PINMUX1_OFFSET 0x124
5 G6 [+ }, r5 s0 x2 Q! M' F#define PINMUX18_OFFSET 0x168 & W1 `, W0 g) [1 k& P
#define PINMUX19_OFFSET 0x16c
# M, f* P& y% R7 \#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR* L$ U7 m' P$ z% @4 m5 H; g
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
9 \. z Z" \) s0 R, J#define XCR_ADDR 0x01D11010 //MCBSP1_XCR, o/ ~+ B) u/ K
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR4 X- A9 K; e# c0 ]9 a8 Z
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR, Q3 i. g" v8 y9 F) ~0 e1 u: D$ S
9 S& ]( v. R- j' Y
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR. A7 O. T9 S+ H0 i
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR8 g" O& L# _ b: s' b' K2 ?
//PSC. x( m3 {9 P7 N
#define PTCMD_ADDR 0x01E27120 1 H2 l3 ~3 H8 _
#define MDCTL15_ADDR 0x01E27A3C
) X' S1 ^! K' U2 c" M/ U#define PDCTL1_ADDR 0x01E27304
( o& i3 [6 e7 v' V' G3 t//GPIO8 direction2 j' T4 ^" Q( r
#define GPIO8_DIRECT 0x01E260B0: s" T1 y& L% I6 G+ S6 l
#define GPIO8_OUT 0x01E260B4
4 G7 E; G" z* W: }+ c; m#define GPIO8_IN 0x01E260C0
! [) @6 ~3 D, J' i; u* W" A* q6 M* S! j4 c2 W8 M9 `9 c
//#define MCBSP1_RINT 99 " B! C% ^! `* X# A3 M3 V+ s- U
//#define MCBSP1_XINT 100 : Z% e0 C1 T+ x6 Q( R
static int MCBSP_MAJOR=239;* ^+ T- {. Z7 e; P. v3 P
static int MCBSP_MINOR=0;8 \+ f9 P% d, O5 n& m4 x. d* H
static int count =1;
+ g1 T& Y6 F9 S3 `& l# e( {. z0 a
#define MCBSP_NAME "MCBSP-device"
, U7 t) w2 X( p9 n- H3 [3 R+ j
+ @# i$ T: o; `* jstatic struct cdev *mcbsp_cdev;' X+ F' }# A5 L M# L7 {5 ~
static struct class *mcbsp_class;& D3 y2 H' n- | { }8 c) C9 l s
static dev_t mcbsp_dev;+ }" ]8 c2 B$ ^5 m9 P4 R
unsigned int DRR_data;/ C9 b# \: }( L6 S/ S
unsigned int DXR_data;
6 w# }& d* F9 j# cstatic int mcbsp_open(struct inode *inode,struct file *file)0 a% f' S3 ]) G5 Y3 {
{. t+ X& S3 u4 @! x# S- d
* l- o E+ o5 U/ {
//interrupt enable,initialized
7 ]; |/ [; q0 p8 B unsigned int temp;
% B% g$ q# \1 Z2 L v n //SLEEP_EN(GPIO8[10])---0
T5 o1 a* B- `* u' n9 U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- }8 f0 Z0 s; b% j5 s2 ? temp=temp&(~0x00000400);
! p4 n5 i1 Y! s$ G __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
& j) `+ O3 r T0 W+ n //RESETn(GPIO8[8])----0----1+ t- S3 M/ G5 }$ }6 l& O& m- y& N) o. a
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% p* m" \$ e$ c" D* S temp=temp&(~0x00000100);) g" T; u( A! X5 f
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
, M* R7 B3 Q% s udelay(100);* z0 a9 e) u Z
temp=temp| 0x00000100;! a# l: J! P/ @/ G$ B
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, K# k2 V8 W/ j9 y Y# ^5 a udelay(100);8 X$ _+ V' _) Y
printk("open success!\n");( M* P! C5 H$ U. f0 O6 p
return 0;# w$ D* y+ `7 Q
}5 V9 v5 M Q& ], ~5 p1 u
' l1 r H: }$ W, A0 K W0 L
static int mcbsp_release(struct inode *inode,struct file *file)- D+ v! J- K: G9 i8 j. M/ E
{
# w# P' Z8 @- F2 r printk("release success!\n");
' x7 S8 ~; N2 J! P! X. w return 0;: b& @4 z o1 V# C
}4 ^6 R( N7 V* m0 x! H% C2 n
% \0 R2 _; H5 Z1 A( z: @
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
+ u8 {: s5 w& @! R( i{
( ~0 D7 Y y! w/ q# A2 L6 j* q% S2 k copy_from_user(&DXR_data,buf,len);
) f4 D" F' H v$ P3 F1 o iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
9 C3 E% M2 r+ t3 T- B return 0;
$ D+ ~1 ]' T5 \
7 X. p/ f1 u7 ]/ X}
; \$ @2 Q( |: ]) u
. d% Q# M+ f! {$ A8 Fstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off) C( ] q. D5 W
{
2 j% `; ]# b) t1 X DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; P H% M" ], R1 k0 ?- U3 Y8 |, V copy_to_user(buf,&DRR_data,len); / a7 u$ }: c* u8 m: l) P
return 0;5 l _$ B7 i% Q3 v
}8 \* H9 I: O I
3 [; M, K% H$ |! W9 [8 j, N: F& ?" b3 r
static struct file_operations mcbsp_fops=$ M& ^5 f. [: y5 [
{
& M- B: v- [! s/ i* l' ]* U/ s, a .owner=THIS_MODULE,& ^8 L! Z# |3 t
.open=mcbsp_open,
& i6 D3 I( i; ^$ X& ^& `$ T; W .release=mcbsp_release,
! `( s E: d9 g4 Y9 v9 U .write=mcbsp_write,
+ {, }' e9 a4 S; E .read=mcbsp_read,' b9 n. ?1 O+ S: N
};
; l9 p; X. u9 _% B! S5 s8 j5 Fstatic int __init MCBSP_init(void)
% m/ D" f7 k$ a# L( t{
* c% I$ `* D0 F4 A/ i. Z3 i) v: L0 Y int ret;
" Q2 h- z; d5 Y3 i6 w" g unsigned int PINMUX1_REG_old;) P2 P- v7 a: M4 ]0 f& v
unsigned int PINMUX18_REG_old;' G4 q' j/ K/ ^: j m
unsigned int PINMUX19_REG_old;: p0 S8 _- g$ @* G- f
unsigned int temp;
# r7 F0 B) N+ d" W. q' I z) P& X if(MCBSP_MAJOR)& T! g2 T$ z. [9 R5 D4 N: \( d
{
; f: S# A' ?5 ^: _2 M mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);# W# d' w$ ]* c; y( f- i
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 m3 ^6 h9 U- O+ f9 C& S9 u+ y }9 O2 q9 P, [( K5 M( O9 ]
else& X4 h& T( f* [& l) u/ m* q( F
{
- Q9 {9 |. k- q. C* e- v, S3 Q ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 p8 J$ N$ c) k7 _9 H+ I! L8 t MCBSP_MAJOR=MAJOR(mcbsp_dev);
# J0 Z9 J! r1 d. K$ m: o& |: I0 S, G }
& U) D. L9 Z* R
' m2 N, h* B7 d: q6 B' g/ ]% B if(ret<0)
* G6 z9 ~" r; [1 N4 p4 N {
5 V. K( e, E/ o6 u% X: A6 T printk(KERN_ERR "register chrdev fail!");
4 q* z! n5 x* s; N return -1;, h; [4 [0 W6 C! D0 Y! a6 i, d
}
8 u; j, F" Z& b! W$ k/ R& u. I
1 F! k/ T- r- T2 }$ o mcbsp_cdev=cdev_alloc();
% L) p2 e* W! l# Q0 r2 R
$ k# _. h6 A' g+ F$ k+ X if(mcbsp_cdev!=NULL)) y2 Z8 A% R* C2 |4 [) T
{+ M. b6 X7 s1 w: O1 L" t
cdev_init(mcbsp_cdev,&mcbsp_fops);
) s2 Y; S* n' H2 E mcbsp_cdev->ops=&mcbsp_fops;
4 ~7 D8 l$ X: }8 s, ]) P) p# `' ? m mcbsp_cdev->owner=THIS_MODULE;3 Z- F- W' ^& z
* b; z8 z4 q* P- Z% p* W9 N: N
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! K! H- m- ^) H9 E g' N
printk(KERN_ERR "register cdev fail!");
* z/ q. x; C% M: P4 u, K else
. |$ T5 ~+ P3 L1 b' M8 B1 i, \, q printk(KERN_ERR "register success!\n");) }8 x: L# f8 m: z) r8 q
}
4 t# `! `8 h) ^/ z- N& w else
( Y+ V; h' \0 t {
Y. k- W: y E% ]/ F6 @+ ?6 X$ z* V9 J printk(KERN_ERR "register cdev err!");
" l( ~( e; }8 j3 m7 c4 z8 r return -1;
2 ]5 D+ {7 z9 f* q, O }; T, y( B' x( D1 Z
- T4 Y, r" p4 V3 @; e mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
; m: F, o/ p3 T- z if(IS_ERR(mcbsp_class))5 p1 H5 Y4 C3 l, `3 t! i2 |
{3 g5 ]4 l# o% W T! ^9 a6 A
printk(KERN_ERR "register class err!");3 _( G# r/ o+ L) @7 i' u" G8 Y/ b
return -1;
8 G v/ ]2 e; {' n }/ k- v- C( d6 m% Y) D# T7 k, r$ j
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; k; J0 }7 S% @/ d2 u
, {+ Z* q8 M3 w! `0 h: q //PSC' _, Y. h( p% t/ X
//add Enable MCBSP
0 j. J) A$ B7 j3 b1 \ a //test
2 E+ w4 A* `2 r) z# V) V7 N temp = 0x80000003;
$ }( A% M: V4 v! F1 \ writel(temp, IO_ADDRESS(MDCTL15_ADDR));
. n, o. H: k; E2 S temp = 0x00000003;2 N0 {% I/ C$ E6 X; ~
writel(temp, IO_ADDRESS(PTCMD_ADDR));
# M- [2 Q2 D+ X( {+ G* O8 K+ }5 ~
: X9 Z9 k2 i- h: N" o7 m temp = 0x001FF201;; Y' V1 M9 l: Y# p) K# X
writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 q1 m' r; j& _; o$ Z" o
! v9 K/ J7 Y, X4 B4 M/ U# @
//PINMUX , {& G& G e# G
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR," }& u( q# ^3 ]: H
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); & l9 Z/ e! y" |0 o% K- B2 q$ h M
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
- [$ l$ D- J% o% [1 J \$ q writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);2 e0 B/ o! j6 |
* W! x& L, G' h2 ?! K1 L- L //SLEEP_EN,EPR,L138_SHK1,L138_RC
, i+ w# \3 B W; `2 J7 }7 j' ] PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); # a; a8 i$ a6 n2 d/ {6 ^
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
1 ^; w& z3 R' D" M* ?' X ]4 ~ writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 Y4 I* _6 D" A9 ?) R ' I( T/ m! {2 _! Y1 S! W+ t6 v
//RESETn,L138_SHK2) O: {3 {: B$ W4 e6 n1 q/ ]
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
, ?. Z+ G' ^0 l. \( W PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ( L3 E6 z- @/ R5 z
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 a3 ~) v- K b. f
. T6 }0 L- X$ d . t; ~' O, G$ F8 @( q
//SPCR Register# K6 ~# p: j5 a) G, [- R1 {# A
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset0 G6 F2 i( q3 ]" f; z5 z/ Y4 w
temp = 0x03000000;//(DLB=0)* d3 q' m" T7 Z5 @8 f0 s
// temp = 0x03008000;//(DLB=1)
* x5 j- H. N# E5 c+ r: @; X9 p W writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset$ P) ~, v+ {1 j- }- Z
temp = readl(IO_ADDRESS(SPCR_ADDR));
# ^, O. ?; z) y* l1 ~ printk("temp=%x\n",temp);* d, x4 V' b: d" u( Z- _8 t
|; X5 @ s: j) `+ o$ w
//PCR Register/ i/ p' U0 J/ f; X; N7 ~( m, K
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
& R1 y5 {- X2 F+ e // temp = 0x00000F0F;2 X: @0 k; n3 p9 w" a
temp = 0x00000B0F;( ?% c% [: R# P* @& `3 t9 Y
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 3 J( ]5 F6 }7 u& |3 \( c- ^
temp = readl(IO_ADDRESS(PCR_ADDR));) p1 M$ Q% g! }5 A& |
printk("temp=%x\n",temp);
% L8 F: K; d7 k+ ~1 V //SRGR Register
- A/ C+ L( _1 n# T2 t% `2 \% N //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==114 n2 N! W- x4 t1 t
//temp = 0x301F000B;8 C- c! ^6 u7 M1 _; B
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
* G: \: t9 F) k9 E1 b2 \1 t/ X6 ]) w temp = readl(IO_ADDRESS(SRGR_ADDR));
; d/ X# Q' g( s, l' e, Y printk("temp=%x\n",temp);
1 X" V6 O' T, Q- x //RCR7 h; t# S6 O# ]
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1," X/ i; d8 _4 N+ }. V: D$ Y( V
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
! v; A, F7 ^) @; h g+ ] temp = 0x00440040;
' z- Z' }& _+ r writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
& j4 |5 p! m# k7 J t) a5 y: F' W temp = readl(IO_ADDRESS(RCR_ADDR));
4 k Y: F1 L5 H9 Y printk("temp=%x\n",temp);8 i; \! k- J+ [
//XCR
; E' q: I& W: Q) o //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
2 N- X7 D; n- k2 \ w //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
+ K* w# K* |: k( i( ? temp = 0x00440040;
9 y( Y% t: J# c# \) R writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ) }( w0 z0 _( B& v0 {
temp = readl(IO_ADDRESS(XCR_ADDR));4 y$ \! J9 S1 O1 f# _
printk("temp=%x\n",temp);
( j* m. A3 t9 ~- z/ K1 F9 }% E4 t4 T+ |8 f udelay(100);
' [1 j c' i) e2 g //SPCR Register) u) m, z/ s$ @7 F% m
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 U) X: W6 e' p1 |, M+ u5 e temp = 0x03C10001; //DLB = 0 VS DLB = 1
; a9 m7 t# o7 ? writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled0 C: Y- y5 [! |# I! S1 n* Y
temp = readl(IO_ADDRESS(SPCR_ADDR));2 D: t, q+ Z: A+ \# n
printk("temp=%x\n",temp);
* r+ V% ~* U8 F udelay(100);* ?* j4 K5 T- _' G) u( c9 O
. v7 C$ S- K- }! \; J/ p
//set GPIO direction6 p! ]7 l. o7 F) c& {6 D" Z
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
* P6 O D0 h, u1 ?) P temp = temp | 0x00000100;//EPR----input
* I% V1 {2 l9 q temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output! Y) M1 H1 @5 n7 H
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - o! b/ N( v& {, w
6 |1 X2 L3 Z, N4 Q+ I( P
return 0;0 k m) P( V1 a5 C, A, n6 x- _* x
}
6 M7 D+ ^( j0 }4 G* V" N0 Bstatic void __exit MCBSP_exit(void)7 G# q/ }- ]1 {& _ r
{. k; w% R9 _& n, t0 g% o, _
printk("mcbsp chrdev exit!\n");
: y- M9 ?& v5 V2 Y* @ cdev_del(mcbsp_cdev);
. d% ^, K$ s2 g: N( x unregister_chrdev_region(mcbsp_dev,count);
7 N. z6 U* [4 B& L device_destroy(mcbsp_class,mcbsp_dev);; F# S% z2 b' o" s
class_destroy(mcbsp_class);
" [% d9 D5 w5 W$ j7 h: s}) L' A( r( Y' k& b+ l+ M
module_init(MCBSP_init);
8 l$ O& `# X& }: C% }/ x0 smodule_exit(MCBSP_exit);
; n/ \ O0 h5 o) b' b2 f; L! f; K- k2 A
MODULE_LICENSE("GPL");; v6 b& }+ Z2 e- T; W% r) q4 U& M
) t1 R7 O* p4 H$ B* d Y) G# r, d" e; T我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。8 J/ l# J' _6 W
我的应用层的测试程序如下/ C, o3 I0 E8 q$ j
#include <stdio.h> f: L/ U+ e" Y& v9 K
#include <string.h>
0 |4 E1 f ?/ K( A) A#include <fcntl.h>
0 C: e8 |8 l2 z5 f#include <unistd.h>
% X' e0 S( J' @6 e+ Y- H% ]. q#include <signal.h>/ M: k0 w' ^" Q* ]) X( P3 _
#include <pthread.h> //线程
3 U- i0 M. o! G' E#include <stdlib.h>
" V; w& e5 R* N% u: k* h#include <pcap.h> //捕获网口数据
8 K1 ~6 I# \- I2 e#include <semaphore.h> //信号
" t! q% F$ F+ ]* O1 {' V#include <sys/types.h> //消息对列
. m: V X& `6 ?#include <sys/ipc.h> //消息队列) Z' S% Y1 `' |
#include <sys/msg.h> //消息队列% {% F, L, y* m4 j. }! o+ e. F
#include <sys/select.h>" P, V) ?& Y6 v0 ^
#include <sys/syscall.h>
0 I. h" O& X4 E- s$ A#include <sys/stat.h>" G0 G9 ^1 u+ {) B% D/ w6 p
#include <sys/mman.h>- z! y- k& R" z; B+ S0 q7 C+ ~
#define msleep(x) usleep(1000*x)7 \9 v- s9 k9 K* H/ S, g
( n$ U" s6 B; a1 ]! j
int main()
, |2 r1 r2 X& |6 \- z" i3 j2 k8 Y5 {{
. [- }" e# H7 x) g# _" Q N! G //MCBSP,ARM与AMBE2000交互设备: s+ y& d, [, ~" o3 `3 P7 S
int fd;& B3 R6 s0 b* ?1 I1 w+ ]
unsigned short data_write = 0x5555;5 D* e0 S' j7 v; v3 t" y; O
unsigned short data_read = 0x00;
) ^3 Y! ~: T, h8 ~+ G fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);. J9 H& _3 {3 B8 i; Z9 h
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
' Y+ X% F/ T/ L7 M $ j8 C& d y k% ]( R, b* V
if(fd < 0)* M# Z4 J3 m% X4 _3 d- N: }
{, y! A, d" @3 e! o& p% v5 c
perror("open failed\n");& [& o9 _! S0 ~+ W; e+ K
return -1;
; V( y j9 R$ {2 X7 r* @) [( n }
% Q( W3 P0 E8 ?! W: x+ [7 w Y
5 j5 U8 L- Z+ R5 z. T% {7 v while(1)
0 D8 G6 W H+ |- ~ ] G {
0 `6 H' Z5 q& g6 d3 v3 x* v
# L0 B/ O& `, N2 r/ y2 s //AMBE2000每次读写是24个字为一帧0 U3 ^/ ?) M1 Y: `! I" j) y
//写数据时将数据在底层存储起来,等到中断的时候再发送5 S: A+ ]% [, r+ Q
//AMBE2000输入数据是以0x13EC开头的8 n$ M$ K3 G$ J4 j+ v
write(fd,&data_write,sizeof(unsigned short));4 Q! s+ x- l$ `3 k3 m6 P5 W+ Y
7 A# `! v4 ]0 S& {) |
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
- F, \' v+ \) ~2 b* }, } read(fd,&data_read,sizeof(unsigned short));; X% \; } M- {, ]% L" Y% L
4 ^9 t+ L0 v4 ?" |; ` if(data_read == 0x13Ec)3 m4 w! Q Y9 l4 x. {6 Q
{
2 `$ a) C9 D5 M8 [' E - h% }5 V0 v5 |! i2 F- u; |- E
printf("data_read = %x\n",data_read);# D0 z, n& h2 I; c5 I! C; V: p
}
# E8 \$ f; E2 v3 j
5 U0 M& d$ ]: B: ?. d2 q msleep(10);
: O$ ?" E( V. H2 q ]$ o2 x1 T( |
/ Y& \. _; T2 B7 [/ o /*
. u1 W. N' E* F j* F) b# s! L& M" H ioctl(fd,1); ; z. U' y$ _1 @' E5 ~3 a# K9 t
sleep(1);
6 K# @9 N7 ?4 t6 R ioctl(fd,0);
/ W6 S! S4 R% A) v sleep(1);& P; y& o7 F' \
*/ & F. I4 i% H- o- U6 z- d
} 5 q- ~* ?9 X$ E, M0 S. y( W
return 0;4 }8 t% q S: k! r
% R: b" `# g) T0 J; \* x) C}
k- r g) i$ s' ^: ?. _. N, c X+ x7 j. P' @& o5 Q, l: V& g
多谢各位指教,谢谢! 急
0 D! C+ O6 _/ Y0 g5 F* h0 q1 I5 X/ ]
, I4 G" F+ K L$ @, f
) _# ]" ]/ `2 P0 c" s# A: J
4 `" {4 F1 y$ f# o& M
3 U, w! I* \6 U3 `" [! T$ v' } \- N |
|