|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
& v- j- R# G2 {+ ?! h/*# [; |! [/ A+ K
* Copyright (C) 2009 Texas Instruments Inc# q' R5 l, y7 p% w9 J. P( P( O+ C
*
; O; o8 } w( p% z; D9 ~ * This program is free software; you can redistribute it and/or modify8 S6 K6 s+ W z$ F7 s
* it under the terms of the GNU General Public License as published by3 x" T5 y) ?3 q# `7 C5 Q
* the Free Software Foundation; either version 2 of the License, or* E- Y6 Z9 l4 ~* p& n* \1 @! g0 i
* (at your option)any later version.
2 h" ?1 k5 ~6 `/ g: a: f *( i1 e1 h' h1 ?8 d3 `& g+ l a
* This program is distributed in the hope that it will be useful,+ ]2 r/ `; D' n9 P, `
* but WITHOUT ANY WARRANTY; without even the implied warranty of
! p9 E0 G; x2 M7 e5 c2 H& h * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 ~1 A5 g, @# b# J8 X$ _
* GNU General Public License for more details.
; W) N+ |5 N7 L, I) t% ` *8 j& V- @; o$ k _/ r- b# I6 S
* You should have received a copy of the GNU General Public License" l% f7 U+ A4 c0 w
* along with this program; if not, write to the Free Software3 g* p6 H. e5 T6 G! u3 Q' a
* Foundati6 ^( [8 a* t' v0 `+ G
*/. \) Z# L3 R" h3 R6 f
#include <linux/module.h>
6 \0 {; \* g( e/ ^, h) L#include <linux/init.h>
: \' ^) J) ]' k) N) q4 P7 V#include <linux/errno.h>
8 W* g' I; l$ `0 t; |( ^#include <linux/types.h>' @* n: r0 B4 c' A
#include <linux/interrupt.h>1 {, ^+ E# _6 x! C& Y/ {; d
#include <linux/io.h>3 k2 q: P+ a7 T. K2 ?! U# r, `' i
#include <linux/sysctl.h>
! @* c8 U4 w2 Q% c#include <linux/mm.h>
" c0 H5 E3 G( o7 _2 v+ x#include <linux/delay.h>
5 J9 C9 l' u* V. D/ E5 L7 u#include<linux/kernel.h>
8 C$ M& t; {' J* ~; a) ]#include<linux/fs.h>
) J8 H* O: s: h9 ~ l7 o' W#include<linux/ioctl.h>
/ f- q: B; W/ k& O- D) o#include<linux/cdev.h>: P! W( [, [0 S, I1 Q
#include<linux/kdev_t.h>1 L- a+ g y+ Q$ k i
#include<linux/gpio.h>( X+ m6 }. J5 L& a4 D
#include <mach/hardware.h>2 @6 }6 {2 s/ M1 T; i5 u+ H( p$ m
#include <mach/irqs.h>1 U# z( {2 `2 ]4 q
5 _- O0 C9 y6 v" L: s#include <asm/mach-types.h>
. f0 S: W* m+ c, O( ?5 m5 B" j#include <asm/mach/arch.h>
% Q* a7 a: z1 s" @" W V6 P#include <mach/da8xx.h>0 Z$ _$ g& y) Y$ |9 N! z
#define SYSCFG_BASE 0x01c14000
9 l' m. F$ z8 e; z) r#define PINMUX1_OFFSET 0x124 # T' } r0 X) S/ x& m; e2 b
#define PINMUX18_OFFSET 0x168 + m$ Z+ D& H. c4 i
#define PINMUX19_OFFSET 0x16c- N# p" q' n0 F N. o
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
. v/ Q/ @+ C! u! U; F! J3 N. l#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
1 j& D" v. `9 c. h3 Z7 R. t#define XCR_ADDR 0x01D11010 //MCBSP1_XCR: N C2 W9 {; E w1 m
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
5 c0 n9 ^: a6 `8 s#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
& |, n5 L" u. B$ E% P- H" l. V 1 ]( Z! B6 B. t; Q4 A: g
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR! Q- |0 |3 z C3 Z, C7 Z8 u
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
* Y: \3 C+ J! r6 y8 U: j& P- O& Y- H//PSC
6 T: B5 Z9 @6 n- _! M9 l+ b0 K#define PTCMD_ADDR 0x01E27120 ! `/ W f& z6 k( F$ d" U0 Y
#define MDCTL15_ADDR 0x01E27A3C
7 J8 p7 ]. o }' ^ f+ f8 M#define PDCTL1_ADDR 0x01E273045 M$ q9 b: O) L# T/ y" W; V- h
//GPIO8 direction
: ^. \5 n2 ~, K5 ^8 B#define GPIO8_DIRECT 0x01E260B0
5 t u7 Y! M& _#define GPIO8_OUT 0x01E260B4$ q/ v# |# Z" w! q' I) r5 L
#define GPIO8_IN 0x01E260C09 k- E7 u9 G3 ?# g2 G1 R
1 m; G+ W/ q5 O N
//#define MCBSP1_RINT 99 ' E9 Q# H; n, x% S, v0 B Y7 _
//#define MCBSP1_XINT 100
: u: C9 I% u2 m1 c8 ostatic int MCBSP_MAJOR=239;
- |: z T+ Z& R" ? D8 x# Gstatic int MCBSP_MINOR=0;% m# a/ t) l2 v7 F1 t, {. C
static int count =1;! \" v1 l) b# ~
/ s) Q+ f% `& C7 Y2 t* |#define MCBSP_NAME "MCBSP-device"
) |: K3 q8 E, d, U
1 V6 [0 q: O8 V3 v* Z5 {0 zstatic struct cdev *mcbsp_cdev;
9 Q& M; Y6 c, \+ Lstatic struct class *mcbsp_class;
7 T$ l$ n) s3 F/ Ystatic dev_t mcbsp_dev;" f! X5 {& i. d) d# j
unsigned int DRR_data;
% o! ^% e+ `( C& e( [- sunsigned int DXR_data;; k" g, s2 t! a' P! P( @
static int mcbsp_open(struct inode *inode,struct file *file)
s( y5 A3 m2 A# ^1 q{ L: Z" e) e% g, L# O8 k
% _6 o& F3 i4 A6 {& Z //interrupt enable,initialized& ?' a1 x8 [) p
unsigned int temp;
% M6 M4 p& x W, E" B //SLEEP_EN(GPIO8[10])---08 A0 t- V& O7 ]+ }/ O
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 \& d" @' p4 w+ a9 d& f* K temp=temp&(~0x00000400);9 u* W- k9 Q5 N) C5 a; i3 N @
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ V! i) o/ J! K) O( j6 [; X. A- M. m& u) k
//RESETn(GPIO8[8])----0----1
% T8 i6 y: o3 W/ ^- E' }( v) l5 S; O temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 U7 u! ]# k4 m) j8 c K1 O6 W
temp=temp&(~0x00000100);
$ ^6 @( F) j+ n! x. F9 @1 B __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0$ P1 F) e7 w5 w
udelay(100);
; u) ?7 K" \2 A4 \5 F3 w temp=temp| 0x00000100;1 k7 T; j9 Y) |( Z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ {) i9 c% j9 b" K; [ udelay(100);
1 R( d* F' V5 z, r7 r4 g% | U3 k printk("open success!\n");8 }# y2 G$ E( q# Y" h! s; F- T
return 0;
2 }! q6 M1 ~* d/ i e1 d5 \}
: e( O: Q: s' C; \$ @: v* r- X( p9 U' Z. h
static int mcbsp_release(struct inode *inode,struct file *file)
) S/ W% \9 m' N6 z/ x. W3 e6 `{
X; ^0 M4 H/ T, D+ j* a- R printk("release success!\n");
0 j2 m/ y( ?; s6 {8 k% L& y return 0;
; X$ }- N l, @* X4 [6 l/ R}
. @6 ^1 B/ a4 R! p6 q- G% `$ L" } G, e) w
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)5 E# C# y1 N% m! f
{
0 W/ l: s: T* G- I5 _ copy_from_user(&DXR_data,buf,len);
) N7 ?$ s, [; J! {! d+ c/ K. P iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
1 D) [" V/ `2 x% M" j return 0;/ o% N2 T, q, {. { G) c
& v: d. O' w. G0 Q3 \/ m. W" R2 }}; ]0 C* T/ {& Z% h$ x0 U* h
; f, i8 q- M7 f6 i
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 l2 L) T/ g; a9 Y/ z* X, U5 f: ]{ ' L: C+ `3 B- b' Q v6 V, @
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) i4 X p5 w& a. [' e' F# k copy_to_user(buf,&DRR_data,len);
) K. l8 y Y$ D return 0;
$ N3 n" i( x- n. Z" ?}
6 W2 l- J$ B$ J% ^# h# ?9 w1 ?, g5 ~6 `, ~; }
. l: v0 Z0 c0 C1 L+ l
static struct file_operations mcbsp_fops=
% h; x$ x* E; M1 w2 z{
/ R* [7 M1 z2 b6 K, ^# h, X8 s' ?3 t .owner=THIS_MODULE,
0 J' [0 g% p- Y" b .open=mcbsp_open,1 N, G7 x% r/ z6 B* [* h
.release=mcbsp_release,/ p4 M0 L/ P) L$ U( j: W& q! @
.write=mcbsp_write,
: E0 ^0 g1 A3 ~$ X3 h7 {/ b .read=mcbsp_read,2 k4 X* `. r$ R) s/ ?
};
E# y' n' W$ X; c; bstatic int __init MCBSP_init(void)1 Y; Y2 T7 b) K$ r8 K X6 }
{
# K5 u( j& G$ d6 @; |" h int ret;3 z6 O- P) ~9 B, v2 I- i9 T, y: y
unsigned int PINMUX1_REG_old;
- n+ J$ B5 o3 s unsigned int PINMUX18_REG_old;( Z; ?( A- B0 V2 W& w, C" j
unsigned int PINMUX19_REG_old;1 ~9 Z `. L0 g
unsigned int temp; - u0 }3 G3 e% V& G9 ?
if(MCBSP_MAJOR)0 w8 Y9 q1 I. X
{
- @& y8 r: Y$ P7 k) n0 I* o mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 y$ X0 g; e6 p! L( O
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! J- M% x% Y& N4 f# x3 c8 C' A
}) [7 I7 K. ?+ n: N
else) f J# [" ~, P7 X% C9 `
{
" M) y9 Z' G, I! z* Y ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 }0 F7 _0 q l4 w
MCBSP_MAJOR=MAJOR(mcbsp_dev);
p' Q9 }3 x2 Y! F9 T }
+ M6 f' C& J8 x9 V
5 o: F8 n2 ]* ^; ]2 i$ X3 [4 c7 q if(ret<0)) J: e, u) n3 e8 R# B% e, S
{
5 K6 y. y1 v- W7 f( D printk(KERN_ERR "register chrdev fail!");) o9 m( ]6 \9 A" e6 \
return -1;: q8 k3 Z& J( C- x% [
}
% n1 U |0 A- V, @. B. L 3 X) H0 B7 y; p; z
mcbsp_cdev=cdev_alloc();9 O4 P- A) P Q. ~( h0 a
: W$ Z! v c9 D& P+ ~
if(mcbsp_cdev!=NULL)1 a7 ~6 X9 U1 H9 C
{+ W; F" R4 z% }# r5 E
cdev_init(mcbsp_cdev,&mcbsp_fops);0 T: b: X) f3 h4 d
mcbsp_cdev->ops=&mcbsp_fops;
$ N" p, I# C x% y. f1 x6 c mcbsp_cdev->owner=THIS_MODULE;0 }: R3 D0 x8 A& c3 J1 z0 `+ J
$ d M" z5 g1 V; J2 t( @$ E6 Z if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
, [: {8 N/ ?2 b; i' G& b printk(KERN_ERR "register cdev fail!");- s7 P2 s! y7 w0 f
else
( }9 A( w5 D( a1 c& I+ M. |) @& f printk(KERN_ERR "register success!\n");5 X4 Z0 u0 t& d" x7 o5 D
}1 I& ]5 W7 x' W, m: b, i1 }
else
; y+ G' O- R% B- P: z {, p3 S# L/ v0 u0 b
printk(KERN_ERR "register cdev err!");
5 v, s! R% [" Q return -1;) |% m# {: B N7 m+ I; [
}
1 H3 y! y# {! e/ _2 |( I( v& p
2 S& {2 T+ D, T6 R! l: `" M, K mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
X) i' o# Q D( V if(IS_ERR(mcbsp_class))0 T, u2 z% F6 B. `
{
! r7 C# F% Z1 i% R, l printk(KERN_ERR "register class err!");
/ p# W4 d3 ]0 ?" X; r+ i2 z return -1;8 w) y& u% u) [
}* c5 y; {# ^/ t% y
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);' w8 D5 A8 x2 O' \
% v/ X7 D, {, w* d% K
//PSC/ v! D* k9 k# b! X' O; `* y1 j) F
//add Enable MCBSP
$ G% H: q( D/ p" w3 x* v //test
' G6 ?0 m1 ]# D# _* B" s) d" H temp = 0x80000003;& F. q& f3 N1 U
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 E* J% j! h3 y temp = 0x00000003;% f) T! Y" \8 K, v+ T+ `' j, Z
writel(temp, IO_ADDRESS(PTCMD_ADDR));
: j! w- I! _0 R. Z$ _! h
7 i9 z: Z( x8 L+ b* p temp = 0x001FF201;
F1 c3 l% b) f* C writel(temp, IO_ADDRESS(PDCTL1_ADDR));
" ^; x" K/ I9 _9 H+ U ]* E
; Y( U( |2 V% F1 Y //PINMUX , }: o; b: E4 c* n; s* s( ]) B
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! U9 n2 i8 M: X, C5 n4 i+ f
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); + u5 o Q7 s' M" v) ^# y
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
6 p6 @6 T! @$ h$ g( m. G2 Z; G) } writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);! v0 N0 V" Z9 b5 C/ f W1 }3 E1 J& M
- z: S9 S( Y& R R
//SLEEP_EN,EPR,L138_SHK1,L138_RC9 h4 Y+ u& |0 j- T6 l
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); # ~5 V5 Z c8 E' M/ F
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 8 K1 n$ O5 V. w. v7 U, \# E
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& g: X- e) x7 _8 f
/ p9 | }) T2 A m //RESETn,L138_SHK2# {- R8 E7 h1 o8 G
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 I$ b4 @( g& o) }+ Y$ O PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
. y" h- S8 y v$ c, U% _ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ B7 D1 V* x* [ i1 e0 F ( E& b0 q. K5 \: ]0 }( y7 K2 ^
4 ~1 P. d; g- j: L" S }. R
//SPCR Register
! _" w& Y* b0 q' g //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- Q6 o' P7 i* f+ Z; l/ r temp = 0x03000000;//(DLB=0)
$ q( z# c, _2 N8 i/ q* w6 v // temp = 0x03008000;//(DLB=1)) I u% W8 ~# |5 U+ \; D
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% n' F" T @5 E0 L" G7 w' u temp = readl(IO_ADDRESS(SPCR_ADDR));$ ^9 a' i S# j
printk("temp=%x\n",temp);5 g3 E+ N! i0 O* D3 a2 X" U7 t/ u8 f2 A( \
8 g& f4 L% q3 B P+ X, E3 @ O //PCR Register
% x, P2 \0 `; T6 G //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 v$ E6 E9 o! S( ?- H; T" E$ \ // temp = 0x00000F0F;6 u# P0 W9 Y s/ i& `; G
temp = 0x00000B0F;
& [0 f+ |# c4 O- w. t$ b' t/ M writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
/ R9 l( e. b6 i4 }6 v) P6 P temp = readl(IO_ADDRESS(PCR_ADDR));) h$ r# i7 p# V
printk("temp=%x\n",temp); # o& v! `: z5 N( k
//SRGR Register7 z' X2 L7 x1 p g! {& L" }
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 ^* G' V$ G- b
//temp = 0x301F000B;0 ~# v. d6 Y5 O# l3 s) S. Q
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
- S5 K1 ~/ I. r) t ]2 M7 W, j temp = readl(IO_ADDRESS(SRGR_ADDR));. ^* u5 H$ m" P8 ]. F. r% O* K9 r3 x
printk("temp=%x\n",temp);) l% p% n; N" j" l0 Z
//RCR5 j' X( p. u6 ~, c. b+ r" T
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,% C- Z3 l8 q, u
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
6 |0 j& j& c. ^5 I$ ^* y" I* B- F* _ temp = 0x00440040;
$ d2 V4 E' }6 u& c8 G/ l/ Z writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
3 z+ p" e r' C' N; n/ h# ?1 D temp = readl(IO_ADDRESS(RCR_ADDR)); N9 _) ?- e0 w
printk("temp=%x\n",temp);
# c3 Z1 D! s- \! {! e* ]: f( W //XCR& L* a! E9 u/ ]: t# U
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
" r7 x0 I+ f$ W; W& Z0 s. v //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 Z) z ^% |: W6 e" K! p( T; L
temp = 0x00440040;& F2 B7 h% N0 Z/ s: d+ i
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 7 A3 I+ s0 ^8 T1 S: k
temp = readl(IO_ADDRESS(XCR_ADDR));
9 T" i1 P; v: j4 _/ `. C& `3 E9 [ printk("temp=%x\n",temp);8 X/ ?/ o; l- @- n. K- R$ B
udelay(100);3 q# E/ k$ p0 Q3 f5 a
//SPCR Register
& w/ l# n- f8 m" Q0 ?* o( e //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1' Z2 c- l; O7 K3 \* W% r) ], @
temp = 0x03C10001; //DLB = 0 VS DLB = 1
! M. _. Y3 c0 x2 k, u writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled8 s. J3 `4 x; E$ E8 Z! i1 i2 S( ]
temp = readl(IO_ADDRESS(SPCR_ADDR));
" k) n' z5 ]9 M4 q) x2 [ printk("temp=%x\n",temp);* T% N& P" Z" P5 P9 z$ b4 ~
udelay(100);7 g3 |6 _5 A7 ?
& }+ j0 U9 _; a$ u //set GPIO direction
1 Y* C5 B U' O, U/ a9 G temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
/ @* L' K% u2 Q' Y1 \/ \0 a0 B+ E temp = temp | 0x00000100;//EPR----input
3 ~' v% l6 y4 B temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output" r# N. E2 S$ k0 w8 m
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
# X) ?( |5 Y7 \0 o& Z7 }
1 O! q. `5 ^6 {3 f7 e+ P6 `) h return 0;3 T7 N3 Y: O3 Y, W5 |* R
}
8 `, ^/ A+ z& n* M! jstatic void __exit MCBSP_exit(void)
7 M% ]6 i( D2 i{, X% ?4 }6 A$ L2 N" T
printk("mcbsp chrdev exit!\n");, o) F5 U$ O& P, ?. Y* x: D
cdev_del(mcbsp_cdev);, S2 q; B( w! b0 T$ A1 V
unregister_chrdev_region(mcbsp_dev,count);
/ P2 |4 E: W" z! P$ D9 ~- B! H device_destroy(mcbsp_class,mcbsp_dev);
# J8 z* ~! p* i0 a- a, T2 F F+ } class_destroy(mcbsp_class);
6 B9 S4 |6 G2 P" F}, P" G9 j, \+ ~) a, B6 r. S& O3 i& h `
module_init(MCBSP_init);
* I0 |4 ]& R; L( H9 ^8 o7 Smodule_exit(MCBSP_exit);
/ s! H+ k7 W- [0 V3 [; R" [: H: w8 c' c# Q/ i- N" ]
MODULE_LICENSE("GPL");
4 B$ E# E* a B+ U! Z B0 V7 l
) R# Z6 R6 O* |我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
! C; u8 k2 i3 h我的应用层的测试程序如下# l5 h, t! Z3 Y& p$ l8 }+ t
#include <stdio.h>
1 A* u0 i! ?" v5 F( U#include <string.h>( D K: p, P& K7 T( \# Y( a
#include <fcntl.h>/ V8 ]7 N' V/ Z, d
#include <unistd.h>9 \% m( E$ F9 Y; a7 ]" Q7 P6 _
#include <signal.h>
' B" }( S4 G' O) V+ y#include <pthread.h> //线程
6 g" k% V- s0 W/ |2 H#include <stdlib.h>
5 [6 C4 k: m3 i3 Y, z) V) S: {#include <pcap.h> //捕获网口数据
; _, j# U9 y; y3 O! A f& {, O#include <semaphore.h> //信号
* X6 B& O% b# ?9 Z#include <sys/types.h> //消息对列$ ^' I" O8 u" _( o( j2 Q; C. z7 n% ?5 O
#include <sys/ipc.h> //消息队列+ `/ ?% V0 K% W2 l8 R
#include <sys/msg.h> //消息队列9 q& p& a+ h9 ^+ \+ c- u4 q
#include <sys/select.h>' j9 l- c# ? m
#include <sys/syscall.h>
[+ e9 W: Z% U) i! y3 t( @#include <sys/stat.h>
; k( u1 x) ^2 `/ Q( O( t! o#include <sys/mman.h>1 g" P4 w/ i8 {+ c( { T
#define msleep(x) usleep(1000*x)) O# I) o0 [, N2 i0 T \) d5 g/ I3 Y
4 t* E8 L& Y- c e+ `, G) i5 B- sint main()/ X3 g6 q4 n9 ?& Y
{
$ D/ U- x! E; b1 o& l0 Z5 z //MCBSP,ARM与AMBE2000交互设备4 d: o% ]' E* G5 }* o8 |+ f/ N% M
int fd;
' W0 E9 n& `, v( V% w, _9 n unsigned short data_write = 0x5555;
: ]% W# @& Q9 M; j2 z- V; | unsigned short data_read = 0x00;5 q3 `+ J6 M" o" |
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ j6 r* V- d/ b: D& {. B+ N" }' u // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 q! L0 G2 m; |3 } S" I
7 t9 `( |( Z: {7 G4 H6 E( \" q" ? if(fd < 0)2 X+ J$ M9 u0 c; L* _( ]
{: U9 z" q4 ~" w8 }" i( f6 {! `& E
perror("open failed\n");' U5 r1 l, @3 a& R
return -1;
' g/ T0 W- Y+ F* U }" `9 M. ^+ k: P5 i8 n
) F% ~1 n2 ]' i+ k while(1)
; T3 U. C1 X! g. o/ M% _) U {5 M* g3 o( p$ q+ \$ t$ `0 w) R' R- N
% ?' Z- a. j/ L. _/ J5 E, U' ^ f" {
//AMBE2000每次读写是24个字为一帧
6 ` _# ~, m4 r9 l- a- g8 b$ d //写数据时将数据在底层存储起来,等到中断的时候再发送
; e2 a0 i4 B9 D' P3 v8 o O //AMBE2000输入数据是以0x13EC开头的0 \9 u5 h4 A8 M |1 B" c
write(fd,&data_write,sizeof(unsigned short));4 s2 o; k1 ~9 V
5 A% [* ~! v& ] w7 g/ ^- c
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
/ Q$ D ?- t3 s" l/ q read(fd,&data_read,sizeof(unsigned short));
& J$ C5 P) v/ H9 l9 `
$ h) E! Z! X% u2 v! T0 j if(data_read == 0x13Ec)7 D+ L# t! [$ O; T- H& i
{; I, f% v m( V0 t% j
: z3 b6 w$ L' U k
printf("data_read = %x\n",data_read);3 Y0 p) F& k% W6 M3 [
}
5 O" J4 B7 J4 v( p1 I & q5 ^5 M; P3 I5 Q% l0 U' f
msleep(10);; d2 V H1 w, H& m$ h
2 e% `- X/ s- x% q0 D
/*" [* `0 I# `; l% y ]; _) g
ioctl(fd,1); $ j, P1 ]. u1 a4 {6 U
sleep(1);
' Q& g# D# p G+ W, N% K& n ioctl(fd,0);
9 R6 }/ o" p( t sleep(1);2 m4 r+ E. [: K/ R$ l9 N: P
*/ 5 R! W9 o8 U! f) N2 Q
} H2 ^4 T2 \5 x9 U& m1 P' J3 a
return 0;
5 E8 X, M) H; ?$ m4 v
p' t0 \9 n; o1 E2 G}3 n+ p% h9 Q8 ^/ f/ B) S! r3 @) ^
4 w: o: r3 t! g
多谢各位指教,谢谢! 急0 \% V6 k' |# r+ v5 r
: \! W& w! E7 A0 ]% V* p4 ]9 v
2 ~, w7 O; }! G' s6 d0 C
& F$ N. X! A8 ]/ L: X- e8 r& W
# \% J! J5 k1 Q# n
4 v5 y& q2 L* F7 I3 W |
|