|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 e; `) [" ~8 j- m) _
/*
& A% _+ Z5 y+ Z1 }- e * Copyright (C) 2009 Texas Instruments Inc" [" B$ J+ _# w( C O5 J6 i. K. ]
*
3 s* Z. u( ~& r: I7 A9 L, ? * This program is free software; you can redistribute it and/or modify
) d. _5 m5 `3 H * it under the terms of the GNU General Public License as published by" T8 c9 G I( W, I8 g; {$ B
* the Free Software Foundation; either version 2 of the License, or9 q- U* |, `& y' R+ p
* (at your option)any later version.
E6 y; y" D+ h6 l *7 R3 A& `8 j4 P$ P; t2 ~. K8 o
* This program is distributed in the hope that it will be useful,2 c4 z- |# S5 ^. c/ D* \1 D$ H
* but WITHOUT ANY WARRANTY; without even the implied warranty of
3 K& Z$ p) t( A: W * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3 c3 y0 g- r) ^0 X4 L9 ^ * GNU General Public License for more details.* B* x- t! G- \6 _0 a
* s' t9 z6 u- ~
* You should have received a copy of the GNU General Public License
+ F3 e- V$ E% s: w' r * along with this program; if not, write to the Free Software
$ U$ {# `8 b$ z/ _" B9 k * Foundati
5 ]( B, K8 N" r! f! B; r4 s2 @; Z% N*/
4 x. i Z. V/ s; J/ M#include <linux/module.h>
5 p- j0 @, I- Y1 O/ T#include <linux/init.h>
2 ]2 f- V) Z4 w! u) p+ |* ~#include <linux/errno.h>- Z1 J( T; N+ `
#include <linux/types.h>
) ?+ E$ T$ F: T9 u9 B; O1 r2 g#include <linux/interrupt.h>
4 T- r7 {- t/ l3 K; c#include <linux/io.h>' T# |( s7 W I. g
#include <linux/sysctl.h> i. I2 Q3 ^; f1 F, q- V7 c
#include <linux/mm.h>
" d" C/ [8 P! i4 n+ S#include <linux/delay.h>
" O) ^3 A( \0 Q- l; @8 d. `#include<linux/kernel.h>0 Y0 i4 q% w% N. g
#include<linux/fs.h>; \% ?2 A* q% u7 S K' Z; C: N3 g7 }
#include<linux/ioctl.h>) W7 b ^' V8 t& h. }; L7 P
#include<linux/cdev.h>
4 D5 z7 Y. u( C* ]' q3 j7 V; {& F#include<linux/kdev_t.h>$ o9 D5 N+ C9 s: T9 v
#include<linux/gpio.h>9 w; w, F; q5 W% @ s. e/ X
#include <mach/hardware.h>
# @' X" w: e2 n& _: I$ x! J. _5 R#include <mach/irqs.h>
4 }& e; H6 Q" ]9 H1 e4 ]
; T6 e+ y) X- M1 v1 D: r* o% q9 b& u" \#include <asm/mach-types.h>6 _) B8 w/ P: L7 B! h# H6 k
#include <asm/mach/arch.h>" D; @. t, o% c' l: {, W; ]- T
#include <mach/da8xx.h>7 P; M3 C% w, o
#define SYSCFG_BASE 0x01c140008 C1 ?" X3 b( x. u5 A, G9 f
#define PINMUX1_OFFSET 0x124
" c0 `+ a" Q2 d# q- R#define PINMUX18_OFFSET 0x168 . Q3 c/ s$ b( Y9 D; R3 F
#define PINMUX19_OFFSET 0x16c1 M- w- d5 n ~1 c" Y2 S: v# M% R( B
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
$ E" {. M6 [( A#define RCR_ADDR 0x01D1100C //MCBSP1_RCR( [7 Y1 h% u* s% b
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
5 q( h! O1 a5 |2 U3 d#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR$ S, @+ v9 ]5 e( d
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR8 o2 f. _* G) B/ h$ {- N
1 Z; Z. b' ~; B0 V8 ^#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
/ D' d6 r# T+ Z! t3 T#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
$ {8 l# c" d8 g, o# _( a//PSC; ~% G+ Y4 J1 ~, a) |( }: \
#define PTCMD_ADDR 0x01E27120
A% X+ s1 v: k#define MDCTL15_ADDR 0x01E27A3C
/ M, ~/ d2 I/ V5 I- i* {+ D3 u#define PDCTL1_ADDR 0x01E27304
% k0 o1 ]* T( Z! f//GPIO8 direction; n d4 _6 N9 Z
#define GPIO8_DIRECT 0x01E260B0! v0 B, ~& x3 C
#define GPIO8_OUT 0x01E260B4
4 M3 N ^+ S' v#define GPIO8_IN 0x01E260C0
' c4 T% B! N7 ~0 N8 Y U; a' o
' } t) ?& R( X0 k+ M//#define MCBSP1_RINT 99
' [! v, |0 i4 E+ b//#define MCBSP1_XINT 100 $ P; l, Z+ h# u, }. d
static int MCBSP_MAJOR=239;
% o% d% V& ^* K( Ustatic int MCBSP_MINOR=0;8 Y4 H! Q8 @, ~
static int count =1;7 A' J( A1 D0 S$ ^4 a1 F h
$ X- }5 z9 B& y6 m3 {% I8 f#define MCBSP_NAME "MCBSP-device"
2 J; K1 y: C5 c! M" ~; H5 s0 k% u) W
static struct cdev *mcbsp_cdev;' w/ B6 O. x5 D& \3 X
static struct class *mcbsp_class;
9 ]2 O1 V$ `, mstatic dev_t mcbsp_dev;; [% }# ?. F T3 D
unsigned int DRR_data;
. |" p3 O9 a# L; M: ~! Z8 tunsigned int DXR_data;
) T! x: p8 T& n4 C- Y4 F. U- Cstatic int mcbsp_open(struct inode *inode,struct file *file)" a6 N+ ^. c9 w h0 V" A
{
6 D0 f( |# j- G/ ]' B9 z
' r5 _9 J! k* v2 r //interrupt enable,initialized' }' E5 ?2 U7 Z$ n
unsigned int temp;
$ S9 C/ I& m& r% l //SLEEP_EN(GPIO8[10])---0
$ o: W/ _' W: y- _6 S temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
S3 X" G* L# K+ `& \' F5 ?+ T h& B temp=temp&(~0x00000400);7 |3 ~3 V8 C$ S$ E: I
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
3 j9 o, M9 ^+ }7 X6 K( [2 J //RESETn(GPIO8[8])----0----1; H2 F( B5 }9 A- U2 q
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; W3 i" Q3 C t4 g0 e0 e3 v temp=temp&(~0x00000100);, f& g& \, |6 `% k
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0/ b# l K9 I# a: q
udelay(100);$ l7 E' l) q3 p2 o4 E; I- Z* o
temp=temp| 0x00000100;4 S: X5 f* G, o% a
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
$ ^+ o% B5 h" h# U- z udelay(100);
% V+ q5 G) ?, R( { printk("open success!\n");8 z N5 p/ j9 x& m) E
return 0;; H* e; o: Z1 | Q! E" X& E
}- _% I$ {' M; L7 W
% S$ `$ `2 s# H e2 U( k2 Q3 J- s! bstatic int mcbsp_release(struct inode *inode,struct file *file)6 p+ V* z- ~% ? d0 y) d* N5 s; X" k' x
{6 @8 l8 I2 [* V4 n& ]& _
printk("release success!\n");
: \ Y8 P% \( {! X return 0;6 E1 A T" q% V5 b8 v
}
( Y$ ?/ ?& ~- S, q K% W
, Q# J) o5 B! |! Sstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): c1 T/ Q: b7 M, R
{' b" p% |9 ]& W" i4 n3 F+ c/ `
copy_from_user(&DXR_data,buf,len);7 K( M: J/ }6 r# f
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 4 Y# F, C V2 L7 G5 T
return 0;+ k. ] n8 f3 T& d- P% ?6 m
* H$ y- C9 ^( p" y- m}! ~0 R. V0 W- j" k6 r* L2 Q# k
P: O6 M3 ^' Rstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 k% j7 A4 ]8 I
{
: o9 F& ?* w( |+ r" W# x DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) P5 [, r9 h. Y6 m l( h7 @$ L copy_to_user(buf,&DRR_data,len); $ ~( q' ?' ^1 g
return 0;; r8 M& o( O& R: m+ {8 J+ C+ H
}$ E% c$ t' z+ [. O
3 P1 |4 c6 m$ [) M) `1 F# F: q- e1 R# n
static struct file_operations mcbsp_fops=- d" l" t' t% [! V- f V; a! a
{
5 j9 c1 D3 j. f1 a$ r7 C .owner=THIS_MODULE,5 j8 v2 }& e5 p' I7 ?3 w
.open=mcbsp_open,2 p G* B2 b4 {6 P# ?5 z
.release=mcbsp_release,
1 d" S$ t# ^4 c7 T3 p9 ~% w .write=mcbsp_write,6 ^9 |1 a! T; V" B" `8 w
.read=mcbsp_read,
# ?/ e1 C% @) @; r6 n7 y% j};
" ~3 h9 n$ I6 a/ [0 A# H/ ostatic int __init MCBSP_init(void)
( A$ G+ S, C( M' U6 G{
8 o$ u' U d) P! L int ret;- ~) Y* g7 u1 K$ v
unsigned int PINMUX1_REG_old;
- C" R- y) D E4 _ ]- Z0 a unsigned int PINMUX18_REG_old;& i7 R {+ o1 z" Y
unsigned int PINMUX19_REG_old;
6 i$ X9 h- i# E a' ], l unsigned int temp;
! C" f2 n3 [& W2 L3 V if(MCBSP_MAJOR)
' h% z" i# K! d' k% h' { {
8 |( \1 |; ~8 {# q* K* k( M mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ {9 ?- u: X8 s5 O ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 v0 N7 o8 \5 j/ s- e: b( E
}
! m+ i' K- g5 T) g2 Y, D5 C" | else
& R$ P6 O% ^. w( |+ X; P {
; Y$ y: C0 ?; d0 | ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
0 a5 C0 {$ n I5 @- | MCBSP_MAJOR=MAJOR(mcbsp_dev);
) |! f7 u* e. m V& r% |1 E }8 s+ j+ x" ]2 D% [: I( e; Q
( t/ o+ J/ W; O. p8 K if(ret<0)2 c' {/ C5 e2 w2 n" s5 m
{: |- P# L* Y& g/ g8 E z3 Z8 Z: A
printk(KERN_ERR "register chrdev fail!");
8 Q o- d9 g1 j# `" E. F4 [" A return -1;3 K' b8 E) v) [, Q
}% c( O; b$ o/ p* Q
2 ]2 U4 b2 Z0 `5 q$ U mcbsp_cdev=cdev_alloc();
! j' t* R3 O; c( M
) \9 l" J Q# }' o9 N if(mcbsp_cdev!=NULL)6 @5 c E& w) Y2 l
{
# q: c' w$ t* |8 r A, ?6 V- B cdev_init(mcbsp_cdev,&mcbsp_fops);
9 u: P! U7 w- B5 N" i0 U" R% i mcbsp_cdev->ops=&mcbsp_fops;
: {2 a3 H# [) f8 e mcbsp_cdev->owner=THIS_MODULE;
+ N1 U5 D# f2 i$ r) Y 1 y9 p! R/ Q& O4 b2 n8 H- Z% v
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)); H- A- G$ j1 J: b* ?. c L( u' \
printk(KERN_ERR "register cdev fail!");
( e3 V' e! M" r3 z* c* h0 k else& n6 O5 { ?' e( {. t. h
printk(KERN_ERR "register success!\n");, C* w( t2 k3 u+ z6 T
}
+ ?) A; B3 p- c2 f B else
}" m! G$ q4 b5 X7 ^+ ]8 c: N {
) \/ u& J# a# w/ A6 b% W1 S printk(KERN_ERR "register cdev err!");; I+ i; q6 w- _) {
return -1;* W% v2 a# Y! a# D3 G7 \
}- d0 p2 j4 s+ g' R/ E% T. P
) }6 [: a; w2 h. z( _ mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
) Y, ]9 N7 r# F% h2 u9 D if(IS_ERR(mcbsp_class))
, Y- d8 [3 f/ V8 m [! A4 n- l {1 \" r8 A" b% h4 [
printk(KERN_ERR "register class err!");7 d" ~8 s; A8 k( v2 \ h
return -1;! r2 G: N% X# @5 ~! U$ u( a
}0 J, @% ?( e1 g, _
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 K" y% y) I5 z% l) w5 B4 S' y8 M$ A. i3 D7 o5 f0 ]$ h4 M
//PSC+ ~; T3 Z2 l' _6 c' c
//add Enable MCBSP
, \/ o2 @% x3 z# y; n6 |% d //test
' Q: e# ~7 N3 N0 _4 K) v temp = 0x80000003;
+ M; r& N7 V& ?, \0 b/ R+ } writel(temp, IO_ADDRESS(MDCTL15_ADDR));1 g$ j* `/ C3 ?: M8 Y; Z% }. e
temp = 0x00000003;
' ]' _# q1 c& C) G: A writel(temp, IO_ADDRESS(PTCMD_ADDR));
0 c0 f! O: O! O" V, C
+ H' B( @; q3 [3 Q0 `3 i' N7 v temp = 0x001FF201;3 B! K! \; D) X; @
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
& A4 @* \) @& C9 r% I/ }1 o6 O $ U6 e6 T# B0 v0 L* A n
//PINMUX
+ C8 b) @3 C/ S+ J7 F) U( ]/ X; } //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 l4 T4 g2 g, ^8 k PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 4 M4 N& |4 R) t& E' u1 l1 g, G% C
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
. G' T A# O: n) D6 o2 ~: q writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
: ^+ @$ s* y* A- U ( I8 }" a( g6 f) ?) P9 M5 v
//SLEEP_EN,EPR,L138_SHK1,L138_RC5 H/ k2 \1 T6 V$ d5 S
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ! a; A6 i7 v+ o) v! E1 S7 o
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 1 X; Z' u$ I+ ^. x) T
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: A$ ^# h5 R! H5 L0 {0 Q
2 T8 H- q0 s: W! v0 ?4 _$ B //RESETn,L138_SHK2
6 A/ ~6 H$ B/ u1 k, Y PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; l. R( d# r& }/ _5 O PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
- K; e2 X4 K( Z$ W! S- H; } writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ ~% R: U4 z7 `0 G; h$ v" E# k5 @ ' D2 n q( Y p
) ]! m( B& U( _ //SPCR Register* q! ^* Y' h3 v2 A% Y/ F3 h+ p9 N% \
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
% z2 X3 m. E7 E& U& x: T temp = 0x03000000;//(DLB=0)
8 d& M5 i1 [1 Y3 b. W // temp = 0x03008000;//(DLB=1)9 s5 R1 A$ l- n8 [0 H, P; W
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
2 {" S4 i9 p! ]3 K# c6 T temp = readl(IO_ADDRESS(SPCR_ADDR));
, e4 J6 E4 h/ l( ?- l2 [ printk("temp=%x\n",temp);
8 q9 }' ]% r* F9 z) b8 ] * Z% s4 E' W+ G7 M
//PCR Register1 F6 q! b2 t( s& X7 A0 y( g7 K$ J1 ^
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 O5 M; U$ B$ x( D$ W7 r
// temp = 0x00000F0F;
9 V' w0 L# Y* \" V+ @* D5 w8 e temp = 0x00000B0F;& [+ b9 z: u- c: {. N
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
' E. M- X- l/ y1 y3 l' K temp = readl(IO_ADDRESS(PCR_ADDR));; p: Y& Q- c% f
printk("temp=%x\n",temp);
# ?0 `+ J9 N ~$ f6 E1 z) M7 W //SRGR Register
( O5 m: |3 Y: Y) {$ y# l //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: E( X4 v8 [- a" _3 m- J' c* F //temp = 0x301F000B;5 u% U& t& q. m1 C
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
1 {4 L5 E. Z, J9 B4 G temp = readl(IO_ADDRESS(SRGR_ADDR));
) N) A: }& ]; @( s' G. g2 S printk("temp=%x\n",temp);
( m& S5 a2 X0 k' d! z8 j //RCR
' ?; p r/ [/ z3 t //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,' p* y3 x( @1 Z7 }' c
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-08 W" Q% q( D3 S
temp = 0x00440040;( f; E9 V/ ?/ u; P5 I0 W# i$ H, B9 a
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
3 E/ ^2 k; x8 [2 Y! i, X: X' @ temp = readl(IO_ADDRESS(RCR_ADDR));. F$ M: f- {1 a. z' H T
printk("temp=%x\n",temp);0 h* N6 R, d+ D1 } D i" n
//XCR
3 g7 E0 O/ i$ o //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) A; y& I- f- f u% `( J
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
T! Z3 F% y) K. r temp = 0x00440040;
# i4 o/ x- \6 k' x1 T5 G writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ; p, U" j$ `; D9 D, d0 i) b5 h
temp = readl(IO_ADDRESS(XCR_ADDR));$ V; h& ~" l$ Q$ A) I% G) k: h F
printk("temp=%x\n",temp);
. R( P6 G7 m, r2 S6 u, r8 @5 ^ udelay(100);
( U" W0 r- C- K/ p7 d$ c //SPCR Register4 ?; b! T' z& F8 q% n* u
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 ]+ Y) [, p+ f, Q& O, V4 q9 I temp = 0x03C10001; //DLB = 0 VS DLB = 1
8 v9 Q8 [+ Z# x( c writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled9 e* c0 @8 |( {1 ~
temp = readl(IO_ADDRESS(SPCR_ADDR));
9 v' u% q5 [/ {% l% w printk("temp=%x\n",temp);
{ d8 T( R5 g2 F% } udelay(100);3 G7 [+ i6 H4 w% i
& {4 w/ Z! \; s4 I6 Z& u //set GPIO direction# d4 o9 i' h; P0 s# v$ l
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));% z5 d& t7 {/ E% m4 l
temp = temp | 0x00000100;//EPR----input
3 k# \9 h$ d* T# V7 v temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output, {; J' v; n- P
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 I. G, d i1 C& c$ L' z* X; ^
3 o2 {8 y2 s. A7 z: A+ q5 {# n6 m
return 0;4 f# g( w6 Q% o2 b
}
8 ^2 d% X2 B: z7 e3 D/ u0 Hstatic void __exit MCBSP_exit(void). V: t4 O) L& j( G. m5 W7 G
{$ U9 K# f9 X! F
printk("mcbsp chrdev exit!\n");8 B0 f4 A) J& z5 P0 j
cdev_del(mcbsp_cdev);
- n! h4 _" c% ]1 e8 X0 f' ^' n unregister_chrdev_region(mcbsp_dev,count);9 ]4 y6 |/ i4 j: L% s: J
device_destroy(mcbsp_class,mcbsp_dev);- ^9 b2 `2 y4 c7 O
class_destroy(mcbsp_class);
4 {: u( g% H* S4 K}
* F& J5 x, b) W1 F9 zmodule_init(MCBSP_init);& D3 r1 D j; E$ F/ J! n* o+ I: E
module_exit(MCBSP_exit);
1 K* S% V$ k8 y6 @7 _( t
% n$ h: T+ f5 T: D, bMODULE_LICENSE("GPL"); X, _ d: L" o/ F9 Q
, T* u& Y# e" V4 L1 @6 U- z
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。4 F1 B/ d7 B7 n B1 J' ~* q5 i
我的应用层的测试程序如下; o; i( j% @" D9 w) t1 ~/ ]
#include <stdio.h>3 ~! a2 ?7 L" R
#include <string.h>
" T6 r# d9 x0 j0 I3 z; M#include <fcntl.h> o% f$ c9 k: }/ i2 i& w: S5 `: l
#include <unistd.h>! f+ N, a, x+ F/ g
#include <signal.h>
0 V+ I* H7 c t- ~6 m1 e#include <pthread.h> //线程
/ [ u) g) A% R9 ~# H#include <stdlib.h>9 @8 l, Z% _: ^% L+ v
#include <pcap.h> //捕获网口数据
; E/ e# X! A4 D; i#include <semaphore.h> //信号
- ~' a! \& A( Y. ~4 w1 ]#include <sys/types.h> //消息对列* D3 o% |' I; x
#include <sys/ipc.h> //消息队列+ `1 ]/ [* e* I% d& S* ?
#include <sys/msg.h> //消息队列5 ^# [& H2 n. N$ B/ r, o
#include <sys/select.h>
5 e( p6 ^8 I7 _7 r#include <sys/syscall.h>: H/ \" R+ z, J( m: t! Y) Z
#include <sys/stat.h> G* P" ^ h/ x: J$ y4 j
#include <sys/mman.h>0 p4 g- l9 _0 z: R4 Q) o" ?) Z
#define msleep(x) usleep(1000*x); O" K! Y, M2 J" Y; \# n
) ~9 T% i5 w# ^. D" k, k' sint main(); |; I1 o) i5 |! r+ c t9 _8 q( G
{ / K; B: s' c9 F
//MCBSP,ARM与AMBE2000交互设备8 b4 {+ Y8 q7 U! U' ?6 m
int fd; a. \( S& [- p
unsigned short data_write = 0x5555;$ u7 N; H7 H1 m8 |* n4 X) d
unsigned short data_read = 0x00; g/ H5 a2 V/ N8 e, [
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ S4 L; B# s4 G% y2 r
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
) t- o& u% ]: E/ s/ s' J
* V3 S7 a) [- ^$ H1 r6 N2 v if(fd < 0)
9 x) b- p( p. I) Y/ {% F! @( e {3 g6 ^/ ~3 b- S
perror("open failed\n");
4 k) N+ q8 L, A( u4 L! Q% L. T5 N return -1;
: Q' c7 f6 }9 h9 U) e) D6 t+ H5 t }, M k7 V! r7 P. f. x; s3 _
) A* w1 }4 A& L1 S" H! {1 x" A while(1)2 M0 i8 u* D; \$ ]. d* |
{
+ {$ T7 U- C* Z( c) o, d ) G1 Z) M* v; |. E. x8 V
//AMBE2000每次读写是24个字为一帧: r& v+ f* W% q9 z
//写数据时将数据在底层存储起来,等到中断的时候再发送$ Y: z1 P, @4 C' f0 E7 O
//AMBE2000输入数据是以0x13EC开头的
2 @3 r \( e0 g5 s* i write(fd,&data_write,sizeof(unsigned short));+ u+ U& e: F" N; D6 i- k9 f
) }: y: e0 X% U4 o- @( u6 ~7 v
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 7 Z7 _5 g' @' K4 j8 n" U1 H
read(fd,&data_read,sizeof(unsigned short));1 b- e' M1 R0 c( P
/ d2 H$ q- h0 ?; l, e k if(data_read == 0x13Ec)8 h5 T) n+ D8 p1 t' s0 J
{
9 y3 b1 M6 j. `4 _% M8 h
* I# |/ T' i$ A printf("data_read = %x\n",data_read);5 Z" ?: d3 M8 c6 P* T# S* s
}# q$ r: b/ C% k/ w2 S3 n
: |8 a3 w& N# y9 t" f
msleep(10);
( h/ g% g0 f J% K - c, J# }+ A2 E% S
/*: u: A* S: j& U0 P5 O
ioctl(fd,1); & s4 z/ P% v p' r7 P
sleep(1);
+ D; ]9 `( u$ ` ioctl(fd,0);7 P* P- P: Q3 u# J8 a
sleep(1);
' @9 K7 D0 P* x* }7 O4 Q */
! y% _1 `- x/ j! R+ F/ @' g0 R } " x6 p4 n/ n0 ]
return 0;
8 O- H2 b% l7 l
/ j. J- W- }9 u) D$ F G6 d}
& C9 l' T9 u3 S0 Y) U# J- l" i" c, a- }% ]
多谢各位指教,谢谢! 急; q, _' x2 {! H1 q
( k6 ]6 `9 L3 B4 O
' N2 c4 O, |8 l
& b# k" h8 r! F$ g! F3 r3 i4 K
" u( R/ h. n* d8 ?- f! W
" `: i. {: l- y
|
|