|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
6 |5 U; e& d" f; ^/*8 }0 X7 R+ M, x/ I Q
* Copyright (C) 2009 Texas Instruments Inc) @! A6 |' T: e V4 D
*
: x0 n. r' x0 X2 L: J * This program is free software; you can redistribute it and/or modify
# d3 \* U# ]9 `8 U7 Z% n * it under the terms of the GNU General Public License as published by7 x$ |' I l S3 g. s* |" J
* the Free Software Foundation; either version 2 of the License, or$ Y4 ^# M5 J7 f! O3 ~& B3 a/ J
* (at your option)any later version.
9 T; X) R' J# ^% d8 G% y3 f8 p I# D *
6 Q! b- T3 \8 V7 X! Z * This program is distributed in the hope that it will be useful,9 k) K: A. D# E/ ?9 d H0 h/ M
* but WITHOUT ANY WARRANTY; without even the implied warranty of1 C) V7 j/ Q0 o0 z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 c$ \ J z P( w * GNU General Public License for more details.. F8 e8 c* e* B6 Q0 E; x
** _, d$ A; _, w! j$ Z
* You should have received a copy of the GNU General Public License# }% p+ O( b9 w# F+ m
* along with this program; if not, write to the Free Software
' u X- T8 A( t" R * Foundati6 v3 P% }* c' ?/ l
*/
% g( d. k1 Z6 u! u#include <linux/module.h>
* l* H" F# A+ B#include <linux/init.h>0 K* c$ h$ Z0 B6 J$ h0 }
#include <linux/errno.h>$ m5 r& Y o4 ?2 ]
#include <linux/types.h>
# Q/ y" j- n+ x) G8 ]8 e3 b! w#include <linux/interrupt.h>* i7 i7 n! X, ~( y/ j
#include <linux/io.h>% ^. g1 n8 _. `4 x5 O& V
#include <linux/sysctl.h>
! J, |, z* ]- A! ?7 A#include <linux/mm.h>
$ P# c. Y4 V7 `/ R" J#include <linux/delay.h>3 V. E! h& \7 ]
#include<linux/kernel.h> u" c" B+ v, T7 u( F
#include<linux/fs.h>! O# c( m: F0 [* Y R$ T, ]- I
#include<linux/ioctl.h>
2 s; Q+ J- x# G: d7 M! m#include<linux/cdev.h>
! w9 ]. e& S7 a#include<linux/kdev_t.h>
4 W( w" `# Q) B, ~9 N- H* j7 b#include<linux/gpio.h>
5 x( V8 S2 p$ A7 ]#include <mach/hardware.h>2 W2 Q# R; b4 }2 Z& ?4 ]8 A; x
#include <mach/irqs.h>
/ i! b" d/ H, I% U% o* Y
+ c1 j6 f# t8 a/ l, t* O#include <asm/mach-types.h>1 y1 H( J& K% h7 ?) K* H" z& f
#include <asm/mach/arch.h>$ R; C" {$ E% I7 W% `) ~# @' A
#include <mach/da8xx.h>! X' O2 p0 H9 h0 z Z/ ?! A6 c2 ~
#define SYSCFG_BASE 0x01c140003 ~3 \* S9 ?6 c1 `% m; x! x$ y
#define PINMUX1_OFFSET 0x124 6 G! e3 n: W: [9 h) W4 T. R
#define PINMUX18_OFFSET 0x168
# E& O3 g1 o: o: _#define PINMUX19_OFFSET 0x16c
0 T& B- d l3 j$ C2 j- s#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
# I4 ]6 L! i! G4 J- Y#define RCR_ADDR 0x01D1100C //MCBSP1_RCR$ y9 x7 B# g7 {7 h. r- p; U
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR- E( m+ A% x3 }" \0 L
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
6 p# A. M2 Q' a7 {#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
! A' P. E4 | \/ Y% b+ w 6 s4 g; R, N8 A$ N3 Q+ v7 q# X# f" p
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
7 j0 o9 Z# s, G& `7 ]( _#define DRR_ADDR 0x01D11000 //MCBSP1_DRR7 U8 k/ ]- D. N1 S9 @7 b- V3 \
//PSC' w* W; c+ | K, Y9 z: M
#define PTCMD_ADDR 0x01E27120
7 r7 A$ k9 X3 w- y6 F! o#define MDCTL15_ADDR 0x01E27A3C7 B+ J' }8 x, d w2 |4 L
#define PDCTL1_ADDR 0x01E27304
0 ~9 P4 A7 z% I" C/ c//GPIO8 direction0 H" ]3 j. e) K* v" f
#define GPIO8_DIRECT 0x01E260B0( x# Z4 C# T* r- k9 `' T0 J
#define GPIO8_OUT 0x01E260B4# M1 y$ D( [' {5 [: o2 U/ C
#define GPIO8_IN 0x01E260C0
4 V, R4 G* v( S8 S" _, o# v, ~$ v8 K( ]( I' N3 u- \0 r
//#define MCBSP1_RINT 99 0 N. |- p; f* Z+ ^8 W$ M$ r3 v
//#define MCBSP1_XINT 100
& } M8 }8 ^( g, S5 H& lstatic int MCBSP_MAJOR=239;
0 M m L9 j3 [, y& O9 Lstatic int MCBSP_MINOR=0;
) \# F4 M2 O6 v0 Ustatic int count =1;( H6 E6 H" E2 U8 A
; ~6 w5 u- _& L/ x1 I O#define MCBSP_NAME "MCBSP-device"
* O2 `* M1 y; W) w3 z
* S# u, A2 V1 {$ \8 @; s! Ustatic struct cdev *mcbsp_cdev;
, ^& ?5 f/ a9 J" i" M8 [/ t5 Rstatic struct class *mcbsp_class;8 A$ j: b0 A$ R: I
static dev_t mcbsp_dev;
! Q) f! K# n; D' i+ q! Iunsigned int DRR_data;
. K1 ^5 z+ o* x x" I6 kunsigned int DXR_data;
. q% b5 u# ]* x+ v: Z' q$ y3 c6 pstatic int mcbsp_open(struct inode *inode,struct file *file)
! t1 [8 E5 q- S) ?1 q" w: p{
! b' W: M- ?! v, V8 L - d% H8 J o! ~. C* |8 R
//interrupt enable,initialized
4 n9 Y5 M0 B+ o2 ?. @0 G" F unsigned int temp;
) U. `2 i9 U+ Z% p //SLEEP_EN(GPIO8[10])---0
6 u$ u- [0 j& o temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: f8 \( K+ k" U1 ]! `# y
temp=temp&(~0x00000400);
. |; R' L1 Q) \ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
$ _/ e! r) ^7 z' N. F8 a8 Y/ i+ C //RESETn(GPIO8[8])----0----1
! e T+ [# k7 M* Q+ w7 g8 H temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
" u4 z0 r) m" S temp=temp&(~0x00000100);* Z" s3 Q3 n ?% K: o/ u0 `. B
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 h; f$ v4 B$ _) X" Z
udelay(100);
# ] H3 t& |, l; U$ M, m temp=temp| 0x00000100;
4 g( A! N% V' i a% p __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
1 e' Y$ N' L6 \: }( x udelay(100);
. r' C" E. a9 X8 G5 M printk("open success!\n");0 I" }5 j3 [3 t1 p8 |: q! c% c
return 0;1 H9 j$ }3 E3 X0 D. V+ T) Q2 O$ D
}1 _" ^9 m" e. ], d& g) J# f
, f9 E. O) d' @9 h) Z% [static int mcbsp_release(struct inode *inode,struct file *file)$ }/ {) z* v9 o. T. y2 ^
{1 Y& i$ G. Z- A
printk("release success!\n");
# I& y2 Y# L; a& b" D return 0;$ e0 e& q8 B1 o
}; J8 y1 j; \: o
4 E; p( H' k) D7 ]4 q$ |static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)" a) }0 E* {$ \, ^
{
% j2 E& h6 _! A copy_from_user(&DXR_data,buf,len);
8 _* y; e# x! D! b* [+ j2 g iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
% Z$ R. j( X2 e/ y7 @ return 0;
/ E1 y3 p- S$ e$ I
. H& Z J9 f# I' T}
( V! g0 G; M& B; Z( N$ m! k$ d( c5 _5 d' S0 g" H# x
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
2 T& \1 d7 M5 l{ # I$ G" Q: }4 C2 [+ ]
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));. ?1 J9 i$ x; O" v( M! _ U
copy_to_user(buf,&DRR_data,len); ; m" y) i' r! b+ x5 D- W
return 0;
+ d: ^1 E% \! o. s! v}
- o# O/ r/ T( ]' G; U4 Z4 X7 B/ h! ^$ G' q
: ~) J( r( E$ T: ^2 tstatic struct file_operations mcbsp_fops=
6 |* I% t, V9 l: [: I' ?{+ g! K+ U1 P7 x9 z! F8 M) f
.owner=THIS_MODULE,
. k% t K3 }0 }2 L! {5 @ .open=mcbsp_open,
! i/ p2 g1 g. M: Y I: f0 d .release=mcbsp_release,
7 `9 N8 ^% y: P$ T" \: I .write=mcbsp_write,
; K! x _/ a H3 r/ c .read=mcbsp_read,
& s$ v: J) Y/ B8 G8 o" O};
5 c# k4 w D( M9 W1 Q9 A# |; cstatic int __init MCBSP_init(void)
1 z% h5 g l6 o6 I0 o& B2 W+ u{
* H$ O" e! \5 I1 K int ret;
8 G8 c9 z7 C1 _ A$ [ unsigned int PINMUX1_REG_old;
. P- F+ j" K1 J' D+ M unsigned int PINMUX18_REG_old;1 m. c8 }# T9 A# m
unsigned int PINMUX19_REG_old;
" o4 X/ p2 M$ W: b7 b4 M unsigned int temp;
5 ?7 [2 g* S' x# A, h R if(MCBSP_MAJOR)
3 E$ i6 y3 `/ n$ b2 H g6 ~: z {) C6 y' k# t" g: }& [$ h p
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);# {1 Z& |% \8 B1 `' f
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* X& t; t$ `: o3 r( o3 f1 k, L
}4 L% Q; \# o1 t* r! `
else
3 D. T* z6 M% m4 g {
8 O0 B2 C! ]! q. s& P4 } ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
5 K0 ]* u0 v' o# a MCBSP_MAJOR=MAJOR(mcbsp_dev);
( p6 r, A0 c Z }
9 `; [' C' z3 ]: A 2 S! |6 W/ z+ l9 h: P3 ~9 S8 c
if(ret<0)
# h- l" K! f, y; T' O! [% t {3 x% x0 A8 J- o4 A: f+ d b
printk(KERN_ERR "register chrdev fail!");
8 z0 _! f6 y! E7 \4 ~( v9 s return -1;3 k- {' e# c. m. J) F4 {1 P. H
}
7 T) \5 o3 S8 y5 a9 `9 K8 O! B
0 g: u8 y6 T/ I9 y' f' U mcbsp_cdev=cdev_alloc();) t8 W. h2 j$ r! X8 X! p2 ^( S
; X5 N6 L6 }" ~: ^. x
if(mcbsp_cdev!=NULL)
5 `( Y' c1 @% V* ^ {6 c% e; p [9 }/ E$ q+ n8 `+ m" u
cdev_init(mcbsp_cdev,&mcbsp_fops);4 e6 p% {8 o+ R, N/ k* ^4 U; f
mcbsp_cdev->ops=&mcbsp_fops;& o& a" r$ e2 U
mcbsp_cdev->owner=THIS_MODULE;
4 b" a0 G/ w$ _( S1 a6 H( Q
2 y5 i" H M/ w, o' M; p8 `7 z if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
o% ]* P3 o* a' h7 [; a printk(KERN_ERR "register cdev fail!");: N3 ~* a' H% x6 A
else4 ]& `* z5 V C# |
printk(KERN_ERR "register success!\n");
9 i% R3 ?3 y/ Z: L7 M; A }
6 _$ M( [. M9 c5 A$ } else
# M' h6 b8 t0 D4 z6 @! t5 E7 j' e {
, E$ U* T1 b% [5 ?3 G printk(KERN_ERR "register cdev err!");6 P: W7 V7 Y. A1 n
return -1;
' k0 j. E. h% @! n }2 H( }" q: u! k& Q* z
, E8 c1 j. H4 Y2 i
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
; a; Y& c- e0 E* r if(IS_ERR(mcbsp_class))# e& w0 }) b" `7 C
{
% Q6 C& H5 Z/ p4 X8 K* Z& n printk(KERN_ERR "register class err!");$ ?4 ^, I X; D6 T0 h: m
return -1;
0 C6 ^% F, ]( [4 v' u }0 K3 H( b! J/ b) X$ m$ p) x" t& e5 Q
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
, b5 a$ \' ~9 p8 w3 r" _" D3 G4 _# R) ^ i4 h& | i' c
//PSC& C; m1 Q) P, M" S
//add Enable MCBSP
9 Y7 I- I% O7 J5 V5 ~ //test
$ x+ z- h" g' {: b- x3 i; t& m temp = 0x80000003;
; C+ b6 \& d2 f; F writel(temp, IO_ADDRESS(MDCTL15_ADDR));
$ p1 A+ V" Z- P1 h9 ~' N temp = 0x00000003;
. e# R! y+ M3 @' O3 q) s/ T writel(temp, IO_ADDRESS(PTCMD_ADDR));8 L5 J& y/ j* n$ d: m
. A9 S4 V' C" z9 J temp = 0x001FF201;! k. d; U. q$ ~" ~" `7 x! H
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
0 O$ a3 Y8 W; c. y( Z 5 N0 f: Q1 Q. v
//PINMUX . L A7 |& A8 s
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ F7 }$ I- J3 G- }/ W' B
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, M* a% k# n* [+ f PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
* b p& U' U1 e& }6 Q$ B, @ writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; @& F' t2 `5 j; i5 f
! m' y% \- E, T& ^ //SLEEP_EN,EPR,L138_SHK1,L138_RC+ p9 c% w7 m1 O: Q
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ; s4 ?& I$ Q8 ^+ E6 l
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; . Z' l# w! w$ w$ f
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, E: p* K- g6 }9 @" J, L 1 Z3 G4 K4 m2 X! Y8 c
//RESETn,L138_SHK21 G8 _# m& B3 |% g; W* r
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); / T2 O5 U* l. a
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
; f: V( v# C1 k0 N7 U writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) `) @% C6 K) D: c" P$ J
$ y$ `6 p9 b5 y- }+ y: t / o. o, _% J4 |, Z# j
//SPCR Register, p0 b1 q& v3 B/ O
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
; a/ u; S2 t9 ?) w% z8 F3 e( d temp = 0x03000000;//(DLB=0): m' O- P$ m1 j* Y- m
// temp = 0x03008000;//(DLB=1)
) s) L0 w: G% G$ N writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
, ?9 s7 F! @, {3 @ temp = readl(IO_ADDRESS(SPCR_ADDR));5 X/ U0 p& U2 g
printk("temp=%x\n",temp);) M `+ d' p4 U& I/ e& A6 O7 N
- X- }+ q" \5 H- _; P& g4 H //PCR Register+ @& w$ @: `+ \8 l
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 G0 h$ k4 P* n' _+ ^$ F! Y
// temp = 0x00000F0F;
% p* ]7 T% o3 F+ b, V temp = 0x00000B0F;1 y/ Z7 ]% ^8 p: P4 A& F- D- c
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
+ D( x4 U( a0 n0 U. ? temp = readl(IO_ADDRESS(PCR_ADDR));
* A7 b. F8 f2 j1 M% @ printk("temp=%x\n",temp);
, N2 l( |4 b8 i8 E) l //SRGR Register, B- Y3 s- m6 E4 a1 x1 O8 s
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: y' J5 U0 c6 E* M$ m- |1 s' e //temp = 0x301F000B;* T" z8 k k. B( u3 |" x
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 9 W. U# X& w0 e% i. b
temp = readl(IO_ADDRESS(SRGR_ADDR));
( j! N* A6 p: n \ printk("temp=%x\n",temp);
, D F2 a) ?3 ^, d& g //RCR
7 G l% a$ Q+ \" e7 _ //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
3 I8 C: M! l( l) D //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-04 Q/ R6 P' v; {& j
temp = 0x00440040;6 Y; P9 Q( d; v+ c' [4 O
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
9 f( [5 c- I% h temp = readl(IO_ADDRESS(RCR_ADDR));! [. c# s" @( r( y9 [! t
printk("temp=%x\n",temp);) @6 `: r- t9 q$ \3 E3 | e
//XCR+ ?4 I) N J0 E; J" a$ t _
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1 L( p2 ~8 Y9 n8 P. E, q$ }: [7 ?2 W3 y
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
5 ?9 u I0 k2 c3 k7 _ temp = 0x00440040;- R# S# r/ O( g. A& Y
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
0 \& t" F; M4 E temp = readl(IO_ADDRESS(XCR_ADDR));
( I& I3 [4 q/ z, V6 I printk("temp=%x\n",temp);- ?9 }" W8 I' M! ]3 c! y6 H$ A
udelay(100);
& G$ |# m/ V8 P" r. _0 J //SPCR Register
& f/ t7 S1 P6 n. _4 a //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
# s/ Q) y; p( J, A temp = 0x03C10001; //DLB = 0 VS DLB = 14 m8 X1 A8 x3 @
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled2 ` S( j# b* C& q, d9 v R4 l
temp = readl(IO_ADDRESS(SPCR_ADDR));
8 T j6 @: D. r5 P9 L% A0 R printk("temp=%x\n",temp);) O- t( M" \4 l) }0 e
udelay(100);2 t, V: i3 g/ i
5 N. |; m9 [7 J% h
//set GPIO direction
0 b/ N, |% ?9 `- i$ \( z/ t) v temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 E) \5 x: Q( f' W/ E8 }& l+ [9 k temp = temp | 0x00000100;//EPR----input
- h! _) N& Y( i# v5 `6 H& M temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" f! ~! t7 g0 @5 J
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ( M0 G5 W ?3 l
! }4 x2 G. R( s
return 0;" b: c- q& w; R7 Y! I1 e
}
9 q8 b; T7 s" s. D% b& Kstatic void __exit MCBSP_exit(void)
! i5 r7 U# \0 k" l0 v% H3 u N{
2 T5 |. M$ @& ^4 k/ B' o4 ^ Q* W printk("mcbsp chrdev exit!\n");
/ j @: s7 }8 D: q" T& _ cdev_del(mcbsp_cdev);
8 I4 S T3 x7 |3 u) n" d/ A unregister_chrdev_region(mcbsp_dev,count);( s' |7 K6 l. E
device_destroy(mcbsp_class,mcbsp_dev);/ O8 M" W) A1 a6 M, u
class_destroy(mcbsp_class);
, {+ p/ f( d& W3 m7 c}
! X7 ~+ e* r$ y) d8 Imodule_init(MCBSP_init);
4 Q$ D+ j3 V7 _% a4 e) S z pmodule_exit(MCBSP_exit);/ U/ Z$ V0 J) N1 {, `
1 \/ `0 R, n) l" A. r
MODULE_LICENSE("GPL");) \% k$ T& p* y7 p h) j7 c$ \6 [
# S) m3 W2 {3 a4 @* O! T+ J
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。' h1 p9 H2 H0 p
我的应用层的测试程序如下
5 `" a8 j3 z# d4 ~#include <stdio.h>: b) }( P0 r7 h+ Z0 z% R5 f4 }
#include <string.h>
3 k2 B; t# [/ V8 j4 A#include <fcntl.h>
6 q/ O3 X5 U6 J+ @+ B# ]: L$ D#include <unistd.h>4 P( m7 ]2 v- k/ f% t
#include <signal.h>
# m- e( M1 j7 m- S#include <pthread.h> //线程
, ^0 q" X' s/ m [8 M: |#include <stdlib.h>) a+ h: J8 g9 O2 @5 L I& W
#include <pcap.h> //捕获网口数据
+ S- G9 A: S# J- E+ o#include <semaphore.h> //信号) x$ @1 O$ ^* T- G7 g4 h
#include <sys/types.h> //消息对列
6 z; s% ]! B# v' m' `0 d, ?0 [#include <sys/ipc.h> //消息队列
A) \- V9 D6 ?4 p. a#include <sys/msg.h> //消息队列
& L$ d9 \! [& ~, M# P) `/ X#include <sys/select.h>" k/ T8 Z) v" V% x
#include <sys/syscall.h>. t$ T; T' L! X3 B6 g0 A; u- t, r7 C
#include <sys/stat.h>3 B/ S% J1 c8 M0 J4 J5 a8 y' r
#include <sys/mman.h>
4 S1 p, K; ^# E#define msleep(x) usleep(1000*x)5 K" ^$ C$ Y5 p7 ^% q3 d
5 X2 S/ r" U. }! c# c) r
int main()
3 @* l& |. o9 C3 [& E{
' y5 Q' d) H) @9 r/ D( r9 A! P4 D- u //MCBSP,ARM与AMBE2000交互设备
" }3 @( c5 t$ y5 ~3 M: S6 T3 l int fd;
% m8 y4 g4 M, B9 ?1 s/ x" R* r% B unsigned short data_write = 0x5555;
2 L: C3 P) J: w! K O unsigned short data_read = 0x00;
' Q/ h. C+ M9 K2 d- o fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);7 H+ J# a5 ]8 B
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);3 r+ A6 A" s2 u2 b- |
2 l2 ^: G% J) W# M if(fd < 0)6 Z2 N g/ n! p
{
2 N1 \. t9 `3 V0 @' I( \; z8 a- c perror("open failed\n");
; e6 V) k% u9 x* f0 [ return -1; m" c) ]3 V B3 n
}" @2 C% t4 }2 M5 O/ I
~/ g0 N1 r. _6 D
while(1)
- P) M {9 K3 ~+ y- Q4 I: K {/ O3 l7 a B" t% T3 d/ [; S
/ }; d/ T4 U! ?* x
//AMBE2000每次读写是24个字为一帧
% k/ C2 V5 U% @3 C5 [ //写数据时将数据在底层存储起来,等到中断的时候再发送3 \' W( ]; n% d& v+ T2 ^, G% Z( f
//AMBE2000输入数据是以0x13EC开头的
0 y0 U9 ~; b( Z% i7 `2 e write(fd,&data_write,sizeof(unsigned short));
2 t; h7 P+ R7 H( ?6 L* `2 D
2 E9 s: Y2 m8 z$ N7 @ //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
" n4 Y5 l+ e7 V1 @; I read(fd,&data_read,sizeof(unsigned short));
! m3 e a7 X. D; \" P. ]* ^ ) X( b, \( n, o0 v5 H9 Y# k
if(data_read == 0x13Ec)
# q( d2 g: x/ s& C% w2 l! X1 h9 s, R {% l% K* |6 i: N. j9 |
9 v8 F2 U& {6 g! D8 b printf("data_read = %x\n",data_read); A( {5 t; w, h4 f" J. P
}0 H8 x) E4 l" f' a! M
) b4 J! {+ F3 N: u
msleep(10);) E. s9 P! T* e2 ]$ [1 c
& G1 v: `6 l) Y4 v1 a7 x; A
/*
% i2 h: I9 |* w( n7 ] j ioctl(fd,1);
- p5 D) Y7 o2 j4 N$ D sleep(1);+ y% R7 t# q& y8 t" E" s$ d( b
ioctl(fd,0);9 F/ V# r ~4 }* x) u/ A/ j
sleep(1);
" z/ L. [3 ^* @$ ^5 e7 Y */
, W3 `9 z( p& q0 E& s q }
( h% D4 a4 _/ A$ K return 0;, w& R+ n: N$ S: |1 z
% k0 p2 b% w* N' d. @
}
. @" y" O, D! [2 `2 Y4 b3 W* n% P5 U
多谢各位指教,谢谢! 急
9 ]+ h0 F! p+ v0 S1 ~3 R5 y' J! F. `1 d
8 N* }1 ?9 v& P3 m5 f. D W
' R, V$ `: Q5 v2 n- b; ]
" |- ^3 p* E: q, t/ Y7 P6 q# ?
; O, A' p& y3 D, l m/ s
|
|