|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: w' G% r/ g5 D @) V/*5 Y0 Z2 a3 y. B0 I
* Copyright (C) 2009 Texas Instruments Inc
! P/ u- [) h( u5 J2 o7 a' t *
" s5 r& S8 M7 U+ u/ e * This program is free software; you can redistribute it and/or modify' N2 |3 ^. K" D4 Q
* it under the terms of the GNU General Public License as published by
( H. _5 K- R, `2 Y * the Free Software Foundation; either version 2 of the License, or
2 _5 R: M9 ^0 h' A- x* C * (at your option)any later version.$ }/ Z2 ]0 `$ M% U
*0 n# U8 H6 t8 x2 `! o' {
* This program is distributed in the hope that it will be useful,5 p5 U) H0 F; F+ _" i9 C
* but WITHOUT ANY WARRANTY; without even the implied warranty of; @7 ]( E5 o; L) m8 j* h) s+ { O- a5 ~
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8 V, w1 }& x! k4 v u+ L' B& ~& U * GNU General Public License for more details.
2 T0 V: C% f- g( D" m *% M5 q( @9 l+ S& @0 @1 T- |: P
* You should have received a copy of the GNU General Public License/ [$ F/ t6 n7 P2 T' \, B+ o
* along with this program; if not, write to the Free Software
9 D! C& X/ X" X" Q * Foundati, E& G$ Y9 N# n4 E; W8 z
*/
! j# `! ^9 K g) C0 y#include <linux/module.h>2 h7 _0 ]4 ?1 W
#include <linux/init.h>3 B; G) D8 r8 d& J, b4 [8 _
#include <linux/errno.h>
$ @& ^& X. d4 Q1 S' N K#include <linux/types.h>2 I" ~; @' y, F/ [4 C
#include <linux/interrupt.h>
+ Z9 R/ |" e1 k. y/ x$ x#include <linux/io.h>
" Q; o+ {5 p* y4 j" T2 Y8 f/ Z#include <linux/sysctl.h>6 F0 f/ R4 M* f( v1 m3 \0 }3 n7 B; [
#include <linux/mm.h>
- A8 }0 C. L; G. c#include <linux/delay.h>
( k" j/ }' g M0 f, N#include<linux/kernel.h>
0 U& b( c$ [0 P* q2 Z#include<linux/fs.h>
: B* \9 [# w8 j" ]#include<linux/ioctl.h>
1 T: F8 @& j8 I8 U% G U4 d9 D#include<linux/cdev.h>/ p; I8 S- {$ }* \% L/ {2 |9 g* p
#include<linux/kdev_t.h>
& _5 ]* { B0 Y0 I% T0 m: E3 k#include<linux/gpio.h>$ j+ \" W3 `6 B* d) |
#include <mach/hardware.h>
+ |5 o4 {, ^1 _6 N% T5 r* S' Z+ ~ l) l#include <mach/irqs.h>
/ X# O$ E7 ]+ F/ z5 f% h
) M) j& r$ S0 |$ R! j, x#include <asm/mach-types.h>
* }* D3 p/ f8 P#include <asm/mach/arch.h>
3 ?8 P h5 k9 L6 H1 \#include <mach/da8xx.h>, b, [; @7 `$ `- N
#define SYSCFG_BASE 0x01c140007 R- M. f% `# j" t) n2 I
#define PINMUX1_OFFSET 0x124 , i' }% b# A1 W9 D
#define PINMUX18_OFFSET 0x168
8 q! I. i" z3 r2 |7 x4 v3 t#define PINMUX19_OFFSET 0x16c# s) B; c8 ` t7 D' I, b$ U" g4 B
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR. D4 S+ y3 c9 M/ b
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
3 ]8 @4 I& F) l% e4 j#define XCR_ADDR 0x01D11010 //MCBSP1_XCR8 l" z2 g* ]' N- j" A1 E2 |2 r! g
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR1 u" s ^9 k; x* n
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR$ G; X* f, F2 r( e
) _5 E" ~( Q; O# M# n# J#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
8 [0 v# y8 Y: ?" ~7 W4 W$ l( H) T#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
6 t, i2 }9 q: _8 ]# d; Y3 y* Z//PSC
5 G j+ g9 a e2 J$ I#define PTCMD_ADDR 0x01E27120
m& _: X* D7 V7 L/ a#define MDCTL15_ADDR 0x01E27A3C! J! R7 h- L9 R/ s; c' A4 b0 f
#define PDCTL1_ADDR 0x01E273045 N7 n" @& S, H, T6 U# X
//GPIO8 direction
9 T& R; G( \/ v1 ^. J$ I#define GPIO8_DIRECT 0x01E260B07 W+ K' l3 B. v2 {
#define GPIO8_OUT 0x01E260B49 ?; T0 \: b: s% n& u
#define GPIO8_IN 0x01E260C0
% B4 j2 `5 o$ d+ r+ ? w1 E# Z
//#define MCBSP1_RINT 99 ! }- ]% l$ b7 @9 y/ T& K; t y* _, W
//#define MCBSP1_XINT 100
8 D; e$ i ^- V0 S* ^/ Fstatic int MCBSP_MAJOR=239;, M1 I) W$ q2 B. o7 s B& j t! O$ ?
static int MCBSP_MINOR=0;
: }. H1 Y) e Q: i6 Q6 P {2 [; Fstatic int count =1;# a# z/ h! @1 C& u" {
$ y* D, s2 t7 n, B5 o8 G7 J8 v#define MCBSP_NAME "MCBSP-device"7 z. u8 O4 t2 ?8 A. |; v' f
/ e: X$ a% ~. F. G8 ystatic struct cdev *mcbsp_cdev;
6 U( K E- r( r+ c; }static struct class *mcbsp_class;
* m( i+ y' ^( l( u) b8 Y& x* lstatic dev_t mcbsp_dev;
: r# ?2 p4 `# c/ l' t" L( [/ r4 Yunsigned int DRR_data;6 S9 x6 J3 |" G) z
unsigned int DXR_data;( v' b& N8 H# ^, @3 H- m2 v
static int mcbsp_open(struct inode *inode,struct file *file)
1 r2 `4 s' {. C1 O- ]{
2 ]5 n+ s' L9 Z2 W1 y! f5 Z ; R6 y% h0 P8 o& H* D2 F+ j9 D- `* W
//interrupt enable,initialized
% T. X! F' x. U$ E unsigned int temp;# Z8 w4 q0 \/ p3 n
//SLEEP_EN(GPIO8[10])---0$ b& X7 @5 x$ A2 ]
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ f, a8 {. L9 I: k, S8 O7 M
temp=temp&(~0x00000400);* t! W3 `$ ?. U3 W# O8 u# {. t
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: `7 g, N$ Q( a" j+ t9 j //RESETn(GPIO8[8])----0----1
) D: D8 e, R5 `! N/ { temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 l8 P: o3 P2 ?- L& R5 V temp=temp&(~0x00000100);! Q6 l4 I# Y: g) p4 R' ~
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 S$ \6 D3 c4 }( G, } udelay(100);
# h" K3 b9 [3 D0 a( @ temp=temp| 0x00000100;
6 n+ A% x! o( ?# O: ^3 P __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& m, G5 R6 m$ ]: y$ g1 T* w
udelay(100);6 y$ q6 x4 ` K: U$ [
printk("open success!\n");, B6 x* H8 T! U# r( z9 q
return 0;
- ]3 W- M" Z" [1 R0 r& o}- ~# F0 o- N3 }! [$ e) W
- Z$ R' P' m' l6 ~2 V
static int mcbsp_release(struct inode *inode,struct file *file)
5 t5 P' n R& g0 a{
! {1 M' _( M4 y/ k& a printk("release success!\n");
. N4 G4 V' U1 P return 0;* |( D2 S7 S h5 F7 _: f* \
}
r; A" m. U6 |& c L( x! _; z$ R+ b( @' n0 J. x( q! j
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)! V9 _5 o- L1 Y0 ]/ ?
{
8 \- K: U! i( J: u copy_from_user(&DXR_data,buf,len);! i; |+ b* \+ A) X: C, N0 w
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ( \+ p/ {, }" I9 i/ k
return 0;
2 f" F4 M2 c$ A/ i, Z- R1 @ ( F x, O/ U' \# V) W
}
7 A* D8 k( }" g3 |: ^% T2 C
! w d- B# g9 M6 G4 X* }! |static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)5 D: \2 s1 C$ k* u
{
8 m# u& g y- c p/ h DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
0 ` b- V" Z% v9 Z copy_to_user(buf,&DRR_data,len); * p3 _4 N% w: q d; t
return 0;/ {: h& ? S/ U# M1 a
}
1 I9 k s2 b: |4 s8 C* X- Q
3 O3 X2 ?3 S* c# a% w
; l2 t. v$ n1 f! P! Kstatic struct file_operations mcbsp_fops=
* V2 o3 p9 J; y$ r% `( }0 G& z2 X{
: q0 O& W2 s7 X* w6 }: ?" @. g .owner=THIS_MODULE,) F. n1 C/ A# b8 Z) }. q
.open=mcbsp_open,
9 E& L7 g* O4 e U$ ]4 M3 v .release=mcbsp_release,
+ \/ W, E0 k8 q9 [$ I .write=mcbsp_write,& B$ B6 v+ g i6 s
.read=mcbsp_read,5 g5 v! w0 e+ L; h( N- `
};
% z/ p" F3 w* g* Rstatic int __init MCBSP_init(void)4 c( H( t9 D( C9 k2 [# a( y2 Y" ?
{9 f5 ~, |: g- z8 z; W Y( G
int ret;
6 x; p/ W0 E$ t, C' U( s7 A unsigned int PINMUX1_REG_old;/ w! t6 _/ f. W G' u V/ I
unsigned int PINMUX18_REG_old;. V+ [5 }& l" ]
unsigned int PINMUX19_REG_old;
2 e; \ H2 ]7 m8 F' P8 J5 p" o unsigned int temp;
# u/ ^7 t4 ^3 d; E0 S% X if(MCBSP_MAJOR)6 m) \- v1 V8 O. A) ` o
{
, ]: F) w6 x/ O8 G V+ P mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);& l! E9 Q5 n9 C" Y
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
1 f1 m6 q3 e3 P0 ~! j }
5 B& H5 k3 p" |" V1 e9 L$ m else# H& x+ l/ u1 y7 Q4 U B3 l- O* x
{* M$ D% ~) J% Y! r
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME); @& h+ \0 }5 [9 j# }
MCBSP_MAJOR=MAJOR(mcbsp_dev);( x& r9 N- S+ {& N4 d
}$ t( i# Y0 r# E8 b4 N
: }: a! W( c1 ]' ]) i
if(ret<0)! p9 U5 l6 Z- [' W: H
{% p4 R- a$ `' v( R" d9 v
printk(KERN_ERR "register chrdev fail!");
" v9 l& M( J6 K) q return -1;, ?& P. L) N3 e2 @+ F+ I
}4 B0 Z) Z% H& c
! M. ]0 S" F; H& l" b( e
mcbsp_cdev=cdev_alloc();
5 {4 A& d! E- m+ X
$ A2 C6 _! @: t) ? if(mcbsp_cdev!=NULL)! i0 Z6 s7 f4 T
{
2 d; Q+ q7 M6 e cdev_init(mcbsp_cdev,&mcbsp_fops);
# Z7 r- V* B$ i8 Y) G, c. @ mcbsp_cdev->ops=&mcbsp_fops;
- H3 q% X- @7 P; ` O+ S mcbsp_cdev->owner=THIS_MODULE;
% h3 R/ [5 Y; O6 H4 O' I
0 o5 ^0 V8 T: Y d, L$ ?$ [ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))' W, u5 v. i I% |! z3 O3 _/ P
printk(KERN_ERR "register cdev fail!");
6 p2 i' U) p0 l+ @3 K else
; B3 \1 ~% ]5 o4 w/ i) w printk(KERN_ERR "register success!\n");
& p+ B% q! r; T4 O% e" p }
- |/ y% D, X' Z4 g8 s4 C else
' b/ \; R: \ U! {! Z {0 b7 K6 m, W/ p
printk(KERN_ERR "register cdev err!");
6 V2 [# n) z' k4 s- R) P" Z, W! Y return -1;: }" x- L; E3 S0 ]+ W& S
}! E7 {. D' C" _7 Q/ {
1 X( y% `* d* S mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
5 d) X+ p) y! R' u% u% ^ if(IS_ERR(mcbsp_class))( J b4 s( t0 F% p% `1 V: i
{
" z; @; A3 e( Y% M& J printk(KERN_ERR "register class err!");( M& w1 e% [0 }
return -1;
. F$ {* S4 Q0 B7 |+ g0 ^0 L* U }$ @( M: C# S5 H9 F* G* _4 j/ e7 e
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);$ j% S: X7 G7 N# ~. W+ K4 r+ W/ }
, D; y0 l/ u! m" h
//PSC" x: s+ ^$ ]# J& u0 j
//add Enable MCBSP" _7 Q% B& y5 j
//test( I5 e+ z+ E9 b) ]7 e4 O# n
temp = 0x80000003;
0 T" X# C# z6 m0 b* u; o7 x, P+ b writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# Z; ^. }2 Q$ v temp = 0x00000003;
7 @* `! X Y/ g' ^% r2 h. }4 h writel(temp, IO_ADDRESS(PTCMD_ADDR));# Y- s6 V% d" C
4 ]" B8 W7 ]2 ]. r# T
temp = 0x001FF201;' N" h, v2 Q7 e7 P
writel(temp, IO_ADDRESS(PDCTL1_ADDR));: h! I- l" ~( G; F# J E2 Y2 Y& Y
4 Q3 r7 {$ P0 `# D" h //PINMUX . h8 n" V+ G- d* _+ O0 h/ \. I
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 \: M+ o6 f" c- j, s+ H- L PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; b p# x3 u; Z; @! h; X PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 3 v' ^" q* n( t* u0 b+ w
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: \2 d! l# d1 O( @& Y6 g8 ?
+ Y2 E( \1 T. L6 b/ w
//SLEEP_EN,EPR,L138_SHK1,L138_RC
! z9 U8 \+ X( w6 ] PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); & Z$ a" |7 W8 M1 x" K
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
: O4 O' o8 g1 f% [" X3 T writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 Z' v: v& Y" l, N
9 P6 @% S( c* l9 c6 n( ` //RESETn,L138_SHK2/ ~% ^: R t# s/ ~. p& ?
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ G* b' `' `! ^1 W' U( f PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
2 F- t8 A7 Q: |! _8 z3 i# U0 i) t0 a writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);2 A- N& u+ t' K+ J
4 r M6 @5 f+ M) R l( e
6 B M5 b; {2 L& P //SPCR Register
. n0 v2 B+ U7 |8 ~9 N$ J //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
* Y& @0 O0 n5 R* t. ~0 y4 q; m temp = 0x03000000;//(DLB=0)
( b* r+ f# S. S& j* T // temp = 0x03008000;//(DLB=1)
7 w/ }" H2 o& n- G' r; A% _4 F writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% `( O# ^9 M W# \% Y temp = readl(IO_ADDRESS(SPCR_ADDR));
: e' ]! m. _. O% {8 V+ ]5 i printk("temp=%x\n",temp);
- A# B9 t2 }8 O
# c% m: c( h: f- X //PCR Register
& C7 v% Z8 D3 H- @4 f //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 i" N5 Q# E' h6 x; ] // temp = 0x00000F0F;
8 d7 H# V! D0 G$ a+ L* J1 L temp = 0x00000B0F;* F) r/ P- Z& H1 K- F
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
4 v2 h' E$ S+ u( c7 W3 M/ R/ ? temp = readl(IO_ADDRESS(PCR_ADDR));7 w- L9 h9 u n1 L- {) T" _
printk("temp=%x\n",temp); " P9 |4 D9 u& j0 F* t
//SRGR Register6 _5 i* |$ u7 h' M
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 ^- y6 e. `: `9 E: b( x //temp = 0x301F000B;
* ?7 j+ C3 \* @ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
2 j* d) n' n2 {. j- T% t6 I6 O temp = readl(IO_ADDRESS(SRGR_ADDR));3 S/ A& t: u& b" V
printk("temp=%x\n",temp);
! H0 Y2 d; E* K8 ]# M! F //RCR
+ ?/ h/ G f; M( K3 h //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,8 s! j3 V; [* W0 v. h) m a
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( ?# j5 A, C8 ^ temp = 0x00440040;! F* f, q A5 I" X4 M# E
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
5 z u2 j+ Z z* s temp = readl(IO_ADDRESS(RCR_ADDR));5 I- N; t0 K+ j, M; _
printk("temp=%x\n",temp);! q% q# ^# r6 ]3 ] M- P
//XCR
5 o$ \8 r4 ~# k5 L1 D //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
+ g( m( l p& b1 d, I( ^! U4 I r3 ? //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 z7 @ K/ R( F; x8 b8 O6 j temp = 0x00440040;
. z! C3 l; d) c* C- }5 Q6 h0 y writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 3 R$ ^ K1 i. D/ n* k
temp = readl(IO_ADDRESS(XCR_ADDR));
; z2 `, \, F* S& I' j printk("temp=%x\n",temp);
- c$ N" ^1 y; N" }! D) r udelay(100);) P+ [2 V, T6 }+ R6 Q7 d
//SPCR Register
; ?( j6 d; L& _0 c //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 ]8 X4 {; ^0 V! b- a& J' x# t temp = 0x03C10001; //DLB = 0 VS DLB = 1$ f- x: }7 H9 O* t- P3 |
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled1 \( l+ q8 Z% D- l
temp = readl(IO_ADDRESS(SPCR_ADDR));2 z7 A K! n$ v) M, s' ]
printk("temp=%x\n",temp);" H7 O! p" R7 _
udelay(100);
0 ~0 r- P% f% I1 l3 f6 `
1 C4 H+ e7 [! X3 t //set GPIO direction1 J! X9 A+ g: U0 a4 ~) W1 I
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));/ U4 Y1 m$ u4 H/ w# l o$ G
temp = temp | 0x00000100;//EPR----input
: R% z; a) j6 ?! q temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output3 f/ ?2 s, g& h/ d+ v8 o. I
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
) X; P4 G6 Y( d5 D- [8 {1 r $ y3 S/ Y! {/ o k3 e& j% I. j
return 0;( b4 u' |% p7 U" N9 }) i! n
}8 Y& `! {- h6 v
static void __exit MCBSP_exit(void)
% ?2 K5 F9 \1 p: K; h{
* o$ H) K6 E. z9 U printk("mcbsp chrdev exit!\n");
5 q6 y i% [7 n; H; g( D cdev_del(mcbsp_cdev);
) A+ s @) I3 Y* H9 u unregister_chrdev_region(mcbsp_dev,count);
" u) H4 l, X( j+ n" w device_destroy(mcbsp_class,mcbsp_dev);7 I7 X; p; ^8 O% T
class_destroy(mcbsp_class);& G8 Y- B7 c% H1 W3 a5 H
}8 @3 f2 |$ U- Z( z1 D, H/ f
module_init(MCBSP_init);3 f) J' a, @& j$ e
module_exit(MCBSP_exit);" K: Q' C: M; l1 z2 _, V) _
* w$ d" I1 C9 O3 k. H9 P6 V H
MODULE_LICENSE("GPL");
- H+ N: I$ v9 ^! r) b) m
# ?; {# {. X F; t' H$ e7 \0 Q我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 G i) Q3 H7 `7 G4 {1 h我的应用层的测试程序如下
; q/ M7 f/ V; x3 ?8 Y8 f#include <stdio.h>
" _+ ~3 [7 V( ^. s' f& k' t2 j! v! Z#include <string.h>5 F( F. S8 e* o' J
#include <fcntl.h>
2 g+ ^5 f5 I9 d# a: E#include <unistd.h>/ N7 U5 q. Q+ I' m6 c. g" `. G
#include <signal.h>9 @* E# H6 I9 t6 p! P
#include <pthread.h> //线程% E# d; A. G" `' o" v
#include <stdlib.h>
/ Q6 f2 q% l2 W. v" ^. f+ g* s#include <pcap.h> //捕获网口数据
! D6 p+ O# {5 ]- P/ r#include <semaphore.h> //信号
2 `) z+ x6 b3 F- \#include <sys/types.h> //消息对列! E, s4 m5 O4 O0 K* d. u4 @5 S
#include <sys/ipc.h> //消息队列! @% V# K: B% H; {2 s
#include <sys/msg.h> //消息队列
( e# Q! f ]- G( d#include <sys/select.h>- y7 Z: Q% w5 _- S7 O: A
#include <sys/syscall.h>
4 X J& b8 E) _$ `0 Z4 h$ k#include <sys/stat.h>( c7 r2 Q; |; {, Q6 p. B1 X4 [
#include <sys/mman.h>/ f! t3 s# G$ [8 p5 ?
#define msleep(x) usleep(1000*x)
( M5 S1 Q' M+ F5 X$ \' `- n" D3 n- J# y5 Q2 m5 T
int main()9 \, V" J8 t/ f4 h* n1 ~* Z
{
* `1 ]1 j5 r' q //MCBSP,ARM与AMBE2000交互设备
/ t. }. E( Q$ i% p( |9 X( X int fd;2 a/ m2 n3 n! f5 k9 E2 d
unsigned short data_write = 0x5555;! u9 y& H# @+ l" |# L6 Q
unsigned short data_read = 0x00;
" [3 b5 E2 r9 a9 d' E fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* w! U* e" W; f9 H/ f5 S: ]* q( E
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);; ]# G0 C- ]( D3 N% Q( v5 Z$ F
. Y5 r+ P! W4 b) M I
if(fd < 0). }+ o* y5 g5 x5 B4 L7 {2 m
{
! e. @% l' u4 v" } perror("open failed\n");- P d! y7 O: m, I% n
return -1;- g& ^; Z$ P% j! _: t1 l; G
}
* L B! I S6 `* H2 N) u. s: A
$ G4 Z. i* T, F, ^& D while(1)
: ?0 c7 _! b. [7 g# E% ]% p+ x# F {7 |$ x' T0 ~. q% A
$ N- q- Y. M, H- ~' D x7 [5 v. w
//AMBE2000每次读写是24个字为一帧1 d3 _9 v8 Q9 T
//写数据时将数据在底层存储起来,等到中断的时候再发送' q( E7 S) i8 L J% y) w
//AMBE2000输入数据是以0x13EC开头的
4 E9 h' A5 }' m6 _" { p write(fd,&data_write,sizeof(unsigned short));! v- }/ X/ ?6 Q. H! Z
M& ?; ~' M" Z$ j! S //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 $ F) \! ~; ]! |/ j/ W% h; W
read(fd,&data_read,sizeof(unsigned short));
5 `3 v7 \6 L5 J. M+ T
7 B1 f) E9 Q4 V( z+ D if(data_read == 0x13Ec)* U7 T2 j0 R% o
{1 ?) L/ B' D E: T# G1 {
1 h+ Y- {9 J! m4 R& E: h" h! r3 S printf("data_read = %x\n",data_read);1 d, t6 i) b" Q! Y2 O3 i
}
7 R3 e* N6 w0 h" E 6 W6 L$ `0 U j6 S# ~9 `& D( V) `
msleep(10);3 g( N7 C+ h# ]- ~$ `0 b0 N6 M1 t
3 W$ W* o. \' l2 Q
/*: b7 a& K/ a# \8 L+ M( l
ioctl(fd,1); 1 G; R) R2 ]# [4 X% i
sleep(1);
- k" H5 t; y$ Z1 u) N ioctl(fd,0);8 l+ m: m% u: k R }9 R
sleep(1);, c. w6 [2 b* r+ _% B' [3 R
*/
) W8 O; L# _( @; i$ i } 6 U6 o A- K: \7 D
return 0;: k% {) O C! ^, W! d' f( q9 a
E% h8 z; v! P& u+ b+ P! y
}
( P) q8 }( `1 v% ]8 F8 ]
# Q. Q4 E7 `% ?$ W8 B* Y多谢各位指教,谢谢! 急7 M" k, x: u5 R E0 x* v. M2 t! R
: W1 u( i$ j6 N3 A* ~
' o V! b5 |- r4 O- e* `; n
- V* E7 W; ^3 N( @+ A7 _1 {& n6 W- [* o& f" B3 ?
- O& x% F2 i: {1 Z# V& H |
|