|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
0 H# u1 l& Z8 c+ C6 A3 G. K/*
, y! J7 L2 T) E( q. \ * Copyright (C) 2009 Texas Instruments Inc9 G+ Q' F2 Z" f" a- x0 i* f& x
*
1 m' \7 t0 d% J, B( @% T * This program is free software; you can redistribute it and/or modify
- H6 t6 R9 D% M( a& u8 b * it under the terms of the GNU General Public License as published by! V: i! s4 p A& |
* the Free Software Foundation; either version 2 of the License, or
4 Z2 V) @) f4 Y# X * (at your option)any later version.
. P6 p3 M; h/ h& I4 P4 _. \& E6 ] */ Z" A1 K( D( ~
* This program is distributed in the hope that it will be useful,3 v- x' s: T" t. C4 A \9 a
* but WITHOUT ANY WARRANTY; without even the implied warranty of- ?0 R! v. K& y
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the4 r# ~7 E- A( ~' ^5 }% I
* GNU General Public License for more details.( J1 u$ N6 J) ]3 x" d* h1 \: p
*7 y1 g% `" n4 ~
* You should have received a copy of the GNU General Public License
/ M! f0 o S+ I" [2 Z0 | * along with this program; if not, write to the Free Software$ U+ L$ O( ~1 k( n
* Foundati) g& Z. y' V: l" X% Y
*/; e" w3 D+ N6 I
#include <linux/module.h>
2 _. h3 J0 q; W' u/ o9 p+ y#include <linux/init.h>$ ~' G* Y6 V6 X4 a( v3 w$ K
#include <linux/errno.h>
% f- }. J. h) K#include <linux/types.h>
5 o# i& a) g! U4 T#include <linux/interrupt.h>
9 R4 k/ X/ V' v6 _* g9 t#include <linux/io.h>* _7 N& U s1 f! _2 ]: h
#include <linux/sysctl.h>
9 P* ~$ M9 V s* K/ Z! r#include <linux/mm.h>
* _' v9 b% B) I! b z" L# W#include <linux/delay.h>/ P: ^ E. v# q/ [6 _
#include<linux/kernel.h>' b( G+ Z3 k3 Q! H* R
#include<linux/fs.h>0 t: a' A3 n S, F) I# s w6 e
#include<linux/ioctl.h>
6 p) T7 H# A, r0 n. F#include<linux/cdev.h>
; K# X3 [3 z$ o: I8 d/ v#include<linux/kdev_t.h>, E( G; m2 \4 I
#include<linux/gpio.h>( I2 S( h( T6 p5 P% O. ^
#include <mach/hardware.h>
) @ q+ l) q" @6 H. J- \#include <mach/irqs.h>
$ ?( F$ z7 f# K% @4 a R N8 k$ P+ D" A9 X/ l
#include <asm/mach-types.h> d, h7 T1 i+ w6 o; c7 X
#include <asm/mach/arch.h>
# K# F5 U/ F+ P4 q; w0 u#include <mach/da8xx.h>. Y, X/ I7 c. b1 n( K
#define SYSCFG_BASE 0x01c140006 }+ x: @+ F9 O: y+ m7 e# |
#define PINMUX1_OFFSET 0x124 0 q; ~+ l5 v( O! h/ L1 d
#define PINMUX18_OFFSET 0x168
2 Z& x, W& M$ i! @#define PINMUX19_OFFSET 0x16c
& x7 [; |8 ~4 P& Q- [* f4 E#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
n( A$ \0 ^, n+ b9 u#define RCR_ADDR 0x01D1100C //MCBSP1_RCR* ]3 W* [* F( G( G
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR0 f# {3 Q$ f, @ Y
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
. ?! W+ N" a, F, s( ]+ Z#define PCR_ADDR 0x01D11024 //MCBSP1_PCR: ^) x+ f, a) B5 V
* s f- Z# p# y, P% A4 U. r9 Y
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR5 v3 T. G. \6 O3 l3 p( g/ [2 J
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR- j$ `, M1 L9 z& c
//PSC& W! J/ |% o) U4 D0 x2 E* o
#define PTCMD_ADDR 0x01E27120 : U3 k/ N0 F3 ^3 H9 }7 s
#define MDCTL15_ADDR 0x01E27A3C
2 H. k7 Y5 G A+ B- u( L#define PDCTL1_ADDR 0x01E273049 O7 t, Q4 U" w6 g/ b& ]
//GPIO8 direction' S! Q( t- G! ]% T, X7 i
#define GPIO8_DIRECT 0x01E260B0
1 s) F e1 s8 I; u9 }) \#define GPIO8_OUT 0x01E260B4
& N' u4 g0 s( z& O/ s#define GPIO8_IN 0x01E260C0
7 \9 j! _" e, G+ V
9 \8 {- B$ k5 e; j) b/ K//#define MCBSP1_RINT 99 + H% W/ q8 s4 U& n6 R m. g% @& q
//#define MCBSP1_XINT 100 i2 e- z- m4 ?; _7 Y
static int MCBSP_MAJOR=239;9 T8 I G2 R) D
static int MCBSP_MINOR=0;" E/ _6 }9 [* u# f4 q
static int count =1;
: y& @" p3 n. n, d- `5 u9 p; n) {$ Z% R$ p% Q
#define MCBSP_NAME "MCBSP-device"
$ U% u7 q6 n9 p6 ?6 Q" J, e$ M- x
, s1 O! b, ?( E. g" w1 tstatic struct cdev *mcbsp_cdev;
% R# g7 r0 x) x5 z( |static struct class *mcbsp_class;) ?4 ]9 t: C* b
static dev_t mcbsp_dev;
8 ^( ~+ K+ N/ ]6 K; Nunsigned int DRR_data;
) F( ?" {/ w9 t5 W" k( l. ?, P) ^# Dunsigned int DXR_data;% I0 ^* T* w" ^: ]
static int mcbsp_open(struct inode *inode,struct file *file)5 A3 o& H" A( b$ s# ?9 ^* V
{
0 J6 z5 G3 g d! `( a ! [5 J. x6 n9 U0 L1 |* B' F
//interrupt enable,initialized2 w, n5 u5 e$ J! y9 e
unsigned int temp;
9 a$ B6 Q: O" X- m/ g p //SLEEP_EN(GPIO8[10])---0
7 ]0 J# P. H! g! u* i temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 y, J8 H# K% {) e$ t
temp=temp&(~0x00000400);
( @# G( V' J2 y. L$ a/ } __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
2 x9 B' h( O; I+ o! [ //RESETn(GPIO8[8])----0----1! K. x! ]+ X) ? |& V9 |
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ M% T6 ~7 _* U% W1 G, { temp=temp&(~0x00000100);
2 j/ W: I6 u/ [6 B __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 @1 y3 a) z. s1 d' t- u
udelay(100);; b/ @( j5 W* H# q1 Z3 I l
temp=temp| 0x00000100;+ b ~! P; X( c! B
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1' h2 ~, W$ Y5 B7 u. G6 _
udelay(100);, q' g3 Y& e6 C$ S3 s3 S
printk("open success!\n");
' E/ l* S3 e8 Y7 Z return 0;
: G/ Z$ P! g. D( _, ]) f* V! _/ I7 h}- s: ~" a& N' Z4 {( K5 {
) N- M6 F( U4 M. d N$ D4 M
static int mcbsp_release(struct inode *inode,struct file *file)* U ?2 L/ C0 O g
{
5 t0 N* L! _7 i( S& K printk("release success!\n");
# b/ a4 r" J/ M' @ return 0;
; a" f2 b a# ? Y# w8 a}
. H p' {- N+ G; b4 @/ Y5 R6 t
4 r4 p- i# ]( {8 Jstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* b& x( _) ^2 B4 y3 x* X8 c {
{# D& R: A9 A3 q# h
copy_from_user(&DXR_data,buf,len);
( j6 t) a. b# H. j iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); / e. v6 H5 k/ a, f- y& |; W6 d
return 0;
& a, s+ x* |* G$ g4 d
0 C+ i$ j% ^) Y$ B2 R}2 I. b0 H* _% e
) j$ ?% {% |, O0 a }- pstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off). p3 l, n$ [# ]& a2 E! [8 u
{ 8 K. f( j2 M" b, p+ I/ n
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR)); b% @5 u" T' X; Y
copy_to_user(buf,&DRR_data,len);
6 e/ w+ p8 j% b3 _$ f return 0;$ e+ M, l! D7 z9 u% \' o
}5 E3 b) {) O4 m. }, @& w, _8 U6 C
5 y8 a- K# @; L7 g' z
" g: h2 K3 A/ Bstatic struct file_operations mcbsp_fops=9 R/ _/ S' ? p' f1 V* B
{0 x3 F- F$ G7 m2 B
.owner=THIS_MODULE,* v2 g R7 Y0 E* Z- b1 ^* d
.open=mcbsp_open,. S8 c+ ^2 m0 }- [
.release=mcbsp_release," |! f: g8 h1 v' Q% G- n
.write=mcbsp_write," a% F" Z" d# B7 r8 j
.read=mcbsp_read,5 U+ Z; t4 [2 c& b+ q
};- p5 L" o, B2 X& j1 I8 S7 e
static int __init MCBSP_init(void)
5 ~8 C7 b$ R$ E* M0 c9 w{
( [8 d' B8 J1 i5 S! | int ret;
& k/ N) J0 ~% i* g1 W unsigned int PINMUX1_REG_old;* O) ?7 m9 n& W" B. p ^
unsigned int PINMUX18_REG_old;
; T' k3 j3 }0 F unsigned int PINMUX19_REG_old;
' y1 S5 R5 A# B1 i3 ?# p: V unsigned int temp; 1 H6 j) }- {" h3 G
if(MCBSP_MAJOR). {' [# W& ?9 e
{
/ [3 `9 H# q0 ` mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ s" K& ?1 ]5 Q9 I1 @! u- x1 r F
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 K) @( R5 s2 v! \
}* c6 j- g5 q; X* N9 b5 x
else
8 x2 ~2 C% [. \0 c7 ~! f# A {7 g7 m5 D: G5 {$ V3 C, `
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);# L9 _9 T% z- ]# Z" a5 P! x t
MCBSP_MAJOR=MAJOR(mcbsp_dev);
) h: ~# B' E; r5 m }$ D& U) J! [7 _# m
9 [& ~+ X: _; D3 F3 g' T: P
if(ret<0)
7 o& S) ~$ m) u, d# ?+ W {
2 k. M3 ^$ m! }* d2 @. L# ~ printk(KERN_ERR "register chrdev fail!");4 O- r* ^0 {0 M+ k' n
return -1;
3 [. i" C# `* c. s/ \' T# c }1 {& V/ |* {1 T- F4 h8 D8 h
1 E- @( t$ Q1 ]6 q
mcbsp_cdev=cdev_alloc();: b* _5 c7 I1 r- W4 m+ g- r
% R+ D& l, ^/ u4 B: \( b$ U9 d if(mcbsp_cdev!=NULL). r! t! \ y% `2 P0 M* x& p: X5 Q
{
3 K. S' o/ Q' S' C( D8 ]3 {0 e cdev_init(mcbsp_cdev,&mcbsp_fops);
/ k1 C6 x( G7 B' {9 O; d mcbsp_cdev->ops=&mcbsp_fops;9 }; R( Y2 Y. n/ i1 Q4 P% v7 I
mcbsp_cdev->owner=THIS_MODULE;" {' e# e- E2 d. ]$ q/ g3 n
$ T" ~3 L v6 R, H! [$ c" H if(cdev_add(mcbsp_cdev,mcbsp_dev,count))$ \' l3 U1 I7 s4 y# l" J2 ?1 s! j9 r
printk(KERN_ERR "register cdev fail!");
! G. O) p1 m8 y/ P6 t else
/ \1 s' W( l) L9 x6 W9 ]; c$ a7 { printk(KERN_ERR "register success!\n");+ y' u6 c v( T. [0 @
}
8 E2 Z T9 q! E, l8 g* x' m$ M* t else
4 L; N6 s1 j; G7 G% t {
5 J5 w6 @/ k9 s) h$ b$ O+ F! m printk(KERN_ERR "register cdev err!");2 y# E$ K- l7 ?2 s5 h
return -1;: O8 m# f5 E) h
}
, N' R! {! u6 A1 S7 g 0 o* Z0 n' ^9 J- @9 G7 G$ H& P; J. q
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME); c v P; P3 h4 l$ i% J
if(IS_ERR(mcbsp_class))
! K9 b7 @7 z) {% Y. B: {/ r' n! g {3 J+ Z! Y4 _6 p' u
printk(KERN_ERR "register class err!");$ `- ?5 Z4 f9 T! |1 p
return -1;
/ |% Z; D' S% o% W: ^) R* a }( j1 J& E; w! ^5 w9 S- V
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- P) l9 M4 u3 S4 N+ m5 O8 v0 h( S
//PSC6 q" @( B) ^# O# [* ~; W4 F
//add Enable MCBSP; q, L. J; \ x E5 e
//test& c- i3 ~% ~2 X- J6 C
temp = 0x80000003;; W, D x+ O# i# T0 {
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
2 Q: d9 o w* u0 i temp = 0x00000003;
+ r+ q# s: A! c" o" C! D( t writel(temp, IO_ADDRESS(PTCMD_ADDR));
3 b5 w0 o* |* Z. | }" I/ e 6 @- w7 z& j$ f; S
temp = 0x001FF201;
8 J1 s( o9 X: f/ U writel(temp, IO_ADDRESS(PDCTL1_ADDR));# [! W2 _0 f. P+ l2 w5 W
* Z0 K1 }) w9 {+ B8 k* W9 k //PINMUX . K$ o3 u$ s) x! D& P
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR," {) r+ c5 j$ {. G0 F% Z
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 Y4 D' r4 L+ D1 B& [# D9 P; B6 A PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
% [+ @1 T g" C$ P- I% ^8 Z7 ?0 | writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);% F: J$ y2 H1 G$ p+ V
: L- [+ c6 K Y3 U) E: V //SLEEP_EN,EPR,L138_SHK1,L138_RC8 \1 R$ f7 f% S3 c* O
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); , ~# Y) U% j3 z3 D! F
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; # t4 h' C2 H$ z) |! }. D
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);0 o, |3 P3 f9 Q6 O$ J
2 W4 T8 a. q6 C% V( s, T; K //RESETn,L138_SHK2
1 d' F# n( z: a! Y' j PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ; s- ?! A. J+ p z% i
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
5 V: i) q, a! L" R9 m writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
# h h- X- C$ u' q/ e6 ~
, W) I0 F/ n7 y , L( W. _2 v) u9 x( n
//SPCR Register. e( j9 [9 D% A' K6 e* ?) m
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ }8 u. q4 N) L( B
temp = 0x03000000;//(DLB=0)& O3 R$ E- H" D
// temp = 0x03008000;//(DLB=1), h! y; e" Y- g8 b. C* o' o; V& y
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset8 U" i. j% m+ ~. t! _/ U
temp = readl(IO_ADDRESS(SPCR_ADDR));
9 U$ H' n. Y7 [ printk("temp=%x\n",temp);
. }$ a1 ]& Q0 x5 J* X' X7 [
# i* z1 r8 Q# E( T, i //PCR Register+ X' s' T! k% e* g3 C j+ ?
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-07 ~& M# I3 ]! p, {
// temp = 0x00000F0F;
4 q' H* i) Q* k: B$ W temp = 0x00000B0F;
8 @! M3 ~+ D9 ~, g writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized # N3 ?5 f" ?- F
temp = readl(IO_ADDRESS(PCR_ADDR));
: K$ a/ U+ _# V printk("temp=%x\n",temp);
& j6 O |" G/ `/ T //SRGR Register
4 [+ L, B" D$ z/ ]$ } //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 F: x4 l/ a% |( M, B" U( O- H4 [9 _* V //temp = 0x301F000B;
4 S7 L$ D+ F9 g* \( Z* s writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized % g6 G( [ ]4 H8 g/ y
temp = readl(IO_ADDRESS(SRGR_ADDR));* }3 W( A+ }3 A/ t9 |
printk("temp=%x\n",temp);( |5 T2 J1 m* k$ F
//RCR
' y- S2 O- z2 V9 `( F. I M //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
& D$ t" i, K1 o; @. v& c2 c" f& d6 `$ c //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" B7 l+ C; t. N o5 a1 T0 F; Q
temp = 0x00440040;
& }8 c% h3 _( o5 w/ e writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized , [0 p' C) j( v3 Y- m5 k
temp = readl(IO_ADDRESS(RCR_ADDR));' M# v7 R. e' H0 G* i" d
printk("temp=%x\n",temp);
0 `7 h& k. g, S& H/ f# I4 C: l0 ` //XCR u2 O+ C/ l8 g/ F
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 o1 U$ R6 W" E2 X1 w: ^# g
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! y6 m. X3 W! J6 B; N- {
temp = 0x00440040;: `6 f P# Q, B1 Q9 D% f- k0 ?
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
1 g# e5 T6 Q0 z temp = readl(IO_ADDRESS(XCR_ADDR));+ @ p6 m9 W7 g) }4 v: Q9 G( F
printk("temp=%x\n",temp);. _! i, s5 ^; |8 D4 U# E5 r8 Y% C
udelay(100);. P/ |' z8 @2 v g
//SPCR Register1 Z" p8 j6 y [3 l, q* N
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
; h/ q2 i: p9 j3 r temp = 0x03C10001; //DLB = 0 VS DLB = 1
7 Q2 e7 R4 ^- B. l8 Y writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled9 }# u2 A* i% K- N6 J# e
temp = readl(IO_ADDRESS(SPCR_ADDR));
7 E5 s) e& b) A O) {6 N8 d+ N7 i! p printk("temp=%x\n",temp);$ X7 W+ l' s/ {+ P& b, O$ o
udelay(100);
8 z/ v3 I/ Y; I1 z& o3 n
9 e: H" O6 T. P4 C //set GPIO direction+ c1 `) Y) f# r% | n& {& g# R& U
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));0 ?- k# r! f6 h/ t3 w4 L0 @
temp = temp | 0x00000100;//EPR----input
U Z& Y* t* J8 \: D: @2 [ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
( W# A, N6 l' E& A; b; S3 b __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ; h: U* X+ E2 M
! y$ g' N" [) v# d' o& y( [ return 0;
, ~+ o# C# ]* {; y} K# F' s3 e+ |1 `: g. d
static void __exit MCBSP_exit(void)' M5 v6 L# f$ L3 x3 @
{0 e$ [0 \6 ]! P4 ?4 N: c
printk("mcbsp chrdev exit!\n");, u5 }) \, L) r" r( c8 g
cdev_del(mcbsp_cdev);# Z8 j4 |; C) T2 u9 e. b
unregister_chrdev_region(mcbsp_dev,count);; Y' t1 k7 H2 c, }) \; Z
device_destroy(mcbsp_class,mcbsp_dev);
! U6 }; G' ]' V2 Z2 E class_destroy(mcbsp_class);
- \# t3 j" P% E6 {- a* N7 `}
' v8 B6 F+ ~& Hmodule_init(MCBSP_init);
) d0 q! g6 H" ^5 m5 S! t- A# }& vmodule_exit(MCBSP_exit);, D' Y$ P! V8 n2 Z
4 G6 B% S; d/ k n; L
MODULE_LICENSE("GPL");3 Q" k7 a8 i' q! R! v
' B! ^' e0 [! i" m0 j我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。, m. U) u! ]$ ~8 D3 C- Z2 g
我的应用层的测试程序如下
1 @/ G4 q) B1 e7 F: i9 d3 u) c#include <stdio.h> A1 n# w4 V0 F1 ]0 Y! A
#include <string.h>/ z6 c. H5 O3 l0 w: C
#include <fcntl.h># _4 b8 A2 b3 U; ^
#include <unistd.h> {$ q x" q: o( G" T7 ?( Y1 R' ]
#include <signal.h>
/ X. ^/ s! z2 Z2 r3 \2 F: _#include <pthread.h> //线程% L4 ?2 s. X0 N8 t
#include <stdlib.h>1 r& U. t+ g5 ~# J6 t4 I
#include <pcap.h> //捕获网口数据
+ l* G6 c2 L: i* x' `( t#include <semaphore.h> //信号& ~! C9 a/ L6 r3 r% J( v
#include <sys/types.h> //消息对列4 G( z6 T- Z! g) y- U# R6 ]
#include <sys/ipc.h> //消息队列1 Q5 C1 z9 E3 `' \9 I
#include <sys/msg.h> //消息队列; x+ V0 X1 P! | W+ o# s, r
#include <sys/select.h>8 N! x3 B/ q' g1 E! `
#include <sys/syscall.h>
! H8 Q! r: I+ i" Q) j3 d3 e, `#include <sys/stat.h>( t* S9 |! k- U8 k/ G
#include <sys/mman.h>
3 W9 {' g: X" |( r7 Q2 W; T. f#define msleep(x) usleep(1000*x)9 y0 p/ R/ M; c* W$ B
$ Y& u% M, H& m0 Wint main(); N9 c: X3 ~( f# ~. H
{
( L: R% m$ F8 S9 r/ ` b' p1 D2 ^ //MCBSP,ARM与AMBE2000交互设备
# \: I9 v ~$ ]6 }8 [; w5 g int fd;, G1 ^4 M) o. s) H3 P5 S9 l& N$ x
unsigned short data_write = 0x5555;4 H: x2 x1 e' x- ]1 w
unsigned short data_read = 0x00;' Y: F8 k; d& ~1 n3 N. J
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);) R8 f* e% w3 [9 i
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
& V0 f# T. v5 U5 ]5 W' c" H
" u) Q! q" P% s- @7 a: F if(fd < 0)1 b" [& q; c! G% j
{: D! D/ ]& U6 }' x# c
perror("open failed\n");
+ G* _2 t' C4 k( v+ }1 |, d return -1;
6 D6 V4 U& {6 E4 S }
0 t# g$ B/ D9 \
0 S$ ?/ \' C0 U# g/ x v% O; J while(1)5 v/ R7 l" d M2 b6 h; e5 X
{
4 ]; J9 K* O" I" ^ + Z8 {* Z S8 s6 }5 t, L* Q# n
//AMBE2000每次读写是24个字为一帧
; G8 A2 e* W& N- X( A //写数据时将数据在底层存储起来,等到中断的时候再发送
2 h" s6 {- k/ _2 G8 h& u9 [ //AMBE2000输入数据是以0x13EC开头的
; _3 Q2 n" B1 m/ q' o' q$ N write(fd,&data_write,sizeof(unsigned short));
" T' B9 g- l; f- ^5 ?0 { & s# n# [2 Q/ N/ ?: o2 Z/ V+ P8 ]
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 3 q: J. t/ H. d( n7 x2 ^* \8 x* Z
read(fd,&data_read,sizeof(unsigned short));
6 o; C: d: G' e- d
; g" ~* ?! f ~6 R3 |6 s* W if(data_read == 0x13Ec)6 b' j: z! [6 i# _* M
{
5 x3 q0 R: { t( W' a! v- P# w- z( ]
( F4 e. {( v7 w* d9 O9 R; A printf("data_read = %x\n",data_read); R3 `# k$ ? Z9 ?+ {& x: |
}* {2 U4 t M Z
3 s; y+ j3 N+ x; Y/ N. E: n5 S
msleep(10);
# U8 M: E. e1 c - N6 X5 @9 j8 ^5 d# l
/*
! l. M) R, A9 { ioctl(fd,1); * N% M" f/ N- T) v
sleep(1);
0 ^6 ~+ @: a V4 A9 H: x1 q1 W ioctl(fd,0);
; B/ ]6 W1 h% \" r5 A sleep(1);
5 r: \8 K6 z6 }& }5 ] */
9 D _+ X- q- e0 |9 ^6 k4 @ }
+ i O9 b$ X% b7 i [ return 0;+ o5 \, _ P; d: _ r8 s! Y
, _% R5 u( u* r9 F. ~1 m% p/ T}
; @% y+ u. Y& S4 u# U( |
! |# z, h2 Y, {- g d多谢各位指教,谢谢! 急3 P( L' s$ M; p1 b" M3 u1 ]
# ?9 G* E5 M( v& B( H8 f
0 `" b* i: L5 r/ t% ^
7 P' }# S9 f9 X. `- m L. y6 d
8 s& k( _$ s- p: ^* [' _
1 W" |- w% g& [& ^* C- i. O* N; o |
|