|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 0 j% I3 T& _- b' }4 A z
/*+ [( r4 E V2 E, m1 R# E! B
* Copyright (C) 2009 Texas Instruments Inc( _8 L7 R& R7 c8 R- N
*+ a0 H+ P4 u6 ?3 W; m2 Q# G
* This program is free software; you can redistribute it and/or modify
' R# [, U" q1 J) ], K& \ * it under the terms of the GNU General Public License as published by( t& C# Z8 k* T+ r' v; x( b3 W' l9 ^
* the Free Software Foundation; either version 2 of the License, or2 T% h9 M" t1 Z5 j2 `
* (at your option)any later version.
* e$ Q% C7 C) k2 {- W *
4 m+ R2 g% M4 B9 b' h * This program is distributed in the hope that it will be useful,$ W( L C4 u0 L. h% c, ^
* but WITHOUT ANY WARRANTY; without even the implied warranty of! |% X' C" w; c
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 I9 \( z+ x* g& G& R8 L Z * GNU General Public License for more details.4 d) g* p5 J) Q- Y
*) f/ C% [2 N% y
* You should have received a copy of the GNU General Public License; C; c0 I) g! b$ X5 y: Z) Q
* along with this program; if not, write to the Free Software
! p# `# m( f0 H; x * Foundati
8 n2 P+ T" \1 P7 P7 m*/1 ]( I( s9 L* f7 t/ M0 H( y+ Q! h
#include <linux/module.h>- l7 U' M# A1 B
#include <linux/init.h>
% t* {% ^4 f9 e6 [ H#include <linux/errno.h>
- d% P: T' K1 ^: X5 A( W( b#include <linux/types.h>$ S$ e; w- o# R
#include <linux/interrupt.h>" B [) K% E3 R" y3 Y) L! i. @
#include <linux/io.h>
) B, @: l; r" m/ C#include <linux/sysctl.h>% i- P" ?# _1 h! [. d& s" V
#include <linux/mm.h>( l$ [! m0 _! Z
#include <linux/delay.h>
c: c6 @% s/ W5 f9 `#include<linux/kernel.h>
( V. x5 W" @3 c! G#include<linux/fs.h>
4 W5 y9 C0 p2 ]- K0 G! h( i* H u#include<linux/ioctl.h>
7 e5 v$ h- V* `) f/ ~# c#include<linux/cdev.h>
0 j2 W$ N1 ]9 R P; i9 |#include<linux/kdev_t.h>( u. B4 e+ n+ Y3 E" z- `
#include<linux/gpio.h>
9 j9 D3 C4 r5 j" G#include <mach/hardware.h>9 f3 `. s% S8 t9 L, b8 ]! p1 H. E2 p
#include <mach/irqs.h>
' ~5 V* U% \) G3 Q: |
( L- y2 h- D: v; A& |5 z, `, M#include <asm/mach-types.h>
- Y# b+ m$ E, y0 M$ P/ |- ~% p#include <asm/mach/arch.h>/ |! B6 L7 R1 a
#include <mach/da8xx.h>$ c5 b: j6 w) d& D" Y+ b- J
#define SYSCFG_BASE 0x01c140006 a( z9 w5 y5 ~' y* Q; F
#define PINMUX1_OFFSET 0x124
$ F- X+ X2 X& [9 f( g) w$ v#define PINMUX18_OFFSET 0x168 & P" V5 u+ U) A N
#define PINMUX19_OFFSET 0x16c
% v: u* g# F. c6 d. o7 P#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR4 E6 S& \) A% l+ W
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR* v0 J6 T3 U' M4 {# b0 m `- W- G
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR6 X7 A6 \) f0 {7 j% [! c8 m
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR& q* X5 v. r- k: G. ]
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR. H( }6 F X! ]6 S& k/ @5 M! d
% _! U' b. q) w" e% V2 l" Q$ z8 K#define DXR_ADDR 0x01D11004 //MCBSP1_DXR% G1 Y, u" ~! p# K, o. |
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
; c5 f$ ?& X# n( n2 C% t- }//PSC
2 f1 `" q" `9 f' `8 _4 J( }% y#define PTCMD_ADDR 0x01E27120
: D: c7 m! Y. O7 d! y#define MDCTL15_ADDR 0x01E27A3C
, D) \6 y7 C8 g; O n#define PDCTL1_ADDR 0x01E27304% s9 K+ d" _2 [
//GPIO8 direction7 h, h# _ e+ l/ B) t- `8 s& u9 Z$ n
#define GPIO8_DIRECT 0x01E260B07 \1 n+ x% k7 L, i3 l2 B
#define GPIO8_OUT 0x01E260B4% _1 F! _5 F/ v- Q
#define GPIO8_IN 0x01E260C0
- v( j9 w% z5 T D o$ L1 Y/ ~# r% l+ [/ ?# x- W( E
//#define MCBSP1_RINT 99
9 h; } \* L1 ?//#define MCBSP1_XINT 100
9 I+ u5 _- D0 E: y" ?# lstatic int MCBSP_MAJOR=239;
1 ?# U1 ?: O7 v* ?' Estatic int MCBSP_MINOR=0;+ p( A2 I: R, G! }$ r9 @& n
static int count =1;
1 |- h6 o1 {" @ s3 c" n
0 l* m$ b7 {; @& f# [! q#define MCBSP_NAME "MCBSP-device"
% L4 H) B. \2 d& r& W+ ^& r4 p4 v/ w! r K) D/ Q! m
static struct cdev *mcbsp_cdev;
; X9 ?8 J, C- S: Rstatic struct class *mcbsp_class;
' z+ F) c) M% W7 a: Qstatic dev_t mcbsp_dev;4 t4 R+ M9 o9 M# g6 t/ M* }+ A
unsigned int DRR_data;& ^9 H0 L- L2 {+ p
unsigned int DXR_data;
/ e3 j% j6 ?! {: x* Vstatic int mcbsp_open(struct inode *inode,struct file *file)
; s2 ^! z& C% V4 W" l1 f6 S' |- E! h{
1 Z; M- |( [* p1 V- o 1 @. t4 L9 U. M+ B
//interrupt enable,initialized, I; u! J% _+ u. Q6 b9 ?
unsigned int temp;0 T6 ?: j+ b- }$ r7 b: U7 J* g
//SLEEP_EN(GPIO8[10])---0. d- }- Y, ^4 b' z
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% \! T [: M3 S% |0 N1 q temp=temp&(~0x00000400);
4 [" s8 P' C9 ?7 i% i __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]& G0 @; R# `/ S3 [
//RESETn(GPIO8[8])----0----10 F3 i# [' b5 C# O4 S
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- i! w- f$ J6 [. w temp=temp&(~0x00000100);. Z- a+ l+ v3 A# l" R1 Q
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
~. x" E, D9 | udelay(100);
1 X4 L& e5 I" T$ P! E( u temp=temp| 0x00000100;
& E; ]) s: ~; ^ |' I$ B( U* ] __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 Q& T5 x! [& j5 [
udelay(100);' D- G, Q4 B' N/ }& d; x
printk("open success!\n");
0 w" l: m/ I! w) G& w+ F return 0;
( a5 I7 g+ C2 t1 P}5 g* U/ j: E- q" H0 Z6 r
5 ^& M* [1 i+ P# } ?& @( p: \static int mcbsp_release(struct inode *inode,struct file *file)! L8 S6 T- l- g0 D4 o# P! R9 K) {- W
{
' F! p8 y8 F3 s; O3 x% J printk("release success!\n");
, E! ^4 n; }0 v$ F4 L$ f return 0;/ ]% D7 s% J+ p* }
}$ B5 c) x2 b* W5 I$ q
1 N0 f* ]5 {3 N( X* R& s8 istatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
5 r3 h( V c) k1 Z) I{1 Y+ R- E2 n8 K+ Q- v$ |7 b; |- c
copy_from_user(&DXR_data,buf,len);1 `9 q' h% e2 |. v4 v
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); + e& ^/ O0 f' {; ~& R# m. V
return 0;
/ N6 b- U% ^3 u! x% B ( v5 y- x' i! c6 e* j# ^
}: P* E) E3 }- G8 o6 o
# i# @. H+ Z" q1 o: i R
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
" n% i5 T& |7 X" A. M6 l! J{
* B% X% M! w3 v& i: ?3 _/ K DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
9 g* d9 U! I+ J8 _6 P" a' l copy_to_user(buf,&DRR_data,len);
. h( I( a& _7 i3 W return 0;
$ N% K) f( v0 a+ z& c" c% G4 k}
' K& F( P. ]4 F3 B& q" D, q
. Q/ a. B' g9 D
+ \8 L# h+ z/ e5 W( r3 _static struct file_operations mcbsp_fops=
0 w; t- D. j# b+ b{% J! P5 S1 d; ?, y5 \# _( g
.owner=THIS_MODULE,
/ D) ]' W, J# b# \$ P .open=mcbsp_open,
5 b* G0 E5 {# F, b6 L .release=mcbsp_release,
5 K0 @$ o1 f' V/ D* y4 W .write=mcbsp_write,6 r4 |! U- h% J4 [! ^, |
.read=mcbsp_read,5 m6 B/ J" c3 {4 ?" H
};
4 o: i. `& A$ E9 w, Z% V% w$ Dstatic int __init MCBSP_init(void); h+ H! p2 d# M, @+ v. }
{
+ l" o7 E9 H; M( T int ret;/ b: ^& B. @5 X2 j7 P/ S
unsigned int PINMUX1_REG_old;5 D: ~, e& e' t0 P/ h
unsigned int PINMUX18_REG_old;! z" u9 Y1 U' Y6 @( E
unsigned int PINMUX19_REG_old;
# s/ q3 M" _" K. [1 Q9 S3 I! M unsigned int temp;
. T0 ?+ [) G1 d( L5 W if(MCBSP_MAJOR)
8 X/ P) b M* K2 m {
+ K% e. z' S' H& ] Q) @6 B3 ] mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
t) g; M1 U H* ~. { ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
6 ]+ x0 Q4 ?% P) q/ }2 Z$ B3 I, O$ p }6 O% Z) X1 a4 M! g' o9 r) h
else6 l2 K3 D) C, a! x
{; |, A, U" j2 f
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
8 e' b/ j8 ^% q k& G {$ g MCBSP_MAJOR=MAJOR(mcbsp_dev);
: T$ Q7 @/ l8 p6 ~- D }
1 F6 B* w8 M8 A2 ?" w6 w4 {
4 P7 d# O5 q* e( M1 K* u if(ret<0)3 {; A/ ]1 S- P3 k0 f
{
# d( l" K( H+ W1 ]0 W- X printk(KERN_ERR "register chrdev fail!");5 d2 \( E! b1 ?3 Z3 ~ G2 v2 F
return -1;$ J, {4 J, R u ?8 S; D
}
/ I" [% Y+ y- K8 L5 c' P1 Z3 @ 3 T; P3 H- ?: g& P6 J
mcbsp_cdev=cdev_alloc();
; @& A' D5 o! L0 S, q
: t8 Q6 T7 |5 L* ^% y8 ~ if(mcbsp_cdev!=NULL)
( J) G) ~2 E& G- s4 B) { {
% q) Z. c! _+ l9 X8 l1 X! |5 N cdev_init(mcbsp_cdev,&mcbsp_fops);
% f3 ?8 c; C/ ]3 v: p" r mcbsp_cdev->ops=&mcbsp_fops;
( J0 x% R" \3 z, u# v2 P- i( L, |6 v mcbsp_cdev->owner=THIS_MODULE;9 _7 H& D6 `7 ^0 W5 k/ G2 V# s
/ A6 k; g2 M8 Y if(cdev_add(mcbsp_cdev,mcbsp_dev,count))/ D/ O: Y5 T; M/ d* u- J
printk(KERN_ERR "register cdev fail!");6 A9 v: s3 b' g. l& X1 p/ T9 t$ }8 V
else5 K6 z( @4 [6 z& j4 U2 _4 O
printk(KERN_ERR "register success!\n");
' K* e- Q# [# h }: g/ j5 f1 V( K v
else
" s _' S7 p5 F {
# y( T, `7 k! c8 F$ a" D printk(KERN_ERR "register cdev err!");
/ J3 F/ E" g# ?" [8 z* h; | k return -1;
( G% `. Z7 I9 T& l$ E" ` }' U% t. g1 c) I! \( G/ T: ~9 H
9 C% M6 ^, r! t3 _# Q4 G
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 b) p/ d- `8 [ if(IS_ERR(mcbsp_class)) y& t7 a) U$ _" @$ j
{% J* _% X1 e' e" Q& U( o
printk(KERN_ERR "register class err!");8 C# o% U6 M3 o! w8 ]
return -1;- g* t8 F( `$ G: S+ {& c
}% R$ P$ ~ ^/ y& z* v5 b* E# ~
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
. j" W- F; n+ q/ ]3 V/ W$ `' V. K4 k# u7 w1 a% |2 |& W
//PSC. N, I2 r% T! y' r
//add Enable MCBSP
4 _" l' j. F0 F" o& e3 A! } //test+ t1 R( X. h" a' a7 T
temp = 0x80000003;
f6 i5 {( k9 a k/ I3 e writel(temp, IO_ADDRESS(MDCTL15_ADDR));0 `! _1 U2 J( x- M. R
temp = 0x00000003;* d# T4 l3 |0 I% X$ v7 B1 E
writel(temp, IO_ADDRESS(PTCMD_ADDR));
' w; l' O" K( g- p1 R. O * B; G4 L: Q5 u+ Q) i
temp = 0x001FF201;) U) p% [9 }( U2 Y1 r" M) e
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 X% C5 {( N1 L5 r4 D( b h( P , n2 q* F% i! y; `3 _; f
//PINMUX - E* }1 R3 M( m, h$ |# N$ q& p y- ?
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
$ k' z2 e* D, R4 c1 c; c/ ^1 y PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); $ T) h7 A* ]5 D
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
7 u. n) b$ B( L: \; z/ o# D- }/ w4 V$ \ writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);5 g* @6 _6 F. T7 c/ T5 L
4 W. w3 R/ z1 J" u% u //SLEEP_EN,EPR,L138_SHK1,L138_RC
5 c T( \( d# b$ c$ B/ s PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% q) T( ?3 D+ M$ | PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ; ?; v5 }6 D8 w+ C
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);3 g5 w D3 D; w: @) d. F
( v6 [/ k. e3 A5 b1 n6 J
//RESETn,L138_SHK2
4 B6 U8 b. q: Q) |& c9 U2 U PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); , F& s. Z& a# v7 g
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
7 L) |7 |# ~3 L& @& b, z) J writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
6 J' I# @( D* j4 V ]/ L! e0 H3 h
2 j( @0 d7 s! Y //SPCR Register
: l; T, W2 x; y: t //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 b. s5 j& h: d3 w9 w# ~- _4 O temp = 0x03000000;//(DLB=0)- R& X! ^- P' e [, f. R4 x$ I
// temp = 0x03008000;//(DLB=1)
- B' h- s6 x. D5 A& A$ C writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
# H9 x. F9 O; C& Z3 c, P temp = readl(IO_ADDRESS(SPCR_ADDR));3 G" }& x0 g( ]5 g o4 S" m4 `
printk("temp=%x\n",temp);- ~! g# x5 Z6 W
" [$ }( x8 C* S' D! ]! y, u8 ~7 ` //PCR Register
! @# y2 n2 p" B1 U* R# [% M //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ S( h. b& v2 [( F" q4 g
// temp = 0x00000F0F;! n- Q* {' w1 a1 O: ~* q
temp = 0x00000B0F;
- w0 y8 @7 ]; T4 Y6 } writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
8 u( u3 p& U# g: `, U temp = readl(IO_ADDRESS(PCR_ADDR));1 t; `& n5 e( R/ c! I
printk("temp=%x\n",temp); ( w$ M+ H' l/ |7 \ M" ~
//SRGR Register
+ V9 E# `3 S( M. x( ]0 J* ~ //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
( b8 @. R3 {9 ~" Z# u1 @9 |6 |; ]; X //temp = 0x301F000B;- |2 v8 F$ X0 e+ i8 K4 f& s$ b* N0 z E' F
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
; m5 @+ ?) ^" P$ N1 ~" i temp = readl(IO_ADDRESS(SRGR_ADDR));
8 c# [, l5 C- A* ~( W+ k6 Y8 D printk("temp=%x\n",temp);
% a9 g( a& i( x$ U4 Y# C" z% ^2 C //RCR
( i! g! D, K7 W, Y' ] //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1," W# o9 _1 B6 ^ q4 D
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0- l, p$ D7 M: `) B2 ?
temp = 0x00440040;8 w# f: @1 N4 U( i9 @) M# I
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
8 P) c7 z. y: z' f6 @ temp = readl(IO_ADDRESS(RCR_ADDR));
0 {$ F6 X4 v6 O2 A1 _ printk("temp=%x\n",temp);
3 Z. c0 _, S; Q7 r- D4 s% k3 D7 u //XCR
+ w* `$ s& U3 t' i- a7 I //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
; J- n8 F Q& V' C } //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0: M) _9 q, q; n) W# U
temp = 0x00440040;% ?) g/ {: Z$ c' [" d3 D
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized % ]+ w# k9 O# Q% m" o) R
temp = readl(IO_ADDRESS(XCR_ADDR));
: ^4 L+ t: f7 x9 s3 W! s! x% a' A7 ^' l printk("temp=%x\n",temp);
8 H* R7 H4 x& @" U0 a- x udelay(100);
, A1 [ d" i7 H3 O# C6 P, H8 o2 S //SPCR Register# r( p* |4 e9 W* M' F6 Q; X
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-17 x6 _3 h2 o2 ?0 X' y' w% w1 f
temp = 0x03C10001; //DLB = 0 VS DLB = 1
& e. b6 f) P8 ^* t# D8 T writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled9 l& H3 E$ @* q
temp = readl(IO_ADDRESS(SPCR_ADDR));8 R: `6 Y, j4 M5 @9 E, H, {
printk("temp=%x\n",temp);( I' I7 D0 X3 t; y, i, w
udelay(100);
6 y1 P5 w" w4 o8 k! G& v" |7 a$ S s7 E x7 ~& J8 _
//set GPIO direction
9 K8 N" W' Y; f: h t I* @ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));" d+ r: }: G) G! B! {
temp = temp | 0x00000100;//EPR----input
, p% ^7 p; P0 {4 j- q/ | temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 K) q. c4 D9 G" \( X* q7 ] __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& |: k" Z$ ?8 s0 O3 o
3 s+ j1 ?5 o& D- K+ i2 ?) T1 s return 0;, T8 F- \) h0 s( m- N
}" v. B. H5 x( |$ C
static void __exit MCBSP_exit(void)
$ U+ C N) l% J+ d/ R{
/ ]1 N! S% X5 t# \/ S$ z printk("mcbsp chrdev exit!\n");
, P( ^4 l) P6 g cdev_del(mcbsp_cdev);, {6 U& P7 K9 {. @+ h+ u
unregister_chrdev_region(mcbsp_dev,count);+ h l, L6 X* o
device_destroy(mcbsp_class,mcbsp_dev);+ V% O' o; S3 E* j0 s* b
class_destroy(mcbsp_class);: X' l( J3 [$ k
}* I: J3 k2 S0 M6 r9 X0 D
module_init(MCBSP_init);
8 c3 h3 }7 z5 o* _$ w1 I8 L% `! Jmodule_exit(MCBSP_exit);; m' L O8 K. U7 q, g" R
+ _ L# ~6 s& Y. i2 Z0 N8 oMODULE_LICENSE("GPL");& p" a) q/ y* r7 ?3 x4 t
* h& X+ V. y# D- j1 B: |' ]! ]我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
/ n/ {3 N+ d, ~8 D我的应用层的测试程序如下
' z( H5 j0 d# u9 n4 E" _#include <stdio.h>' S* |$ v' ]+ ]+ M2 k3 V% H+ d. ?
#include <string.h>) L! p3 E6 h' ~
#include <fcntl.h>- m- B) n" t* y/ R
#include <unistd.h>; ^ K8 l( L- R; l$ R5 J
#include <signal.h>
_, R. H: n; [$ M#include <pthread.h> //线程
6 v, M, O5 h* d0 N#include <stdlib.h>7 R: L* Q) a, V3 t
#include <pcap.h> //捕获网口数据' \6 a* _6 ^8 u7 y
#include <semaphore.h> //信号
! } ^# |9 c$ Q4 ?#include <sys/types.h> //消息对列
6 O _+ C$ h0 L& M, R7 s s#include <sys/ipc.h> //消息队列" c" k8 E! q: x6 Z7 [( w
#include <sys/msg.h> //消息队列
6 Z2 o3 K q) P$ {#include <sys/select.h>. a# S2 H5 v: R+ F
#include <sys/syscall.h>2 J r$ \) F) t0 D# G, D
#include <sys/stat.h>
7 h9 [0 b3 U/ b; V#include <sys/mman.h>; m2 u0 [1 b) H/ Y+ C$ J4 Z
#define msleep(x) usleep(1000*x)( l: J, r* g2 E
8 B; L9 i6 T1 } R4 D- J4 {/ {, zint main()
# i5 v, w+ K+ n{
* I1 I/ N& k9 P* ] //MCBSP,ARM与AMBE2000交互设备* F- ]5 e2 N$ @! ~% h$ B! B1 x9 l
int fd;3 h- l. j& k7 |
unsigned short data_write = 0x5555;2 T, w7 X9 C$ O q1 [# k
unsigned short data_read = 0x00;
?, `& v ~! ]) \: [" q" B9 F: a fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
# `2 _/ P+ J% c2 }9 f0 q( g // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);0 ^2 L5 k+ O( p
: c5 f+ ^1 U( I if(fd < 0)
' e3 Z* ~- t/ W {
- ]1 _! R& {+ o' L- R z perror("open failed\n");6 V. | {5 e; o. V n
return -1;& m( O) M9 N) [' G
}
0 e2 P4 D% R1 b9 K $ i' `' ^ g1 K; f
while(1)/ E; B+ ?5 x" m- D0 l
{& A) B$ ^5 t) Z, y
. g- r( Z. T/ A7 ~/ E$ H2 Z. O //AMBE2000每次读写是24个字为一帧9 c4 k% o' h' W" y$ O
//写数据时将数据在底层存储起来,等到中断的时候再发送& L% e4 }/ g' W
//AMBE2000输入数据是以0x13EC开头的) h, Z" O% o5 j
write(fd,&data_write,sizeof(unsigned short));* h! L$ M: f3 O" z4 N
+ s8 D0 W* ^6 I3 {, Z6 h //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 1 z/ E6 B# s/ N
read(fd,&data_read,sizeof(unsigned short));0 M- G" R6 O( ~! |+ n
" V) P& t6 z- q* W S t if(data_read == 0x13Ec)+ y5 s3 Z: Y4 w( {3 v8 L
{
5 i$ {) ^9 `! D& g9 S2 j W # C8 E! S4 h- Y: S( X3 ?
printf("data_read = %x\n",data_read);
2 y3 g! r' B) W" p' G4 ~* C }
4 E8 B% f6 k& p$ {: \ " h4 i2 m& l6 h! ?+ m$ ]0 b
msleep(10);
0 d3 H/ C, m' s% s/ \5 {5 Z : x2 @6 U6 y, ]8 E
/*4 i6 T0 F6 A. j h
ioctl(fd,1);
" l0 `2 C- A& Q6 b- ~4 D sleep(1);% y, R5 S6 S# M, F- T l, K; ~" L. @
ioctl(fd,0);
2 N: ^' ]4 n* o; x3 u& |8 W sleep(1);
% J" n3 R4 I7 k0 U# T& I */
! H! R% E# I# G5 t G$ ?& x }
: m# n8 Y% {0 L |, p( p8 } return 0;
3 ~+ w$ \/ u7 F& O
2 C) ~% V8 B# n1 ~( T}( U( E1 ?" {1 [0 u3 z
+ n+ M/ @$ y4 S; S w" E多谢各位指教,谢谢! 急. R' e0 H+ F, Z& E/ W% |
, G v" R+ U# ?- m u: F5 o; U
/ ~% N/ g: b2 H4 P& \! }1 N3 i2 t( u
4 }2 o" r& r0 h. H) H1 U, z0 @6 k o5 l; h" H
+ I+ N: s/ M+ ?8 x }: p |
|