|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
' B2 j+ L2 ]# v n/*7 T k9 o- u' W$ ~. S7 d& r: I
* Copyright (C) 2009 Texas Instruments Inc
( Q2 ~! Q- @) j; b& V *
. W4 ]7 ?2 ` Y/ A# N- [ * This program is free software; you can redistribute it and/or modify4 q+ @/ ^6 e" A0 j
* it under the terms of the GNU General Public License as published by
1 i, U4 e% l! _+ m+ G) A * the Free Software Foundation; either version 2 of the License, or
$ h8 ]; K7 |- P: \" o * (at your option)any later version.: w8 Q- c4 \& }0 y/ W) r) L
*/ e, t$ m( ~7 G {0 }. G
* This program is distributed in the hope that it will be useful,. ^" I) e* `, K* {) c
* but WITHOUT ANY WARRANTY; without even the implied warranty of
/ X' U9 r8 n- ~9 g3 [. H# d * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1 o: J# H# t6 K2 Q$ }& F8 G * GNU General Public License for more details.; g" ]: i( S! K- `& W
*
# m! Y( s0 I% o# l * You should have received a copy of the GNU General Public License
0 J' S+ O$ T3 r8 n, j * along with this program; if not, write to the Free Software Q8 X+ T6 n' ]4 z( X2 D3 r# u# z
* Foundati( F: M8 d& M8 T# s- C& x
*/% B' f0 Y/ I$ h0 O
#include <linux/module.h>% s# l$ i3 I- ` a( Q
#include <linux/init.h>" h$ ?8 |+ {' k, R
#include <linux/errno.h>1 X: d/ }+ d& L7 h2 u3 W$ r7 S0 O5 L
#include <linux/types.h>0 C4 Q! s7 i1 l, Z. p
#include <linux/interrupt.h>& `6 M; G8 O; j3 j8 r
#include <linux/io.h>
' a' V4 s7 o* \#include <linux/sysctl.h>
* \7 L! s; v U9 y, w" ~! ?2 O#include <linux/mm.h>
/ [* g; g6 E! b5 T7 |" {: N#include <linux/delay.h>5 l& B j2 T. o. t( D5 j1 W( C: W3 B
#include<linux/kernel.h> m4 }3 z o. [5 j9 L9 U! _/ a( ^0 v
#include<linux/fs.h>* X$ X0 _, F/ _: @2 L/ v+ U
#include<linux/ioctl.h>
: ^( P, E( t6 I% c9 }' S$ `: @#include<linux/cdev.h>
$ Q5 n- q( Y( W/ `#include<linux/kdev_t.h>! ?! `7 A2 H# G, H& g9 B; J
#include<linux/gpio.h>- b R7 M/ n2 ~: \9 w8 d
#include <mach/hardware.h>
% U' O6 S0 q. _6 ~7 k#include <mach/irqs.h>7 j, C( i q/ q# ?( K
5 k3 q3 E% K/ T8 E0 X6 T: c#include <asm/mach-types.h>8 L) u+ ?8 P. b! ]! B
#include <asm/mach/arch.h>$ J+ q- T6 m! |* A2 F* v
#include <mach/da8xx.h>- a6 B% [. x( l. u' W8 h1 X8 D
#define SYSCFG_BASE 0x01c14000
) b8 h" c$ ~$ N4 M9 U#define PINMUX1_OFFSET 0x124 . i+ [" U% g- z5 A) p3 L
#define PINMUX18_OFFSET 0x168
! B% }+ j1 W! p* p# k#define PINMUX19_OFFSET 0x16c7 q9 H7 g- Y+ M/ ]8 C. S
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR% k8 H6 h& ?& p! O: A) h
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
) M! _( L5 Q' f7 y+ y. [, L' `#define XCR_ADDR 0x01D11010 //MCBSP1_XCR3 u4 n( K5 ~1 \$ i9 i) J
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
9 S# S* ?$ n i; Q* _ e#define PCR_ADDR 0x01D11024 //MCBSP1_PCR3 m" d p0 g0 C! @9 x; J4 T% A
$ D9 H" w6 X4 b$ T#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
+ w, f. [' h) ?0 r#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
; P1 G9 C% G0 k//PSC8 I9 }- X2 H; y# v* J4 ?! V
#define PTCMD_ADDR 0x01E27120
7 S; q5 k; ]3 Y7 q- _6 s#define MDCTL15_ADDR 0x01E27A3C7 E0 d# K+ T: a* ^1 ~* M
#define PDCTL1_ADDR 0x01E27304
. g0 z2 H. L! A% E* Q. w0 N//GPIO8 direction- G1 ], _# a! x; U' ~# X) Z7 [5 G1 b
#define GPIO8_DIRECT 0x01E260B0
% [/ w# Q$ n0 A3 I/ r- H+ w#define GPIO8_OUT 0x01E260B4, l2 c2 }) @- Y
#define GPIO8_IN 0x01E260C0
+ b! q4 ]. J& Y. h0 B6 y/ M0 R0 q5 j: ~8 J- I7 q- c0 a% L
//#define MCBSP1_RINT 99
* c, |; |6 |; A4 `$ A//#define MCBSP1_XINT 100
# z3 S7 Y1 U! o+ ustatic int MCBSP_MAJOR=239;9 y9 L, ]5 i6 g& r4 w0 S
static int MCBSP_MINOR=0;
- j( a& k( x8 Tstatic int count =1;3 A# s7 K, ^) i7 I4 \, K' y
0 ~+ n4 P( S. R7 N+ K% U: U: V
#define MCBSP_NAME "MCBSP-device"& \6 H1 X. E3 Y; @* K `
& N4 U9 h" P, astatic struct cdev *mcbsp_cdev;
8 p( R2 _3 n) xstatic struct class *mcbsp_class;/ Q( w7 o1 p) p+ ]- B7 R! r) L, a
static dev_t mcbsp_dev;
' w; b+ P- X. a. N5 F0 n* m* Qunsigned int DRR_data;
/ V1 w5 \# T% V1 ?unsigned int DXR_data;
$ ^7 N: s; [. m* ?4 [" d7 Xstatic int mcbsp_open(struct inode *inode,struct file *file)$ O& O: z9 _1 R$ \# r
{
' `- B: d4 @9 }( }8 F7 ]
1 [8 E. ~0 @* W& ~0 f //interrupt enable,initialized
( f" k+ h D2 ]) n unsigned int temp;. E; f' f6 ~/ Y- J( @ ^' X1 q
//SLEEP_EN(GPIO8[10])---0
. T" w- ^9 K+ C( ] U+ ]7 t0 W) o4 p temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) W# b. r7 U$ V; R6 P4 d; o
temp=temp&(~0x00000400);
/ ? u; s) z, y3 {# W1 v __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]. W: a/ ^* N; Q$ @. D
//RESETn(GPIO8[8])----0----1
5 D/ V* m0 P8 r s7 x3 c3 t1 N2 T temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 e2 o9 l' ?# _
temp=temp&(~0x00000100);
4 o1 y6 m, |6 X, m2 C: C __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0! X4 E9 ~7 j& J8 y E/ f+ y
udelay(100);
' G$ K$ q" y' t temp=temp| 0x00000100;
* _" _! H3 ^: Z2 n __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1' h4 e6 S# J2 S$ R* B
udelay(100);
- P( {% ]/ p+ j C printk("open success!\n");
: x1 o0 F: t; g$ U$ c return 0;
2 U f8 l6 u0 O! p8 Q}$ @7 F+ j! [7 C4 i
- x, E# N; \- t' p% Q5 |/ U: R9 o8 Dstatic int mcbsp_release(struct inode *inode,struct file *file)* [( x/ Y$ r8 Q& V( {
{
# ]9 D/ Q0 k+ P7 h: x: I printk("release success!\n");: {0 y7 p: F. L( L! o/ B
return 0;
0 u0 B! `4 w5 I1 x) v' L}
7 v. W9 g( }1 b8 U/ l7 V8 _- X- D- A! p% {3 o' Z* B9 A
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 c- F1 l3 {: J ~& w9 a( Z{
, j$ H8 Y1 r1 n% j% w/ l; K copy_from_user(&DXR_data,buf,len);: B- w: f- S# ?6 E
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
0 j& ]. V- z, k0 z3 h return 0;. B- X' q2 U5 H* f
, M& T* |1 y! x}: g; s( A! C. B7 m) S, p, |
# D4 t3 h5 t; Astatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% [/ p9 C |$ H/ l/ N6 `$ v{
; o: g- s5 x" |& [ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ k3 u6 f6 ?- a2 S2 n; e; i
copy_to_user(buf,&DRR_data,len); 7 x4 L9 m3 L% I1 J) A
return 0;( k6 ~+ c" k/ b C* n
}4 f- S/ O# K* K j9 g* J4 Y
* v& s2 c& W( ~
2 s& x( Y. P! `7 C
static struct file_operations mcbsp_fops=
5 s- z4 ?) r9 t) |3 U+ @ X{
* e& k J1 o" C: `/ E% @. h .owner=THIS_MODULE,
$ d7 W% b' g+ W5 Z4 t6 i0 f2 l4 n .open=mcbsp_open,
/ y5 ?: \% }; w0 Q* n) L .release=mcbsp_release,- @; b# Z' _/ h j% r
.write=mcbsp_write,
% p5 S. p$ {$ l .read=mcbsp_read,+ _& [$ }0 e) I+ `3 e8 B
};
" B3 Y1 ]1 @% b9 a) lstatic int __init MCBSP_init(void)
6 e) F | a: X) ]. ~{
' [# I6 U6 ~" b. y5 c int ret;
7 k% u1 f& r* P unsigned int PINMUX1_REG_old;
- U* `" Z4 D& v, f" @7 I8 U unsigned int PINMUX18_REG_old;- \3 y {0 s5 H0 R% f
unsigned int PINMUX19_REG_old;& z% x4 q, s9 \6 s) J% H
unsigned int temp; 2 c# M+ e( ^' R, y/ k5 ?
if(MCBSP_MAJOR)& V2 ]9 r% y& ?/ m$ ]) y9 x) J
{3 ]: w2 p- W$ J; `7 W) }6 d
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
1 p" }9 {5 g: \) b4 B- X( Z ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 Y1 b# c% v4 S2 [- [ y& ~
}" {& Z3 A2 Q. p+ Y' i$ o: C
else
" l+ z' x4 J4 G3 ?$ O$ t6 b {
# @ ]6 B* `1 A ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; t& K4 d# M2 G* H MCBSP_MAJOR=MAJOR(mcbsp_dev);
, ?, X5 ?8 m/ N& T. x5 j) F9 A& }: I }/ q# W3 `7 E/ F6 k
. k( |- p: ~( p& M if(ret<0)
7 ]" Y# l& f! C; J3 P l' o" ? {
# O# w. d P: K printk(KERN_ERR "register chrdev fail!");
! V; G2 W q* w4 x0 p" U3 S/ t$ E+ ^4 ` return -1;
1 F$ ]9 f) _0 C; V* s5 ~ }
. x. ^2 W& b' b4 P9 g
& ~8 Q" G/ }% W8 C: c8 X mcbsp_cdev=cdev_alloc();
0 N/ d4 t) C" U0 M8 X" k2 h
0 y! C- \/ d8 ?0 B- R if(mcbsp_cdev!=NULL)
2 z; G& u8 ]) b- A' L# P {- h! w* R+ z# j" U3 y) }2 ^
cdev_init(mcbsp_cdev,&mcbsp_fops);" P8 `7 G! J5 ^ I. ?$ i, ?% j
mcbsp_cdev->ops=&mcbsp_fops;
8 {5 a7 C2 P9 X& {- o- n mcbsp_cdev->owner=THIS_MODULE;+ N! C& S. n' [! W
% h# H" z1 ^ _8 V. _ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) a$ f5 t6 L6 Y. H9 E0 H! I printk(KERN_ERR "register cdev fail!");8 T8 [$ B+ C7 S/ g8 s& E) q
else) c4 c/ P* H' A' B; C3 w* `
printk(KERN_ERR "register success!\n");
8 L p# p O2 ~0 p+ x) t k9 q }( y5 @$ H, R; G" C1 D
else
t5 r6 a$ `) P! u/ t* S {
0 A, n# O5 L( s6 M1 D printk(KERN_ERR "register cdev err!");
! r( J B2 T O% t$ P/ I return -1;
' s. \7 K) Y& B- e/ _* n$ n& \ }
/ _3 D# u& w; H6 \. |2 F1 ~. u" O8 o
. K. a4 {. D1 Z' ?( S7 M mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);8 d. W! w5 X0 `% u: e) @& J* J
if(IS_ERR(mcbsp_class))
$ m/ C" }: J3 _5 Y0 G2 j {3 P3 @% R$ Z. h) N% Y
printk(KERN_ERR "register class err!");
! s! F+ }+ i3 z' N0 w0 K; |# V3 G return -1;
- L8 `/ s. e$ Z4 o2 _7 m }: p' R% K, p) a# P( e) Y7 ^- r$ M
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
! a$ e4 U) I7 T5 x
; S ~2 o- m, S( G) }/ Z //PSC
0 l% G% R2 u9 R! j5 y3 p) r //add Enable MCBSP
# ?. _8 U; {( {" e3 f( H6 i //test- [' g; X: z5 ]+ D! B" v
temp = 0x80000003;$ {5 ^ `% T, S3 }, f$ \3 O
writel(temp, IO_ADDRESS(MDCTL15_ADDR));( b4 F3 C* q2 e% G. T0 K
temp = 0x00000003;1 ?! M- w; ~( }5 [" T/ a; P. b, q
writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 V( c7 `, U7 y! C ! u0 T: c1 t: ~) U% U
temp = 0x001FF201;/ x& R4 [( B) `: O; A2 r" }5 h5 C
writel(temp, IO_ADDRESS(PDCTL1_ADDR));' |+ y1 j0 k& O! }
. J+ Z k/ J" T G0 q
//PINMUX 9 s' z9 l) E" D+ u) C# p; e0 y0 x
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,8 Y' ]! e" ]% o; p" A# [ d
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 2 m* ~3 L( x$ b n4 Y# b# z* }1 O
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; i) J j8 N7 _ A
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);/ {) ?' ]7 ^+ c' W: a
1 _ a+ N5 h3 h5 @- y( {' w7 L //SLEEP_EN,EPR,L138_SHK1,L138_RC2 V8 H8 I+ K4 C) J" e5 Q2 n6 i! |
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' E! h2 ?0 B+ _3 q1 H ~) x) v: w PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
! K1 p/ q' c* G" n6 n writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) J: z$ G' k. j6 p; o. {
! i" [) j( P# U2 ?0 m! O //RESETn,L138_SHK2# F, X4 w0 M/ E l% @
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); o8 V7 b( Q3 ~ R$ q
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
$ J+ R" o& N$ }: e writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 X2 x$ k- e! g* r0 m
4 n0 `9 `' M- L
2 V3 G6 B2 r9 Y2 M8 v \. `& `: u, N //SPCR Register
. _7 E$ a& e, ` x- p- s //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
" V$ j( f8 p. o8 J! p temp = 0x03000000;//(DLB=0)
/ Z% `; K Z& O# B9 B5 @0 g // temp = 0x03008000;//(DLB=1)
5 q2 W$ y& D! |% w% r. \5 F( U writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
3 R# Z, l+ P, d$ }* ~ temp = readl(IO_ADDRESS(SPCR_ADDR));
+ M! T' ~6 u- s: U* D. E7 s printk("temp=%x\n",temp);
7 ]5 R4 g ]* U- A" W, X9 }
9 q+ C0 Y$ i9 c. l //PCR Register
0 k+ Y, B0 o! b s) V //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
0 O( o* q Q7 P g# F8 `+ w$ o // temp = 0x00000F0F;
2 c( O2 d+ t" s temp = 0x00000B0F;4 u4 y2 j2 O, }( n
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
! z7 U# _0 R7 d( M% h$ _+ o temp = readl(IO_ADDRESS(PCR_ADDR));2 Z& t8 k- w" E8 A2 N/ ^
printk("temp=%x\n",temp); 7 y+ b9 `2 [; R% Z O: V
//SRGR Register' Y2 Q1 A' g& C) t5 e+ B3 q6 @, I
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
t, G8 w$ [4 ?6 E4 \4 ~7 V //temp = 0x301F000B;
; V4 z5 O/ \* L writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
, C$ `. P9 M) q! N- L6 K) l temp = readl(IO_ADDRESS(SRGR_ADDR));
' K" \0 \; o/ a* z. b/ x; Q printk("temp=%x\n",temp);
G- P" U4 o+ X3 {2 o6 [9 r //RCR4 N" w' u: o4 E, d. u: ?! ?
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
0 @4 R3 j4 {* O Z //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
% v. _* j5 t+ R5 a8 s temp = 0x00440040;$ i3 y& W0 E& n* d
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized / Y) r, Y* H5 n" F
temp = readl(IO_ADDRESS(RCR_ADDR));
7 m: u# ]% l, P S! j printk("temp=%x\n",temp);/ N: v- ~* W7 f& ]1 Y! ~
//XCR
7 z) d* S+ s2 g$ S //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% i" r4 o9 t" c/ I) [" n9 p/ o
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
6 _+ `3 p7 A3 j temp = 0x00440040;
+ ~8 k0 h) d& \4 h# ]- \! o writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 3 y" J. \4 L- B0 r% o
temp = readl(IO_ADDRESS(XCR_ADDR));+ h' Z9 P# ?9 `% z1 K
printk("temp=%x\n",temp);
# j# ?1 t/ b8 x* y) q- u, G; @7 v( W udelay(100);
) |/ w8 y/ \ ~0 s //SPCR Register3 i( c! V; t* M% I
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1: A0 `1 } i3 L& c# K+ V
temp = 0x03C10001; //DLB = 0 VS DLB = 1
/ @9 f5 A3 V- H* I! k z( z" A! | writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled5 D6 S: y5 D& S9 p8 G% t
temp = readl(IO_ADDRESS(SPCR_ADDR));
# ^' f1 C5 ~3 x+ m; x5 w printk("temp=%x\n",temp); F% F) N! l# i
udelay(100);; g0 H5 a3 _3 b$ `6 Q' H+ @
7 w; R" I: q: X- U9 h7 z
//set GPIO direction
: t. S: K% d, l8 Y temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));, q9 Q3 E: e' P, w- Y
temp = temp | 0x00000100;//EPR----input
0 D6 w( t2 E6 t; e: B temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output% N. E* [: C' p% A
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); % \/ D+ y% y1 m' T0 [
4 z" z+ `6 H5 T) p$ M. e
return 0;# [) v n7 L3 i6 V
}
& x5 o' `$ l7 [# h, R+ Bstatic void __exit MCBSP_exit(void)
% L1 ~' |3 D; h4 [{. Z: |' ?* J% P' F. K
printk("mcbsp chrdev exit!\n"); j( c, S! d! z; f# J+ a# h# K9 b' ~
cdev_del(mcbsp_cdev);. Z% @# z/ [+ R4 Q- ]$ Y; s
unregister_chrdev_region(mcbsp_dev,count);, a0 g+ I; }: ^$ K$ h0 r
device_destroy(mcbsp_class,mcbsp_dev);
" M* p: ]5 b- B3 ~8 ` class_destroy(mcbsp_class);
! ~( C: r8 l. _: Z}
( T* F3 z3 u! V6 t2 E' bmodule_init(MCBSP_init);
0 v0 |) @( u" vmodule_exit(MCBSP_exit);5 d. \0 ?4 l% e
1 P, F: J: I- A; r- EMODULE_LICENSE("GPL");
& g, |2 R! @8 J+ x1 d. ~ A2 f! { c
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。 J v4 W5 R: O
我的应用层的测试程序如下8 k& x" C5 M2 S `5 K8 t
#include <stdio.h># R) U+ ?1 [6 A0 _% P" D6 s Q
#include <string.h>
3 T6 u1 j+ t g6 f3 y& b#include <fcntl.h>
: t! S4 P a/ z#include <unistd.h>
0 d7 X/ m; L8 l0 J# g& {. Q#include <signal.h>
1 e6 v6 }2 {- `& ?8 v#include <pthread.h> //线程7 @! g6 t4 P0 I" c' t1 Q x) h3 g
#include <stdlib.h>: Q4 ~7 B# G$ g0 P8 n9 {
#include <pcap.h> //捕获网口数据# m% A: U e& V2 P2 g
#include <semaphore.h> //信号
, a8 z o$ k1 V4 I! s. t3 u( ]6 r#include <sys/types.h> //消息对列# w0 O; s) W5 Y, B e; I/ X3 d: }
#include <sys/ipc.h> //消息队列
! x$ ?: A* ^$ U5 }/ k#include <sys/msg.h> //消息队列
" f8 h k0 A5 L$ `: d- B5 @9 h5 V+ r#include <sys/select.h>$ @" q3 ~: n+ U& `5 g
#include <sys/syscall.h>
W$ t, p3 m4 x( p#include <sys/stat.h>/ U7 U& L) a+ W0 H$ C; b, x
#include <sys/mman.h> a7 `. |$ C1 K* ~
#define msleep(x) usleep(1000*x)4 C# R- D3 w' A0 e9 c! k# b
, t2 ~2 n, T/ O& ^! m8 p* m% i4 j
int main()
$ P5 }0 S2 h8 R @. Y{ 6 J' s+ M1 j2 ^ y) \% i4 j
//MCBSP,ARM与AMBE2000交互设备
5 Y- c# z2 F) F# @' t1 ]$ f4 | int fd;
7 a/ b3 f9 v! Z0 a unsigned short data_write = 0x5555;+ n" J, r# x( r+ p
unsigned short data_read = 0x00;
; }. u+ ^ q4 I1 B( p+ f3 m fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);' j. K1 r& b! ^) Q; R# v
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ h: i, a) B3 \
* G/ ?. L6 G2 ]. J if(fd < 0)
9 g' c8 x8 {4 l8 E: y {, X q7 O, v1 B* f& ?- C9 w! G
perror("open failed\n");7 R9 V; a7 [0 l+ {" v Z
return -1;
; A8 s0 O8 t" @* e) C }
' ?; [+ z+ F% P7 O + F8 k9 r- ~& J+ U7 q: A
while(1)
2 c+ D( }; Z8 I! u {8 M7 A2 N3 ^/ y: {, I9 a9 m
, f" g2 i: \- \" g: M
//AMBE2000每次读写是24个字为一帧
- \; p: n0 B: F6 b0 N5 I2 x" L# v //写数据时将数据在底层存储起来,等到中断的时候再发送, l2 Q: G4 R* \8 x
//AMBE2000输入数据是以0x13EC开头的
c& E" v* ?7 O, z3 `! C; A write(fd,&data_write,sizeof(unsigned short));
6 q) S% |' S$ Y 4 f% ?3 ]9 @" y \8 ]4 m! U* e1 S
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
. Z3 e u# K, Y read(fd,&data_read,sizeof(unsigned short));
" |. c% J4 c$ I9 U' a2 ]
9 v/ G4 w6 i0 J. W if(data_read == 0x13Ec)
6 [" U3 s+ v8 F' S" c {0 Z) n% N# G: J6 u" ^! l; V2 W
; P; h3 z: h4 i% {/ X; d
printf("data_read = %x\n",data_read);' D' \ x! ~% t9 J/ a) ?! \
}2 b! t) a$ j6 b( ~; y' ]4 `
3 u, b7 ^ M6 \) G3 {
msleep(10);
C1 {$ _, r( h6 z$ A1 j9 q+ I
+ G) x" }4 u1 [3 F7 y; S0 s5 V N /*
* A( w, \$ k: A& J ioctl(fd,1);
: y% M0 |# k1 q- C) X sleep(1);/ p& I% I; y( k) r4 J# y3 i3 `# j
ioctl(fd,0);8 a& W: @* ]4 b8 ^
sleep(1);
" T% \9 }" @+ Q2 C& M7 g/ z! K6 o */
0 B. A7 R) e8 k' k0 ~" u2 V' G }
7 }7 k6 z. M s8 f" \- A" M return 0;
# r: k/ `, f' F3 x. [ $ f6 H( M& |- d1 s/ P$ \3 L: M7 L6 |
}9 u o% v% d9 h& W- X. |
( M e; ~- i' Y! x% {: e
多谢各位指教,谢谢! 急) @9 G4 w7 A: Y8 |- e
7 K* @+ W; s# k$ H! Z: b/ J6 B0 Y
2 B2 I, ~- r: K0 o6 n! u1 A, i; O! `( c! v2 X
& ?8 k# }/ O2 S; P- x3 A: v
" R" A) T# h$ K8 \* l2 f |
|