|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 7 ^% U( j1 m7 F9 _
/*- O4 {5 a: T, A# A0 @. ]
* Copyright (C) 2009 Texas Instruments Inc
- h5 P$ @# d1 ^; U, a' J6 J *7 s3 f6 W0 `2 X) H+ V$ l
* This program is free software; you can redistribute it and/or modify3 I p8 r2 j1 s, F
* it under the terms of the GNU General Public License as published by+ N e$ Q4 q* [3 m7 l# N4 P
* the Free Software Foundation; either version 2 of the License, or& g/ r! G1 r! ^2 u \: m
* (at your option)any later version.
. h& T2 p2 }8 O) O& y0 r# M8 t *
- {9 i# ~% E4 ^: e8 H, _ * This program is distributed in the hope that it will be useful,- s3 V, c V) P6 _
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* h0 O9 i" S4 x9 i * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ p" D8 L. W( w6 h" T7 m. q ?
* GNU General Public License for more details.
2 T) I4 i5 ]/ l *2 s4 L6 Y9 r$ s1 g6 s
* You should have received a copy of the GNU General Public License
i8 S2 k( ^5 a6 G! M* y * along with this program; if not, write to the Free Software2 u/ z& ?5 q9 @" f0 h+ H" M
* Foundati4 w% n$ w$ V( z( c
*/, D6 x9 X' x7 l, s3 j; T
#include <linux/module.h>3 y# v i; U2 T# o% \6 u7 _
#include <linux/init.h>( v5 p3 g3 o& T4 f0 I
#include <linux/errno.h> l( m! J' {' u
#include <linux/types.h>
/ N7 n- @' I: d, F3 O" R#include <linux/interrupt.h>
9 U. b V1 L# v& A- u# Q#include <linux/io.h>
) S; U4 e. t0 n1 \#include <linux/sysctl.h>9 o1 v8 u6 a: W, X0 L7 s- \7 N, o6 u
#include <linux/mm.h>1 R6 V" C B0 T0 f8 V$ u
#include <linux/delay.h>% d' \& }& V& }( t" y
#include<linux/kernel.h>* Y# N! F% X2 c8 y, ]7 Z" \
#include<linux/fs.h>; z% }3 n4 b, L: S
#include<linux/ioctl.h>
+ \2 U8 }. K. B#include<linux/cdev.h># X3 \( Q% R' m
#include<linux/kdev_t.h>7 u# e4 N" A6 K0 R8 f, {8 N' l) w
#include<linux/gpio.h>
$ z% y1 T6 K8 U, K/ ^. |7 Z#include <mach/hardware.h>
! X9 t+ t$ b+ A4 l0 x#include <mach/irqs.h>
' F! d6 k0 k+ D# \, ]: q: l
$ L# g' j# Q+ ~) H( O#include <asm/mach-types.h>7 p5 f% s! K) A# q& V
#include <asm/mach/arch.h>% _% {6 V! T! B1 @) g/ L
#include <mach/da8xx.h>
- F3 s# G, m! W: |" l/ Q% o#define SYSCFG_BASE 0x01c140007 y9 x% o# ? }5 d/ L
#define PINMUX1_OFFSET 0x124
$ ]+ J) S, c t; w6 j. w9 K# z#define PINMUX18_OFFSET 0x168 % S2 F7 H9 a- q+ U$ R2 d. Z
#define PINMUX19_OFFSET 0x16c6 s7 ]# w, y5 f! P
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR3 P- [+ [0 N# [6 D
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR8 B y# \& ~" p+ f# T. E1 H
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
0 c6 @9 @& j2 ?+ b6 l; D#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
% m' E( b. X5 O$ F: E#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
F8 n3 G, T. e* c9 u' | 2 g& d' ]8 Y& q0 U1 h
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR# f3 |) ~& `8 R" c; ^1 I5 H# `, [
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
$ q" M5 w0 F$ X7 J( X7 H- E. ]//PSC# ?$ f7 X0 q D/ T6 M
#define PTCMD_ADDR 0x01E27120
9 h# p8 B: W- z9 o" c#define MDCTL15_ADDR 0x01E27A3C
$ y, w" [/ `" R( ]5 Y2 o/ _( E* C$ ?% f( y#define PDCTL1_ADDR 0x01E27304- }* [1 b; U5 J F; A
//GPIO8 direction
- Z" O! ^! ] u2 Y B/ M6 J+ s#define GPIO8_DIRECT 0x01E260B01 l% L: R7 Z( N1 G( S3 g$ l! S0 @
#define GPIO8_OUT 0x01E260B4* c) Q/ |6 @/ d" V4 Q8 j
#define GPIO8_IN 0x01E260C08 s6 ~/ A- M% o3 \# h& j* X
4 f0 ?$ e% W' ~1 N4 Z//#define MCBSP1_RINT 99 ( \- R/ r2 w- w, I' ~8 e9 f+ H
//#define MCBSP1_XINT 100 : V6 _- l% E* M ^) s( V# d
static int MCBSP_MAJOR=239;
7 ^( Z4 k: P7 a: H7 j, estatic int MCBSP_MINOR=0;3 {* i( e: w4 I1 c
static int count =1;
* t7 [# F( `8 N3 n1 k& F; Z; Y5 g3 c0 |* }
#define MCBSP_NAME "MCBSP-device"
, H7 N/ n( N0 ~0 Z' |+ {7 |. O6 r2 v P! [
static struct cdev *mcbsp_cdev;
6 Z. [/ x) y4 J' ^( Gstatic struct class *mcbsp_class;7 n9 M% b4 b+ G; ?' A8 r- a$ v
static dev_t mcbsp_dev;
# A+ ^0 Z- u! A- u" Hunsigned int DRR_data;
' p4 ]0 U$ a( {' wunsigned int DXR_data;
2 n# ~3 J0 G% L+ Z9 pstatic int mcbsp_open(struct inode *inode,struct file *file)0 y. w2 G1 q4 l! Y5 V
{3 R: ]! g$ T0 d
" d9 f" D( ~( l) `1 c& ]2 N //interrupt enable,initialized) ^" m& \# D" W0 X6 C
unsigned int temp;, @& {: E/ b6 @6 S9 r. O( E6 l
//SLEEP_EN(GPIO8[10])---0
8 w. H7 G1 ^, |: V# T temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( b# @ J! i& h) r" ^
temp=temp&(~0x00000400);; X% D* r, |% e' f8 w& [# s
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
1 k9 o, O3 O7 p# J //RESETn(GPIO8[8])----0----1 q- P2 j$ |$ \" C& k G
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- u4 V* m7 z. o9 B3 [) Q
temp=temp&(~0x00000100);% D* y& s, K! T2 X
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0+ a/ `9 ~ y2 r+ ~; H! S" l
udelay(100);
: K5 j Q. x& e temp=temp| 0x00000100;6 T" V9 u0 G) l0 r
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---14 L5 e1 H) }; R" e$ I L+ ^7 J9 C
udelay(100);) a. v K+ Z, A+ Y p$ B* P) G- k8 v3 W
printk("open success!\n");
+ k& d, U- M4 V V return 0;; O7 t( t& f# x& R9 l
}/ T- t6 r( }% b- w3 q
" k ]! Z+ |5 H. d4 s( @3 E' rstatic int mcbsp_release(struct inode *inode,struct file *file)* W }& L3 g& b0 i" U
{6 W( q# ?: y6 B! ~) E0 P
printk("release success!\n");( ~1 m2 ?& O0 u2 z0 d7 y1 n
return 0;( p' [6 g7 G3 c
}
* q( }# G( V' C$ I
9 E$ `7 P9 M; q% i' t! d$ b- Kstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
8 h, B, r" d1 T- T3 `{
; Z7 B0 v1 A1 C9 F copy_from_user(&DXR_data,buf,len);6 w" @6 ]& a2 w7 K8 f
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
# n- h7 o6 S( |! v9 k) Y4 n U [7 { return 0;
) B$ q) q5 q1 l' ?
8 n* X( o9 e! j1 R, x a8 G- k}- S% u m- b9 L( } z. _6 {- j
' ~- X! q$ ~. N' T; X0 q' Kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
. t9 \' a; v( p% K# A4 s1 q{
0 A: J9 E2 c2 U( g' D/ v) Q DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));- [! G* G2 K2 O& s4 |: K' ]
copy_to_user(buf,&DRR_data,len); 0 b9 c7 D: |" Z2 n# d7 S( x7 \
return 0;
& Q) @* ]: y& L* Q) {}
- d( r, _& O' j2 o# G8 |0 P
" n, v' _: \' `8 } D
9 s, f: {; P+ t+ K# j! gstatic struct file_operations mcbsp_fops=
; p' D7 S, l# D8 H z{! w |0 H8 L* a, q
.owner=THIS_MODULE,) i# c' U( Y t* Q5 i( }
.open=mcbsp_open,
0 z) @% {) A- _ .release=mcbsp_release,7 J4 t) ~4 Y8 N# |/ T1 x
.write=mcbsp_write,
; z3 p3 ^" v( d( Y; L3 T .read=mcbsp_read,' q0 d# r! ?1 l; [7 C0 A/ ^, L
};
8 X$ Z3 A- D9 rstatic int __init MCBSP_init(void)
- A' n$ b: D( R- Y4 Y6 g, ?{
# a" [, H% n9 R6 p, H int ret;
! Z9 L( }) K+ N/ f unsigned int PINMUX1_REG_old;, z- x8 e3 _3 }" Q! C2 T
unsigned int PINMUX18_REG_old;: I* y$ k' t% J4 m8 Q- H& G) ~
unsigned int PINMUX19_REG_old;
' d# b/ M3 t6 q7 n! Q! P; ?' Y unsigned int temp;
: ]$ ] U* o( j* i7 [ if(MCBSP_MAJOR)6 r* E; R0 h( J& T9 I. T. l
{
1 u( O8 X% @8 j; ~# n& N mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 \/ [5 g( a# s/ b% E& u! F
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ `: y4 [% r6 M P2 \# @- k8 s }* O8 N! x/ P- h0 c. m6 A
else
8 d! g& i0 D/ R {; O; X; } Z! i% G0 k
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);: w5 F1 H8 _- E9 g3 R) k
MCBSP_MAJOR=MAJOR(mcbsp_dev);
; D6 j( M6 b0 t5 Q5 p }0 b' `* e0 o: ?" i' [
% t7 d) Z) S7 ]" v; I6 m$ l if(ret<0)
, s2 Y+ J$ ^: t, e6 B6 N; i {
1 z4 A2 k1 n, P' F printk(KERN_ERR "register chrdev fail!");
( B8 t. a7 H7 J/ ], r! U% Q0 W return -1;% o6 V$ K" u- R! e) v) B" J$ Z
}
; |' h4 Z3 l- k: I6 e, P& s8 d! L 5 A, D9 ^& R$ \: g! m( ^
mcbsp_cdev=cdev_alloc();2 R0 C7 F& W8 A2 M3 w
+ E0 F* a. B3 U' o6 b0 ?
if(mcbsp_cdev!=NULL)7 z) I4 ~$ ]/ N& ~
{. U k9 y2 ^8 S1 K- H
cdev_init(mcbsp_cdev,&mcbsp_fops);: a; m9 d% }, n& O" v2 m0 @" {6 I
mcbsp_cdev->ops=&mcbsp_fops;1 B2 c4 ^* Q$ P& P6 Q
mcbsp_cdev->owner=THIS_MODULE;1 A5 D" [5 N( u& T
) ^$ m9 h0 U6 m1 |3 i) W
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 G! U F7 b7 ^+ U) ~9 L& n; a
printk(KERN_ERR "register cdev fail!");5 V; F; C7 K9 N \& j
else5 C1 l1 g- j3 ^+ ~2 J- C& @
printk(KERN_ERR "register success!\n");
9 H5 D! V7 F: [ U" @( y }
4 s% x; A/ N \: ~" b6 [0 n else4 S$ u/ z, n( O$ z) x5 I' D$ o( S6 |
{: \& Y* \; Q; \# B; Y
printk(KERN_ERR "register cdev err!");/ T+ }- [! M7 T# h1 {, U
return -1;8 j u Z( A6 Z) N2 x* d5 t
}
( U) |* a: j3 ^* \, [ x4 C n% q6 X* U
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 _" g T1 E5 [, u if(IS_ERR(mcbsp_class))
1 Y; L9 Y6 q# U {, E3 @1 X6 s4 I) j+ [
printk(KERN_ERR "register class err!");$ E- k/ s: p4 v( U( F
return -1;
# c: y, G) ~- ~& \8 T$ U( F! } }$ e9 v3 ^, p: `' w
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);6 ^* I# m% Y/ ?" ]5 A8 V, C
* T. ?' m5 Q2 M8 b //PSC, x [: n# [- S9 r. ^
//add Enable MCBSP% S @# o" v# z$ ^1 n( ]' V
//test
' X! u& j0 C1 k. P$ \7 r temp = 0x80000003;
8 s# b/ G$ t5 D; ^5 N writel(temp, IO_ADDRESS(MDCTL15_ADDR));
3 _3 U$ O# C6 \9 s2 W+ N4 @ temp = 0x00000003;# J% G* X* H/ r
writel(temp, IO_ADDRESS(PTCMD_ADDR));
/ E6 s" ?9 _: o( H2 \/ [1 E# X
3 n0 ]" Y: J, j temp = 0x001FF201;
7 ^3 ~. q5 Y, T2 ]! D& a/ ?" M' D3 P: | writel(temp, IO_ADDRESS(PDCTL1_ADDR));
( R- _ T6 D- p
; E( g8 ]$ V/ U& h3 J! }+ Z2 [ //PINMUX 3 _, U9 t: Z& r$ _3 J
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
# a- D$ P# e6 K8 L9 |3 J PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); # ]' j' W/ p9 X; g
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
+ O; ]' V _7 z& w writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# j" u/ T" s0 |; ^2 ^
- _' z; d5 [7 b7 D" ~0 z
//SLEEP_EN,EPR,L138_SHK1,L138_RC4 P/ i q5 v% v+ l( _
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); . Y, ~" N7 a. P
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 8 ~6 n) p! r4 ]% p; Y# E0 v- ] f T
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% h7 Y7 y; _7 `5 A4 |4 _3 e9 A " x) T/ p! _8 f/ \) `& B
//RESETn,L138_SHK2" v, _) F3 \% h
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); - ]; d, o" ]4 X# E
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
1 N3 ~8 R: L3 F7 v1 F, ` writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 l: V+ A: o @! D2 X2 P1 j4 S " {/ `/ \4 D5 k' P( I8 V( a
- T! R, k1 O) b. l# ~9 j //SPCR Register- F/ U3 m7 V2 {- F0 I
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset4 s' \% L! M; b5 _- t3 S
temp = 0x03000000;//(DLB=0)
. Z6 t4 D9 _9 O: C+ ]) i' |& `( C$ z // temp = 0x03008000;//(DLB=1)1 r2 b8 M0 `6 s8 ~
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset, U* Y. T8 b- [% e6 X6 o
temp = readl(IO_ADDRESS(SPCR_ADDR));
$ y# {, g& b8 c% D B2 `' m5 I$ s8 F" m printk("temp=%x\n",temp);/ T" a! t I- I: a0 n! }
0 O" u) j( \3 {% } //PCR Register
+ N- v$ `" |4 c; V //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
' G% o+ ~1 E9 s% ?9 G3 }1 z' A" }8 W // temp = 0x00000F0F;
8 }: H x# G3 `3 F* I: _ temp = 0x00000B0F;
* Y+ f1 L) Q. c6 p L$ m9 N writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
- J0 g. d8 H8 O temp = readl(IO_ADDRESS(PCR_ADDR));
3 w( C! v( h' Z# n9 c6 | printk("temp=%x\n",temp);
7 d1 V3 k" h7 _* i, [ //SRGR Register: v8 C* W: O1 ?
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. ~2 c8 m+ w \: E7 Z //temp = 0x301F000B;1 _9 c: u# u# K0 e) H7 E
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized , I$ q _7 K( w6 W
temp = readl(IO_ADDRESS(SRGR_ADDR));- V: D# r( P( e
printk("temp=%x\n",temp);! C4 a# k# u) Z1 n2 {- }/ r
//RCR
6 B" K1 m2 h& k8 T) M+ }! T5 W //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! `! Z, i# S6 j0 f9 \' D
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 g' v( R' D" v$ P: `! A8 n
temp = 0x00440040;! g( s+ e5 N* }; t
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ! ^, ]+ A0 n h% F* V% R R
temp = readl(IO_ADDRESS(RCR_ADDR));: c X' S1 x- B8 h/ J
printk("temp=%x\n",temp);
# M! ^- Z. v: e. u6 l; `3 t5 O //XCR
* T" v4 N z8 \- n! T! M //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& P$ X* ], A* j6 K, @2 b- N //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
3 N; z$ P1 s5 S- v temp = 0x00440040;
+ y6 M2 a' ^% O( Z/ A- O2 |/ N& y writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ( v: R) [/ v" `7 }! l
temp = readl(IO_ADDRESS(XCR_ADDR));
3 b M: }1 g J, L) c printk("temp=%x\n",temp);
* k7 [2 ?# Y4 V, Q& Q6 a5 u% [ udelay(100);4 h& E+ T7 g2 [+ K0 |8 X& K9 w
//SPCR Register
: V+ i# _9 l, N //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
" {4 P5 V" p, i; {/ ~' z temp = 0x03C10001; //DLB = 0 VS DLB = 1
( q4 X/ g7 i p2 i/ n writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
1 W; n5 g) s" X# t2 Y0 ` temp = readl(IO_ADDRESS(SPCR_ADDR));" B# N% d+ q/ f, P5 h
printk("temp=%x\n",temp);! f% T1 M6 s8 k9 R( h& q
udelay(100);
0 [0 D0 w4 e+ p* r' u/ p# l K( F( }9 s( _+ O8 n+ Q' J4 l
//set GPIO direction4 \+ Y; M/ S- h! j8 E8 `5 |
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
5 [% n" _6 D! L% h, u9 Q. G temp = temp | 0x00000100;//EPR----input
; m2 |. Z ~( n& y/ J temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output; D0 S7 P2 K7 ]7 W! r7 ^
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ I# i1 i i" `! C [1 H
! {8 `2 q8 U5 Q( F$ h return 0;
% A3 u$ Y+ V$ K9 f$ a( Z5 q}
" E; }& `3 T+ @: G, i7 [static void __exit MCBSP_exit(void)$ l) \ k, u+ J4 i' E1 r
{
3 c8 @4 |$ X0 d printk("mcbsp chrdev exit!\n");
/ s. u- l* y7 g) L' k6 W cdev_del(mcbsp_cdev);
1 c, d5 R: O' D# X unregister_chrdev_region(mcbsp_dev,count);4 E/ F# I( {1 q6 F) U) ?
device_destroy(mcbsp_class,mcbsp_dev);# P* P. F* N& v5 u' X' J' Y/ M
class_destroy(mcbsp_class);6 ~% R( |: M. {! E, F
}
: w9 s( u( l) z H: M) q: d" C4 @9 \module_init(MCBSP_init);
: U* K6 K6 r. A/ t% U2 l& a! ^module_exit(MCBSP_exit);
0 l5 P+ d5 `7 i( |- R! O0 v
/ i# P, N0 S6 TMODULE_LICENSE("GPL");, X$ [8 W* }0 w/ q
, g9 v7 a/ L9 r
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 u; |% t2 k" c9 s B
我的应用层的测试程序如下( Y3 K; q6 ]% }4 `
#include <stdio.h>7 z, g( ]* h7 w
#include <string.h>
9 d8 q$ C* W5 h+ K6 D#include <fcntl.h>
5 z. M0 H$ U. Z, p" h5 N7 {$ m+ y#include <unistd.h>
% C' p: R; {1 J/ d#include <signal.h>
4 ]) h+ J, }! H% p H- B- _5 f6 w#include <pthread.h> //线程8 P8 @6 c) @0 o! J" O6 u6 U
#include <stdlib.h>
. J$ r, B$ a; T0 }$ U% r#include <pcap.h> //捕获网口数据
" x2 t. C9 _" g: A2 p) B. u5 r7 S2 @#include <semaphore.h> //信号
' m- H" g9 G& A#include <sys/types.h> //消息对列
, ^7 I4 ^$ w7 A#include <sys/ipc.h> //消息队列- i$ e$ p3 h1 v- _! d5 y8 Z
#include <sys/msg.h> //消息队列
( J- C! c$ V0 q" @, L#include <sys/select.h>
' z, ]. E2 I& s7 R2 Q#include <sys/syscall.h>
0 J! q& q2 d$ _( K7 H! s& L: _( K#include <sys/stat.h>0 J8 l& a/ R# x1 M# U9 B9 N
#include <sys/mman.h>" Q6 A# B+ Q, c' R4 K9 z
#define msleep(x) usleep(1000*x)
# {8 b3 J0 C5 a' A. e9 k+ X1 j
+ n" x# w/ k9 G/ i% ] x2 bint main()
* U- T' I6 V8 K$ t' H5 J& A{ % ]; _0 \- B# A. c0 z6 f
//MCBSP,ARM与AMBE2000交互设备/ N2 c K. V) O
int fd;
* i, _ r/ d! K. S unsigned short data_write = 0x5555;
( y: a) m5 s w; N" j unsigned short data_read = 0x00;+ E+ a- D5 U6 C& p. C- Z! a/ ]3 |
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
8 S6 A+ Q3 }5 {# N9 [9 D: h // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);0 F9 g3 U& ~: K5 u; x( J. {" R% l
$ _9 L* s. K; ?$ C0 X% M' A8 D6 R if(fd < 0)
' `! y* \/ i2 v) W: y3 B {# F& u* s: _$ H s5 U/ |
perror("open failed\n");* [& w: C% {8 o$ y7 o9 g5 O) H
return -1;* P) A* p, C8 B
} D9 c8 L; o; _/ l5 X
p+ e5 L/ p0 ~+ M, { while(1)
. T' @- b5 z' {" S; j {
; x5 Z0 q5 u o* k6 Y
/ ] _! T# v, R0 U6 R7 o# O+ _ //AMBE2000每次读写是24个字为一帧5 V" v3 @. z4 D ^1 c
//写数据时将数据在底层存储起来,等到中断的时候再发送
, Y/ i$ ^$ i% p/ ^0 Y+ B. } //AMBE2000输入数据是以0x13EC开头的
& H' R8 O: S3 O1 Q: O0 y write(fd,&data_write,sizeof(unsigned short));7 A' N" n. @7 ]1 j8 c
( I0 c) [$ L! [3 D! {, {
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 P6 y+ ^% L, a, |6 O1 ?
read(fd,&data_read,sizeof(unsigned short));
* i% @/ z0 n6 I# ]; n* g
. }4 I! w9 p3 {9 l' W3 T! D7 N if(data_read == 0x13Ec)% C" o R- z2 S- i( z
{5 ?; M" P& r) ]* M& Y1 D1 ~ e
1 }: L: K2 G8 ^$ P& j0 |% |/ ~
printf("data_read = %x\n",data_read);$ q% y7 `* \2 f
}
! k+ |/ T. I/ D' N 9 L1 E0 q- l7 E1 o8 S0 Q6 [
msleep(10);
4 l. y1 T4 M3 I - c! `2 O6 s: t' ^& A
/*0 ]2 C) Y0 C! y. ?1 E2 o0 f
ioctl(fd,1);
0 F+ b( W+ v& }" N/ x8 V* x sleep(1);8 t Q, Y1 g% n7 i
ioctl(fd,0);
3 P" S) a+ f1 n- ]- P W$ b8 F7 ] sleep(1); D0 K1 \6 u: `# z3 \, C
*/ # C- A( C% ^" Z$ H* O
}
8 J3 v; {5 O. x Y7 u return 0;
8 \( J% ~* U% F/ i8 J2 [2 Q5 V; j ( b9 u) h2 s) B% W
}
$ A; i/ [ r# S$ O8 z
3 w2 X% [3 G/ k6 Y' j+ |. M0 r多谢各位指教,谢谢! 急' R+ ]9 Y" j3 k( C8 x* D7 J
( s N2 S* t2 J- D# w: h( S" {
# F9 M2 I8 Z% V, t: d
6 \9 x P* O; D7 ]: l. [/ @: q/ z
; r) P h: H4 u& w/ E I |
|