|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) ?( {/ r& w6 c6 v/*
9 N- v: k0 _5 |) L: F0 `2 | * Copyright (C) 2009 Texas Instruments Inc
! y2 o* `; P5 u- O *3 I# A+ p! m& a7 G, x p
* This program is free software; you can redistribute it and/or modify! j# N2 a" U: s; F5 G1 _! m
* it under the terms of the GNU General Public License as published by8 I: Y' x4 B/ M, \! i4 q, p: F: g
* the Free Software Foundation; either version 2 of the License, or! ]1 @+ X9 b1 E5 U n
* (at your option)any later version.+ ?6 W& J) _! t+ q) o1 ^) y; _# v
*
+ v+ u; \8 w3 k$ A- z * This program is distributed in the hope that it will be useful,
# T+ S: O. y+ E2 C$ I. @ * but WITHOUT ANY WARRANTY; without even the implied warranty of! i( m9 V0 ~. U0 J* x: ?
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
) B+ e8 f; `) t- [, [ * GNU General Public License for more details.
* ^, v/ ?, g: D1 j% B *4 O/ w& b# T6 X) \& F! j
* You should have received a copy of the GNU General Public License
K/ p/ W9 ^& D6 C u1 p; H8 v# l: I * along with this program; if not, write to the Free Software
( d! w& M; u9 T6 e * Foundati' o( g" b5 o8 K8 {0 F/ E6 S" G3 e
*/
; M2 f6 q+ g3 T4 g& R) u#include <linux/module.h>' O0 p+ p1 H% M. Q% b
#include <linux/init.h>' {/ H9 l5 [ _) z! g
#include <linux/errno.h>- W7 r7 ?, d; \* C/ ]1 F+ e6 J
#include <linux/types.h>
1 u9 B( o9 E; k+ B& u3 F2 g#include <linux/interrupt.h>, E& h6 W" s2 H" z( N
#include <linux/io.h>1 L. s% D6 I, U, `$ G6 P
#include <linux/sysctl.h>0 U2 B& M" H5 a
#include <linux/mm.h>
* I, Y2 H% W9 h, s% I#include <linux/delay.h>
6 K) [0 q* k6 \#include<linux/kernel.h>2 e8 a- u9 n$ t; k- J% Y7 v5 L! {
#include<linux/fs.h>
; w6 z, X; r0 ]2 b! V& I" Z#include<linux/ioctl.h>
% ^- t- ?6 B; I) u- k8 U( e& S#include<linux/cdev.h> \1 C7 F# \& k* u) F
#include<linux/kdev_t.h>
8 S( @8 M; H* N( k#include<linux/gpio.h>
+ d; N# u! e( z. D- b- G4 o#include <mach/hardware.h>
3 u# n# F2 X4 U) f#include <mach/irqs.h>* D* k5 l1 q6 t; n# O" h# D
! L" e& }$ W1 c& {5 u# h, d: ^+ R#include <asm/mach-types.h>" K5 W/ P/ u5 z
#include <asm/mach/arch.h>
' D- t4 S1 Q% r& ]* S' \* {6 H& W#include <mach/da8xx.h>
& b% v& Q E, q9 o: e& H#define SYSCFG_BASE 0x01c14000
/ o! A7 g2 i9 {6 U#define PINMUX1_OFFSET 0x124 ; u- d' e4 X% ?* v( [+ U/ W$ P% \
#define PINMUX18_OFFSET 0x168
4 h* I4 O. u' Q* P3 P: J#define PINMUX19_OFFSET 0x16c
* E! G. i6 h" Q; M: ~. x& N. m4 ~#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
+ P: u, D' P, y9 x. ^) e( M: J0 p#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
& u# {' G+ A$ d; }! h% N#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
0 J2 w0 ]$ |$ z: w#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
+ A; G3 Q, z1 }3 n#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
$ e, |' }$ G( E% R6 E" O" {$ L; Y) U
# ]. }0 t8 v' G# V5 v#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
& E: r6 a) R$ R# h5 E* T" E#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
6 Q& Y! T( z5 I//PSC
( G# m' T4 ~* E4 B# H+ d#define PTCMD_ADDR 0x01E27120
; r7 r8 t1 F4 ]( `% j#define MDCTL15_ADDR 0x01E27A3C6 p3 @ Z: a2 F1 F
#define PDCTL1_ADDR 0x01E27304- Q& t( Q# p* {" j
//GPIO8 direction
: ?) a' l$ S* g& Q. w#define GPIO8_DIRECT 0x01E260B0
* ~5 p' j( |+ N#define GPIO8_OUT 0x01E260B4
, z$ U- y4 l* @9 Z% D: \! q; H$ p) w#define GPIO8_IN 0x01E260C0- i0 a! c6 `$ F K# d8 O
' S5 J# d. q5 K* }4 y
//#define MCBSP1_RINT 99
; X- w! G: `" g, |+ a6 f, W# L//#define MCBSP1_XINT 100 / S. S4 j6 {; T7 r$ y. S9 [4 p
static int MCBSP_MAJOR=239;5 _4 x% N; X6 t# s$ ?
static int MCBSP_MINOR=0;3 Z/ H3 ?5 r' R$ s; Q ?, i# O4 x
static int count =1;- C: L. K1 a# @, K
8 a6 @/ \$ W6 M4 x#define MCBSP_NAME "MCBSP-device"
8 A; f$ w3 ]/ W t% e2 ]( o! s X$ h5 _( a" n- W" g- j
static struct cdev *mcbsp_cdev;
6 B7 w' E1 e: ]& S+ \6 T4 I5 F3 hstatic struct class *mcbsp_class;6 ^+ z/ Z: d% ]; d5 q
static dev_t mcbsp_dev;& r8 M" h+ V6 R8 W! e0 R4 I4 _! }0 ~
unsigned int DRR_data;$ i$ `0 z3 v5 u1 K Q8 p, v: M
unsigned int DXR_data;
4 a& b% f- \! {0 M! u- a# _. Qstatic int mcbsp_open(struct inode *inode,struct file *file)
9 X s% H+ i7 m* f0 u{% q o1 I3 H% o6 E8 O8 n
5 B# q, M1 R: |( y
//interrupt enable,initialized
7 J9 m6 M5 w0 {- b8 _8 t. k% X unsigned int temp;; H# @( v) Z; l- r- g
//SLEEP_EN(GPIO8[10])---0/ e8 h! s, z. M. g& A; ^5 j$ f
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
" z3 ?9 X- T& g0 j, p temp=temp&(~0x00000400);
, V4 @; Y7 I3 m8 h9 y# g8 `) I __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' t* U% y( e+ ?; ? //RESETn(GPIO8[8])----0----1
/ D, ~! a5 t# A% t j% F) | temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: Z* ^4 k/ I' @- G temp=temp&(~0x00000100);# r6 {" E) p9 c7 N- ^+ d
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0- I/ j y4 j) v8 h" W6 p% q4 y
udelay(100);. t! i+ m1 v' @. R
temp=temp| 0x00000100;" b) m! h+ [' _# K8 h/ j, J0 K/ u
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
0 z2 d' {) V9 [ udelay(100);
" {: H9 N/ r* ]3 } printk("open success!\n");" E* W% S# e! J: R* c. C4 l
return 0;7 X& @; _$ t1 J
}3 k' P9 J" t. {+ X- V
3 i; D; N" m. rstatic int mcbsp_release(struct inode *inode,struct file *file)
$ v# W" h* b$ O2 Y" C1 `{5 E/ A4 t0 N- N0 B
printk("release success!\n");
& _5 Y3 D) I! U" ?! S return 0;& L$ h5 ]- h& y3 [
}
8 M/ [$ m' n: u$ l$ J/ a, \* v$ b2 @/ B* U& [- B
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
5 \5 p6 g+ A* C" j' }9 h9 h{
: _( a) o. C H) m5 n6 o5 R9 q9 _ copy_from_user(&DXR_data,buf,len);
, M; `, r$ ` [3 y6 `/ p& P; ~6 b iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); - w' Z: I, _, U$ d
return 0;
" F2 g0 t' s4 l9 T
6 _- D7 h( h5 V& w) F9 e}
$ P0 M0 g# ]/ Z$ g: G/ g
. v, X0 c* P9 Wstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)" m* }0 u3 m" E
{ $ @7 H: n7 L# m" }/ f) |1 j5 b
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* o$ }* H/ t2 r) m3 b copy_to_user(buf,&DRR_data,len); 3 Y/ k& R* l6 h4 i' O4 {/ y+ e
return 0;
7 m! k A- ]; L0 j4 [}, ?) V# p9 P: X7 d; j3 G
) H% U0 _0 a# r; X
. W4 R: w4 |3 ~) t5 }" Istatic struct file_operations mcbsp_fops= g. g/ z1 h5 K4 }
{
* ]& I B1 l/ K$ k/ n .owner=THIS_MODULE,
V! z$ _0 T w5 s .open=mcbsp_open,; a7 A% w) T4 ]3 S
.release=mcbsp_release,; X& e& @0 }- f, a- J' d$ M
.write=mcbsp_write,
( l( @. ~, E/ r& C .read=mcbsp_read,
( n6 P2 P; p' B) U/ h# L$ y" U};
0 ~3 k. z5 F# ustatic int __init MCBSP_init(void)
1 |( b$ ~( h, d o{
" W& K0 g4 a! | T int ret;
* S( }7 f( V, n+ M! k unsigned int PINMUX1_REG_old;* R" t/ O4 x& S; E$ C& w
unsigned int PINMUX18_REG_old;8 A4 l! r* ^4 o* _8 F( U
unsigned int PINMUX19_REG_old;
! C$ p/ \ s }+ Q7 m( t/ { unsigned int temp;
% O" o6 i& C0 @. V3 }& | if(MCBSP_MAJOR)
' S$ h5 Z; t6 d( v/ B2 _; h {
. B3 M# T2 J4 V% R% b mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
* I' L5 O! ?" n( u( s$ e! M- h* S/ \ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- g" L$ d8 y( y( e& @; l8 F/ \2 E
}
# ]' q9 V8 M2 ]/ J else- s j T# v' {; N
{$ j, Y5 ]$ P5 U4 u
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
7 R0 a' j1 n! f) V! J, Z( u MCBSP_MAJOR=MAJOR(mcbsp_dev);
5 F; Q* E& A( r0 b8 o5 Y8 o }/ K% ?9 y* ?/ z- R7 A, n
5 m S* Z% N6 `5 \. i( E& H0 f
if(ret<0)+ c% S" l- {/ W$ n; @
{- G; i* D, ] a+ }8 \' ^, z4 K" H
printk(KERN_ERR "register chrdev fail!");8 U, z# B# R! l4 c
return -1;% y: h6 v. |* {5 z y+ s9 W2 J0 T
}
O$ u" p* ?+ I1 y+ l; X
7 r& F* n6 ~2 s x' N mcbsp_cdev=cdev_alloc();8 w9 a1 U! L4 H1 |3 l
, `# G! {7 L) o4 F4 D
if(mcbsp_cdev!=NULL)" `1 M, L4 q7 k! y V' ^' g6 v' ?
{3 R' F) m" ?: ?5 n
cdev_init(mcbsp_cdev,&mcbsp_fops);
: M5 a: t- G5 @1 S) K4 I mcbsp_cdev->ops=&mcbsp_fops;
7 i7 i/ h t) S' @5 K+ {/ ? C mcbsp_cdev->owner=THIS_MODULE;8 w1 U3 h8 H0 d9 H5 X P
7 T: R& g( T0 ]. O6 H if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% H0 d# q3 i9 k9 i4 r% X& p$ s$ ]
printk(KERN_ERR "register cdev fail!");0 O, @* ]$ U: Q( U% ^
else
: X7 l7 n9 S8 x. O printk(KERN_ERR "register success!\n");
% t2 q& p. _# d; l' [) B7 H }
% r8 q9 o/ @% x, R! ~8 ^) e/ E else
1 s, |( q, r+ P2 [3 T+ S0 W8 `( s( Y {; _6 u1 t3 J. m" O4 Z
printk(KERN_ERR "register cdev err!");# ^! ~2 [+ ]* h+ K
return -1;. i& _9 `5 d% O) p! \
}3 o! D* ]% m4 V; M6 w, U+ ]
: H1 [) t! y! a2 } mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- @7 B, K" C& o if(IS_ERR(mcbsp_class))9 _: D8 p$ N1 p
{
" F2 D! P2 Z4 s7 T printk(KERN_ERR "register class err!");, j6 Z. X& R. P0 _1 e* Y8 [, G+ h$ z' X
return -1;
0 s: g) s4 U' l" _4 C2 d6 ~+ { }& A* ]( K1 B" I& l2 g! V6 S
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
! y8 ~! {; }) H$ ?9 w- j: i; K! l+ K0 X9 e
//PSC
" g$ D% q5 m* c, J7 T //add Enable MCBSP9 i; U/ U H# v* P
//test
1 _ T; d' v Z3 m: l temp = 0x80000003;. S, Q+ e1 O9 ^& }) [
writel(temp, IO_ADDRESS(MDCTL15_ADDR));; h5 R3 _+ O- o
temp = 0x00000003;' n0 T+ s/ o& p" J4 [, T
writel(temp, IO_ADDRESS(PTCMD_ADDR));9 V6 n; x9 x3 ]+ A
( V( z: }% g- T* P
temp = 0x001FF201;* l+ ^2 h9 }! f% I7 u% C$ ]* a* o
writel(temp, IO_ADDRESS(PDCTL1_ADDR));( W: h- [; F4 h; {
6 d0 L8 W+ ~' n8 ^1 J- U2 [ //PINMUX 4 [4 M4 v# ?4 }$ c
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* D8 f6 a6 T2 m1 H6 {7 B: s) H PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ! C/ r' n- ~# {- X+ s4 [
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; + j7 y8 Z- u0 b9 ^+ t
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 C: B' h& F( h0 c , N! o. X4 z1 B) m
//SLEEP_EN,EPR,L138_SHK1,L138_RC
- M# z$ r4 T) D9 Y) ~$ P$ A3 { PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 2 d7 B' t' D% ?$ O+ [
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
) q6 `7 D' X3 ]2 y: F% k; y writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ I8 |; w% r6 ? E3 L7 y 5 m; [4 z8 a4 ^/ O
//RESETn,L138_SHK2, h: [+ a2 ]5 N! ]6 i4 e$ m
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) v# Q: k( M/ ?: ^6 N$ ] Z. A PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
; N2 t' I% }" m1 K O ] writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( R9 r( o5 ?5 d9 b( p+ l' c $ T8 [1 s) O( ]: \7 \3 I ^8 g
7 \* R8 y+ W9 w- \5 r8 ?3 S r
//SPCR Register
* a, p( ?, j' s# u1 ]. p //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
$ `& I% ^2 g8 F0 W/ f- o6 R temp = 0x03000000;//(DLB=0)- H. W1 T: O; m' |% @) q& ], |
// temp = 0x03008000;//(DLB=1)
' C) m6 O3 _6 g$ F m8 ^ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset D- e8 Q+ O- C s: t/ H
temp = readl(IO_ADDRESS(SPCR_ADDR));
% U' o2 _ h8 R/ O/ p, c' [/ w printk("temp=%x\n",temp);
) q$ [9 S% g7 {7 F$ P9 o : k8 E, n' a! V, m$ G( h
//PCR Register
6 t4 l" @9 s. X/ J //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0# W6 f- q4 T1 M' l
// temp = 0x00000F0F;
7 _1 ] u1 a0 d! f+ T temp = 0x00000B0F;
4 y- S' D: Q/ s7 T/ W writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized + a# B, N8 u4 f; j0 \
temp = readl(IO_ADDRESS(PCR_ADDR));
6 g# ]5 l$ i) _0 c. y2 U# E: Z printk("temp=%x\n",temp);
7 K5 R/ I7 B; K. d) D //SRGR Register. A' P9 u- w0 k$ z2 y% S
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 v: V) q) h! x+ L* D% g //temp = 0x301F000B;, a/ ^( T2 a/ l Q* d$ @
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 9 b/ x4 D, B: G! s8 h
temp = readl(IO_ADDRESS(SRGR_ADDR));' t4 t. b) h" \; ~7 \( f0 L& o+ [+ e. s
printk("temp=%x\n",temp);6 [# h; K; {7 H0 X
//RCR7 H1 p1 x6 e- ]1 ~
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,; n% Y5 Q3 A W6 ^: H
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
- E( Y. O% ^+ b% n. | O9 |7 _# j temp = 0x00440040;7 `8 t/ _/ L, B. w1 _
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
, c. K2 n1 j3 U, v- a: P/ ?$ C0 C temp = readl(IO_ADDRESS(RCR_ADDR));, D4 E+ l* z: a8 {# S* J
printk("temp=%x\n",temp);
8 m0 E G# L, K: y# V _ //XCR
9 N! C8 z8 t) f/ i6 T3 }1 e //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1 U4 _( t D5 H! w1 q# Z
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0# A( f( o+ B( C3 r% k4 ~5 C
temp = 0x00440040;
* v3 h2 Z; Z& y3 N; _ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
' m9 z6 @* X1 R1 k7 f1 ? temp = readl(IO_ADDRESS(XCR_ADDR));. S" D6 @* F$ L" Q" V% h; I0 }
printk("temp=%x\n",temp);' o1 B H" h4 c
udelay(100);
5 Z; @0 k! u4 T% v) C/ i9 p2 r$ l //SPCR Register; j4 W; s9 o! q8 z
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1- O4 M$ X* C7 ~
temp = 0x03C10001; //DLB = 0 VS DLB = 1. @9 M' q4 x& c0 ]2 L9 o
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled0 {: Q& B, X5 r' i/ q
temp = readl(IO_ADDRESS(SPCR_ADDR));2 z( F0 S, W. |* S- k! h
printk("temp=%x\n",temp);( T& X$ g6 @4 Q; V, X
udelay(100);3 E# Z; a9 Z7 h$ J
! ^3 \9 t2 ]/ @' e! |# C) \7 N //set GPIO direction$ P% ^ M. U1 ]
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- B4 d4 j6 ~' |
temp = temp | 0x00000100;//EPR----input
; E) z7 G, ?- K6 `0 F8 S0 h# k \ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
8 k ]& L; l8 V+ I- I( m, K __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); / b; ]9 o5 @" P8 e) d% X7 M: P
* G7 w$ |* _* H# {% y
return 0;
- q/ c, z8 {8 u* k}3 @! c* j; o# U# j, j
static void __exit MCBSP_exit(void)
3 L$ M6 c1 {( Y% \! A E; w{
) b7 K+ N4 ~; ^- R printk("mcbsp chrdev exit!\n");
" M) b" D @$ U- M" ` cdev_del(mcbsp_cdev);
( ^# j; G& ]1 W2 C unregister_chrdev_region(mcbsp_dev,count);: w& E/ ]3 H; r2 P1 U: |- l
device_destroy(mcbsp_class,mcbsp_dev);/ S" I3 P6 E$ k! K) T5 g6 o, n
class_destroy(mcbsp_class);
' ?' f3 R2 e1 x' u" a% M% h}
+ I- B V7 p; O; d6 Y ~% `module_init(MCBSP_init);
) v9 Y8 C$ x& U* H# b( X- |module_exit(MCBSP_exit);
! M( Y/ J; R: f1 {# o; U3 }) E4 x* f
( U8 w7 g% p7 c; f$ u( _" UMODULE_LICENSE("GPL");
# m9 e/ w3 X- J( L) O4 R) D- u; n! m9 F: M2 Z$ ]
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
( ^" H9 X& }1 u* P* D我的应用层的测试程序如下* r! n: M! J: P+ x
#include <stdio.h>
, \3 C! K; @$ J4 F; ~# ?# [#include <string.h>4 P& j1 ?5 s9 _
#include <fcntl.h># S( u; [8 [$ x- a6 P& y6 v9 c
#include <unistd.h>) E4 T+ V4 e6 ?' a% N* E0 J
#include <signal.h>" X( d0 ~, @' a" C. R
#include <pthread.h> //线程
! R' o1 _ i \/ Z/ x9 J#include <stdlib.h>/ g! y& [8 n* f- k
#include <pcap.h> //捕获网口数据' U0 L2 x: N: Q; r$ E; N
#include <semaphore.h> //信号
2 ^9 Q) K7 X. [) u4 ~#include <sys/types.h> //消息对列/ r) e) I( W3 o5 v
#include <sys/ipc.h> //消息队列
1 ] U- D( k0 i# Y) ^#include <sys/msg.h> //消息队列
" w: @+ E- v0 F7 y* w: n4 W# A' |#include <sys/select.h>' v& L- R# r+ M. D2 _5 B) T, ?2 Y' ^
#include <sys/syscall.h>
7 f; V+ h, }* ?$ u4 R#include <sys/stat.h>
' r9 a: }% V1 ^* l3 j, H# K# o#include <sys/mman.h>
- b! @. K0 z6 z( k8 j#define msleep(x) usleep(1000*x)
+ _$ f$ @. b- S6 J
: D2 U3 b: l0 h e7 yint main()1 V; L' G" q* _' r+ w" ?
{ ( W4 I" Y& @! e6 Y* f! D c
//MCBSP,ARM与AMBE2000交互设备$ P% ~, i' K# ]
int fd;
$ U/ m/ s- S# f6 R6 m; j0 P unsigned short data_write = 0x5555;
6 H j5 e L9 J }* a# f$ ]( d# p unsigned short data_read = 0x00;
& T! Y# Y3 h' V; m7 h fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);+ p! g7 O5 `8 Y3 X1 V
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 t5 ?. A/ U2 k: P
# q: W" {5 P* k8 r% I( l5 C if(fd < 0)* ?. G/ E. `' p) R1 p( e; l. o, x1 }
{6 r0 h1 _8 B9 }) V, x! ?
perror("open failed\n");
8 _4 q6 d# D1 y1 r return -1;
- m ]; z, n2 T, e, y7 a( } }
5 g4 l, O* E# r) t8 @9 b ! |& P4 I$ Z* v G$ V0 z4 v
while(1)
; i) s# g7 l& p, s {/ d+ q0 _3 c" x7 O6 v* ]) g
) K+ p$ t$ D$ l" h& W% h- H. U
//AMBE2000每次读写是24个字为一帧
$ F$ R. V. Y4 ^4 N& A7 K5 T //写数据时将数据在底层存储起来,等到中断的时候再发送% e9 P, a7 @8 }$ ]
//AMBE2000输入数据是以0x13EC开头的
! L) A( m- e) }4 F" s* ^# k write(fd,&data_write,sizeof(unsigned short));* e" f" |! G: C- ]) W6 i) Q! ]
+ u/ _3 N$ U% Z! U( }+ ]
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
, p0 ^! R$ L- |+ c0 b! ` read(fd,&data_read,sizeof(unsigned short));. M4 U0 ]% r+ d% O
3 ]* w i/ b& g7 f3 } B if(data_read == 0x13Ec)
3 p+ u. C8 }2 f# _$ Z {3 u4 K& C+ N' `& O5 I3 m
' x3 h% t( e3 i5 ?
printf("data_read = %x\n",data_read);7 X; D. w% X8 g# l* N) S7 X
}1 M5 H* l5 n4 `+ B2 Z+ B
, R. h5 ~" B7 u7 p: v" g5 \ msleep(10);4 g/ }/ }1 A* F0 a
! t3 A7 M' K/ i8 k /*
, S7 ?1 W, C d" B2 P ioctl(fd,1);
1 N7 V7 {% ]5 E3 N. D8 X, n sleep(1);
2 k( S! Y. j7 Z. M- b" \ ioctl(fd,0);
! w) j" e+ [% L sleep(1);" U, I' w. I3 v U2 J w1 }
*/
/ p6 W- n& e- p; j7 w7 l } . e* k6 S% z! J) v" d
return 0;
, Q3 ^. ~3 T/ x: t. J0 K+ Q) ] ! t# e! R0 q% A7 E# J
}: P* ?; ?4 k2 I5 k! [
8 E9 w0 S) x! _* G+ G, l多谢各位指教,谢谢! 急4 g8 y2 g3 g5 @2 O: g" O' I
, S; w: }6 j) j# V& V' T V
- V/ U+ d7 ~. f4 z# M
( ?9 f! `. c. i
- {( d: R* ]0 u# s" [/ e8 g. W7 D2 n( T& L, d2 ?/ i
|
|