|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 7 {7 o! E4 t/ M) t4 y& h: T
/*
5 T; V# a0 T0 n' G( i * Copyright (C) 2009 Texas Instruments Inc5 Q. Y V; z) k; n5 F
*- `; z7 r, k) {9 ~0 _7 ]3 P; v4 z
* This program is free software; you can redistribute it and/or modify% ~" K0 i5 H& S% S& E' N9 ^2 G
* it under the terms of the GNU General Public License as published by( S. N3 ]/ t* j- Y' w6 F
* the Free Software Foundation; either version 2 of the License, or
2 ?1 o# Z* G% i1 G/ m6 s$ {' M0 { X * (at your option)any later version.
, d5 R1 K+ r! I: P9 t% d *. s+ f8 N0 ^- e1 W0 Q( i, Q
* This program is distributed in the hope that it will be useful,
8 ^4 H! E% b4 {9 Q7 d1 V' i * but WITHOUT ANY WARRANTY; without even the implied warranty of/ [- W/ Q {7 t7 Y
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the5 r/ j3 ^4 A' X3 @
* GNU General Public License for more details.
3 J! v. b; |! o( T" H *4 G. p, m1 m; d" g) j( @. E
* You should have received a copy of the GNU General Public License
( R% U5 ~0 \4 n! W! m( S, K * along with this program; if not, write to the Free Software
3 Q1 M$ C$ }& }( A7 [. ^. {) r * Foundati
- ~( S1 S( ], W8 o1 [*/: d: P, D" S8 {) \
#include <linux/module.h>4 k* d" _3 M8 r# ]
#include <linux/init.h>
/ U3 q" L1 E) M% D& f1 D#include <linux/errno.h>
r0 c& d$ y: E; x! R* I7 h+ q#include <linux/types.h>
: O1 C. N2 c0 v% g4 [, t' d1 O/ D#include <linux/interrupt.h>1 X. j6 c$ s$ I W9 W1 b
#include <linux/io.h>- X! b. \+ u0 I- g' n: D6 H: l+ {
#include <linux/sysctl.h>
& i4 ^0 L, O0 G& S#include <linux/mm.h>
# ?' Q2 j8 M& \#include <linux/delay.h>
) v9 j' u/ i" G8 n X7 v#include<linux/kernel.h>
* p P# }3 X8 L' \# Y8 F, S#include<linux/fs.h>
: m0 t9 O+ {$ Q" S$ j* m% N#include<linux/ioctl.h>& i" m7 S. `( \, @% k
#include<linux/cdev.h>
% Y+ c6 G- L- m" y9 P#include<linux/kdev_t.h>3 ?1 T, m- T1 y! [2 R
#include<linux/gpio.h>
5 Y4 E# R+ ?8 c8 U+ `#include <mach/hardware.h>
T1 X. W% B0 }1 l! r) [1 @#include <mach/irqs.h>2 v2 U. M# Z9 f/ Q! } P
/ N6 m) m' }' W0 I6 q, |- Q#include <asm/mach-types.h>/ n3 C" @' \" b9 b
#include <asm/mach/arch.h>
# F {, W* U# I1 @#include <mach/da8xx.h>) o! m, y- v. K, f/ W+ [# ~2 a* ^8 |
#define SYSCFG_BASE 0x01c14000
2 i. L; N/ n0 W1 L#define PINMUX1_OFFSET 0x124 # M: P! J# s+ ?, ~0 b
#define PINMUX18_OFFSET 0x168 . X1 o+ t- A1 h% L( g, G' M3 |, Y
#define PINMUX19_OFFSET 0x16c3 d# ~& m Y* S( p; f: A4 F
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR" ^, q5 L6 u9 {
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR& ]& D: H; `9 l4 Y2 z
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
7 J7 C, H+ w, G8 i! T3 j( o+ R#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR: B$ ]( K) a' E. Z* }6 ^
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
- t, I' ]0 H _, }/ y : y# b5 ^2 m' G) s) c5 x
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR" V+ _( R" e& }5 y
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR8 U& `8 v8 T- v, X" |
//PSC
/ O. X2 {% ^! b- c0 P# }& D' b#define PTCMD_ADDR 0x01E27120 ' ~; Y5 Z, H) K$ N8 P$ n+ M- _
#define MDCTL15_ADDR 0x01E27A3C3 {% U2 I2 Z6 u, B$ k" u% B3 }
#define PDCTL1_ADDR 0x01E27304
3 D" y- j6 g1 ]6 G' H4 X6 g4 ]//GPIO8 direction+ V$ D* \+ `/ A5 I& W+ K
#define GPIO8_DIRECT 0x01E260B06 T" m, N9 C, V2 u: S& c- X" N
#define GPIO8_OUT 0x01E260B4
! \; }: d# j* ^; Z* y# h6 e#define GPIO8_IN 0x01E260C04 u" S1 J7 E+ w9 U2 ?3 w+ ^3 D6 F- ~9 u
( q+ ?4 e, N. H" o+ y5 l# }! R//#define MCBSP1_RINT 99 # [, H& W' x3 t `4 U9 j
//#define MCBSP1_XINT 100 - c% v4 w Y4 b9 T, u
static int MCBSP_MAJOR=239;/ v, v, [$ P) [# Q" ]5 n7 D! j
static int MCBSP_MINOR=0;7 r$ l( f. e: E) A% q. F! J
static int count =1;$ e+ R7 b$ e- h0 o: @" S2 Z
2 F. m5 A7 V& m5 g4 B
#define MCBSP_NAME "MCBSP-device"
3 `. |; _ f6 u" [ p L
5 u# i( d& O" f6 \" P2 B8 B# _ R5 Pstatic struct cdev *mcbsp_cdev;* s$ r) P2 r' e' j1 E
static struct class *mcbsp_class;
+ S3 I# X0 _7 y$ H2 Z: F9 {- X! I; V3 Sstatic dev_t mcbsp_dev;% u9 @7 ~, y* V v) |; Q) |
unsigned int DRR_data;' l1 F' U6 `) X% Q$ U0 f) Z
unsigned int DXR_data;
- i! \( x. q. j/ C+ ?$ q0 istatic int mcbsp_open(struct inode *inode,struct file *file), t2 w8 s7 j' k5 v( g
{- h2 I# d; N9 h: g; m
. q7 S! Z4 t* u1 E
//interrupt enable,initialized. a3 D7 l: m' |
unsigned int temp;
4 W, y, C+ @0 m& @ //SLEEP_EN(GPIO8[10])---0, K: u9 \' @8 I4 N7 C' t
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ ]/ K6 P2 h& O9 ^( z5 ?7 c temp=temp&(~0x00000400);
" K' P. c4 ~, n7 l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
7 w6 J( q- Q6 Y% L8 P //RESETn(GPIO8[8])----0----1
: W6 B/ a9 k* |# }7 v' o. k temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));% g j3 {% S1 f; t3 F% v* U1 f
temp=temp&(~0x00000100);
1 ~4 P' k( i( e) n6 A __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
, j8 v( e: h" ?2 x8 v- d: ~ udelay(100);
. p( x3 w8 i! {% P9 r8 U1 @1 q temp=temp| 0x00000100;
1 C$ |' Y: Y6 m* o2 d! V* g __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
! [4 P) w' C9 d+ D udelay(100);0 o! B3 U* G7 p5 S4 {' U3 H
printk("open success!\n");
* [# T* D( \. K5 T; `! t" { return 0;6 t' n5 ]) P0 K0 @* @) |, K' ]
}% c4 h. m2 T' Q8 u
) y. U; P8 g9 G8 {+ q1 ]+ Jstatic int mcbsp_release(struct inode *inode,struct file *file)
9 T& n c9 @, L# M4 Q{4 C3 o- _2 {, j7 Y1 a
printk("release success!\n");
8 K' U9 q% ]# S ?8 i E; T return 0;
1 ?/ s/ r3 L* x( a}1 `; e- R* s: [/ b; ?( i! y* e
% v6 l6 o; J/ F) n* @, I
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)# X U6 D8 {# t
{8 p# Q. f. L5 Q; |7 ^7 @/ T5 u
copy_from_user(&DXR_data,buf,len);
+ Q! L7 B; [+ R2 \2 s iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); # o- b4 D. ^( v
return 0;6 _/ `( }; B. }# X
) s/ V: G7 U$ ?
}( J/ H! Y b( }
. a; g6 Q# R3 L- _* }static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% @' B' T$ S( i, B0 ` j{
G" C) o1 F" q. _0 |) A% ?5 o DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));5 M$ e8 `; y( J" }
copy_to_user(buf,&DRR_data,len); , D1 f0 i- i' z: l8 c6 i4 o
return 0;8 f9 c! {6 G% y% k: ^5 c V6 K
}/ v' d" R5 y9 N! Z, @( d, O S
8 f1 w. V: N: O& e" N4 K
- x8 c+ ] Y$ y/ E! d* B: Cstatic struct file_operations mcbsp_fops=+ Y1 V; [/ H' L1 v2 P
{. _) N9 ^# r' p
.owner=THIS_MODULE,
+ r, [# ^! U! L1 Y$ ^. p7 Z% @ .open=mcbsp_open,% { ?' D; y2 m' z, a
.release=mcbsp_release,+ R6 L6 o; M$ ]
.write=mcbsp_write,$ j5 ~7 p: a! @1 q8 {/ K
.read=mcbsp_read,
5 |9 V1 O) B$ R. t6 [};! v4 E* ~& N$ F- [6 x- o, c4 ^
static int __init MCBSP_init(void)
f$ Z; \7 }" k5 X1 d- Z. z! Z# x3 ~{
" K) [. B" o5 T' S$ c0 e% d int ret;
: E, f6 V% m" z. g4 E unsigned int PINMUX1_REG_old;1 N) X( y' \9 o# P; `, @" b, o
unsigned int PINMUX18_REG_old;
4 q6 ~1 F; f* Q2 H- w5 l unsigned int PINMUX19_REG_old;
4 ^6 E. }7 r: w5 D+ Z9 W) Z unsigned int temp;
K6 _+ z+ t$ p& q8 _( g4 [ if(MCBSP_MAJOR)) A' v5 M2 T/ O, t9 S
{
2 E* D/ a. |; _8 [6 G0 u# o mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 o# r& }2 x u; H
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 o# a; u- G$ K* T" q }9 [1 X# j9 K4 x* a8 m
else+ t7 u: o& C. ?& X5 [: P: C
{# h7 V- H8 S: y9 U5 x% C
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
7 S' E# b% E8 R4 D* n MCBSP_MAJOR=MAJOR(mcbsp_dev);
6 ?4 |0 Q7 R0 ]8 [1 u; ]) p }
. L4 `1 K& I' C+ h4 U- y! Q1 L9 i
8 o# g2 v: P: M |' k if(ret<0)
! } g1 r( a5 S9 k3 P9 ]" V {
9 g7 L4 ~/ u+ `5 |5 y8 Z printk(KERN_ERR "register chrdev fail!");* k/ X/ z6 q( u; Q8 S0 N. Y
return -1;
5 z2 j$ C) D$ S1 w4 N+ K" G D }/ |0 F! V3 P( b! T0 b& @
' n! s" o s: Z8 f mcbsp_cdev=cdev_alloc();5 H. F; @3 N9 A$ q6 N1 l) G1 H
: b/ e3 v% D( |/ t$ ^; _
if(mcbsp_cdev!=NULL)) P# Y2 _* [: i! C+ {
{
2 o8 x. c( \' R% m+ \ cdev_init(mcbsp_cdev,&mcbsp_fops);
% ~0 ]1 _4 l+ p4 G; d7 T- [3 ^& n mcbsp_cdev->ops=&mcbsp_fops;
7 d( N5 H+ z7 l* A2 ^2 l- ?8 w mcbsp_cdev->owner=THIS_MODULE;
8 S$ ^) h @; p( `& { 9 ?0 f: |2 P8 o! v8 V
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
8 e: ~0 ^' t, n4 \4 U- n printk(KERN_ERR "register cdev fail!");; i* t5 Y5 D# d7 {* A% a- w' J
else
& r% s3 S, a7 C3 @+ i printk(KERN_ERR "register success!\n");" q6 J F" g! E
}6 S8 b; r `$ F! k& d) H# _8 g
else
l1 @* |6 q" i) D7 b {
. T+ f [2 Q. X8 V2 O- O printk(KERN_ERR "register cdev err!");% \' e. E; f- Q% s5 T, D# Z
return -1;( k; U8 N! H: k. _
}- `3 h; M5 r1 q: q
9 M" S. s! Z) V% n mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
8 S0 C3 v2 A* _ E if(IS_ERR(mcbsp_class))4 L }( I1 `7 ?" J8 U! s
{. E9 i# i% ^8 l; l
printk(KERN_ERR "register class err!");
' A9 H3 D- x( R+ b# P$ p, P$ c return -1;
/ L! E% R, H! A; I }
% U' W" @$ G. S, q- E/ ]- b7 } device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);! [( Z. Y) T- ?
: |% q# }$ n j: k; Z
//PSC) Z* G, M3 T, `* c8 _+ z" V
//add Enable MCBSP
, K% O6 S' |% R# v# Q& s //test
1 I$ g- f- ^: y5 l6 W temp = 0x80000003;: C2 [. q* c" U3 H; g7 W
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
0 J/ C/ \$ T: `. U1 i F7 K1 h temp = 0x00000003;
; H8 h. K$ z. U% D1 h+ O2 w8 `: ?% _ writel(temp, IO_ADDRESS(PTCMD_ADDR));
& `; C7 w: V) }6 W8 I$ }0 T. _ - J' ~; Z) F% S# C
temp = 0x001FF201;
# u' L! L S! {# |3 Z6 b- J writel(temp, IO_ADDRESS(PDCTL1_ADDR));% T- a- u2 K5 k- `
/ J$ `- q: q4 v* A: F- q5 \
//PINMUX $ {0 K1 \' {; d" F4 e# V4 H
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
! q L/ z! P. A/ a PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); - X3 r& l) b# I# y& Q
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
2 w3 Z$ T9 Q" e& r. G# [ writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
# q$ E; a3 \1 p4 a
# j: ?. p" N) b. ? //SLEEP_EN,EPR,L138_SHK1,L138_RC
# e# Z; f3 u5 a" Q$ ]+ ^3 L) U PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); D4 o! l$ R2 ~. ` Y
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; I t5 ~8 F9 i+ Q' M
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 R- Y+ n3 ]* _1 z9 m ; g2 B) W K; H/ g! j. O
//RESETn,L138_SHK2* _ a7 ]5 u! C5 M6 y# S/ Z
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 5 ^7 G% Y0 J/ @" a
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ) i" N0 X& T! |
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% i8 \" a/ V# b! x8 i r% z$ ?5 H : P; w1 H, q# X+ ^1 M! U7 Q0 O3 \
: f* [, r# W6 I4 \6 O. Y3 @ //SPCR Register J. K3 H) E( _$ h
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 G. c: j E$ w9 I! S( u temp = 0x03000000;//(DLB=0)
]# Z$ W) E B& _3 A; I // temp = 0x03008000;//(DLB=1)
) T" ~, h# ? f writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset: Z7 ]" Y( r- C3 o5 \
temp = readl(IO_ADDRESS(SPCR_ADDR));
. ~. j; T: R$ c0 L1 v2 [ printk("temp=%x\n",temp);
/ A& @( l# D. {6 x% x \. e {" j! S! I: y1 ~! p
//PCR Register
c5 b, L# }% m2 p //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-08 `# y l9 h* E, R: U
// temp = 0x00000F0F;$ N" K; F Y1 k* K! u2 e
temp = 0x00000B0F;
7 `5 J4 v5 e& D7 a) j writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
9 x# N' e9 L% V0 X* @9 S- T# A2 l temp = readl(IO_ADDRESS(PCR_ADDR));. K3 p Q0 ^7 Z: B X% w$ c" F
printk("temp=%x\n",temp);
' X! V1 [) Z" F4 S0 T4 c //SRGR Register
0 V/ V1 x: O( ^5 Z8 N/ \! f //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
; e/ r. K7 l% T1 o% O3 t n //temp = 0x301F000B;
- j- M0 ^7 |/ V9 Z& m writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 7 r- q- F/ F9 ]1 [7 a$ v
temp = readl(IO_ADDRESS(SRGR_ADDR));+ U: ^* l% T0 m$ u% c% f" k* @
printk("temp=%x\n",temp);% G3 s4 s2 Y. u- M, N
//RCR
/ y, d- Q/ i, w2 y //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
% ^) |5 w! I$ |! @: s4 a/ G //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
* `. M3 k* O/ }/ H' k temp = 0x00440040;' I2 Z- u) [) Z
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
O0 s$ L# L' h; ` temp = readl(IO_ADDRESS(RCR_ADDR));- S e7 b; d7 y! S* n
printk("temp=%x\n",temp);
, O, Z5 P q# F1 Q //XCR6 ?! d, X/ i5 Z4 B
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1% U% I% L7 D2 ?3 _& O
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-08 K' F" t7 b4 Y8 F" R- f. x1 h5 P
temp = 0x00440040;
, ~: {8 M' A* k) o* ?1 t, u writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
- B1 a; J# m3 F. M temp = readl(IO_ADDRESS(XCR_ADDR));
5 O6 c5 U. |8 z: x! { printk("temp=%x\n",temp); y4 Z, f+ L3 {: ^0 F
udelay(100);# c# a0 ?( J% d
//SPCR Register# u0 h: s: U0 l
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
' k5 t/ U- A5 ^- C( d- o temp = 0x03C10001; //DLB = 0 VS DLB = 1
, j1 y0 m$ E w6 @ writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
+ E" N( @7 K5 u& ^4 u8 D0 F temp = readl(IO_ADDRESS(SPCR_ADDR));
: H e" O4 \! W# r8 F printk("temp=%x\n",temp);& \3 @$ t( E2 ^3 b- b
udelay(100);5 G6 X, o9 U- K. C+ c9 W4 p+ [
' I) `* Z0 J2 P! }7 Q+ I! O! I/ f //set GPIO direction
2 }9 B# s4 Z# X& Y7 \- P" R- U8 s& q8 M temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
4 z" q. s0 M6 Z2 L h* T2 ` temp = temp | 0x00000100;//EPR----input7 F" {# T! w3 ^' k0 T/ E
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output( \0 Z1 Y+ B( `: l& I) x
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
- x. o4 r5 {9 m. L
8 n7 b8 H/ N- \. [: M l' A9 U return 0;
( O( h! V& T) u; i3 ^6 @}
2 K1 z8 h$ R. b. Ustatic void __exit MCBSP_exit(void)
% t8 o0 e6 t9 U: B& N9 R, ?' l7 u{
6 y: Q% u9 y4 x/ W& k/ @3 c+ ?8 d printk("mcbsp chrdev exit!\n");
2 L( r/ n" M, J cdev_del(mcbsp_cdev);
$ V$ h) T, P. C unregister_chrdev_region(mcbsp_dev,count);
1 W9 e( L$ w% e8 ~0 J device_destroy(mcbsp_class,mcbsp_dev);
" C( X7 }5 R0 A9 U5 f+ e8 i( g class_destroy(mcbsp_class);- A; b7 t; I- p0 Q x8 I- H
}
% K) E2 }6 r/ ^# f8 C/ y$ ]0 gmodule_init(MCBSP_init);
8 i4 f/ B2 j& C# i }# ^" pmodule_exit(MCBSP_exit); e. e2 t/ D* F
( g- k: w1 X$ i7 _: a
MODULE_LICENSE("GPL");
- m, c0 Z- L ?" N7 e% N3 ^; ^; s5 q+ a8 a& S. p3 p8 F
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
0 u1 ?( R6 m9 n6 H% @我的应用层的测试程序如下+ `: z. y, L& ?4 f9 r" C
#include <stdio.h>+ o" X H0 H) z
#include <string.h>4 q M( Q# a0 c. w- H
#include <fcntl.h>
\" ]& @) ^; j+ s4 G1 H( u5 D#include <unistd.h>
) w+ c G$ `4 |5 z, X5 E#include <signal.h>: D+ m7 @' z# V2 j( f4 D# j Z! {
#include <pthread.h> //线程
& l! }$ R: ^: r% o' W" o#include <stdlib.h>: }" n1 Z f; |; N
#include <pcap.h> //捕获网口数据
9 Z: q' `* R$ c+ n#include <semaphore.h> //信号5 l7 e$ _) t# u
#include <sys/types.h> //消息对列0 M' t( y& j+ i) G
#include <sys/ipc.h> //消息队列' S9 |6 v+ ~ m; k" T0 u8 m
#include <sys/msg.h> //消息队列
3 E5 q2 D( B9 Z& `: r2 j! {#include <sys/select.h>
4 l) Q' [5 m% Y3 J4 R9 L#include <sys/syscall.h>
; |0 @5 t1 }9 u7 e9 c) V( Q/ l#include <sys/stat.h>3 \9 _& R- `# K2 t
#include <sys/mman.h>; \$ _: G. T' V9 U0 d/ A$ F
#define msleep(x) usleep(1000*x)
9 d) C4 s( w% _
- |' Z# M+ k Z" w4 q% ?. hint main()% ?- f( m1 L T4 O0 c/ j
{
; Y1 s9 Y1 f6 l/ O //MCBSP,ARM与AMBE2000交互设备& A- s9 N/ g' _6 \! V
int fd;; y: s! x. @% o1 l, K
unsigned short data_write = 0x5555;* e" s6 D0 F8 J1 p8 j m) t# P
unsigned short data_read = 0x00;
/ D! Z) K' v6 B" t6 X) x fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);5 g( m1 F' {1 t( z- l5 i
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);3 R0 t# } A$ c
+ E, i9 F0 P: F w
if(fd < 0)
0 e% I8 j0 C; L$ J& U& _1 _; u% l {
9 u5 `+ r( l- h+ y% M l perror("open failed\n");1 L% a/ S. M7 @! T1 Y7 `
return -1;2 N% L+ n. v3 ^% N
}
% I9 O; W& d( S: [: \! h. k0 x " o/ }& F5 y; l5 C" G+ L
while(1)
\8 d* c2 P4 r6 I7 m {
X: b( r- U$ ^7 h, }& a
; p) w6 K" q3 x3 W7 X# O" p; g //AMBE2000每次读写是24个字为一帧$ o& g8 K$ z8 V+ Y$ ~$ l" r
//写数据时将数据在底层存储起来,等到中断的时候再发送
* Q% f1 C; Y: C# _0 J5 S //AMBE2000输入数据是以0x13EC开头的0 c4 J/ Q# J$ h$ t* J
write(fd,&data_write,sizeof(unsigned short));/ D, e% u$ e9 A. ^4 z( V
. n6 P2 p4 g: [ B# P, N4 [. G //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
( o4 t! Z- _/ i+ z! X3 }* N read(fd,&data_read,sizeof(unsigned short));2 x7 a! R2 P* g: e$ ^: p/ O& C( x
: I# f6 W0 |1 W if(data_read == 0x13Ec)
! ^: N# U" h3 F+ R3 I {
1 Z$ W, A* b) c R' V- f 0 ?5 _( y1 o3 k2 W% J
printf("data_read = %x\n",data_read);) s" N0 \# g+ ?! ]
}! ^. Q6 O; l7 p2 X+ {, Z
1 w: X# p& ^, ? msleep(10);
, p2 b9 O/ ~! c) o& \0 O9 `! y& ^ 9 A0 B: F7 E3 |- h! S" W
/*5 S4 e, t" Z. w( k M, o' l
ioctl(fd,1); 5 B. b( L6 Z1 ?5 R
sleep(1);5 }% P9 j1 b T/ M" t3 {
ioctl(fd,0);
`2 p: Z! J4 |" X3 \1 l sleep(1);# i: F- U3 Q$ i: w" O: i
*/ 7 [5 q( l1 P$ @, Q6 z$ L0 ~3 v% p% `+ Q
}
0 c. [* E/ d8 b+ g; _ return 0;! T: S! f3 D5 l3 N7 w
. R4 c! K; i6 d/ T
}! U/ w5 ^* i# ?6 w
9 Q* f2 F( V8 I5 E8 d/ W3 Y. b7 X多谢各位指教,谢谢! 急: Y0 x- ?, _" N, `
- k u Y: B. E5 g- [
; \/ X; i+ M! p {. Q
, y& P: \: ^4 c
# C+ X. E: z! ? K& _( ]* ~- T. G" }* z
|
|