|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
. ^0 O# v* p# [2 {/ t! ] \- Z/*0 a3 K3 u; ~; G1 j2 q N
* Copyright (C) 2009 Texas Instruments Inc
6 M7 h0 b y9 K! r& p *) f2 ~" |+ K6 l' m$ X5 @
* This program is free software; you can redistribute it and/or modify
9 J% s8 W) M9 D1 Q. B2 l * it under the terms of the GNU General Public License as published by! e( H5 `- q# t7 H
* the Free Software Foundation; either version 2 of the License, or
4 Q0 G1 c: V2 {! u * (at your option)any later version.
6 ` Z% g( q- I2 p; }) E2 Y *# z+ ^: o" M+ n
* This program is distributed in the hope that it will be useful,
1 ?- u: q. [: U0 w8 D5 E; a * but WITHOUT ANY WARRANTY; without even the implied warranty of
$ W8 y5 Q" Q4 v# l$ D1 f Y7 }! a8 p * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% P$ I: V% l, n. ?% k. M0 `7 N! x6 m
* GNU General Public License for more details.
/ {: d; n) P8 c5 P6 \( t *6 {8 o4 |& H6 j% O
* You should have received a copy of the GNU General Public License
/ z' j) D" I' v3 w7 C * along with this program; if not, write to the Free Software; c6 V" E+ s" q! K4 e6 n
* Foundati
5 C7 I5 U' [( q6 S* Q- R8 @*/
' m/ i; [9 [2 T#include <linux/module.h># c4 H* l6 N+ Z
#include <linux/init.h>
8 c9 D1 S- d) S; f% @#include <linux/errno.h>8 l* a4 L% f5 P3 b8 Y( c
#include <linux/types.h>( s# a1 {- q9 c2 a+ o2 \5 d6 Q
#include <linux/interrupt.h>6 T& F! G R; \3 n: S2 X6 d
#include <linux/io.h>
7 b4 Y+ w7 C7 g" \. z0 g#include <linux/sysctl.h>6 S/ e1 j0 Q5 y: t' t
#include <linux/mm.h>
) t) U* ]4 b' m1 z#include <linux/delay.h>) t; D9 r G9 G( z
#include<linux/kernel.h>( f& u/ q6 v0 b' M! [: Q1 c( k
#include<linux/fs.h>
6 X0 E6 w! J j# x9 L) T#include<linux/ioctl.h>
- k$ ]; a! `4 h- M( y7 u- t* Q#include<linux/cdev.h>
z5 `7 u$ D4 Q0 ^! Z#include<linux/kdev_t.h># b" M9 m4 @8 s! ]1 Z$ c: }/ H+ D
#include<linux/gpio.h>
0 P7 B# d% f, a/ u& h" a! T% T#include <mach/hardware.h>3 } `6 }" W) |# c8 _2 |
#include <mach/irqs.h>
& y1 U, T. l, a! u0 i
' b- D; Q& ~' o. z+ m. m#include <asm/mach-types.h>6 z2 o/ v) v5 m
#include <asm/mach/arch.h>+ g0 }5 S8 E$ S( {
#include <mach/da8xx.h>
% j* g! B1 {* Q% S [/ S8 Y#define SYSCFG_BASE 0x01c140008 F6 g- }/ l& f3 g
#define PINMUX1_OFFSET 0x124 $ ~0 F* N+ F% v0 U
#define PINMUX18_OFFSET 0x168 % n2 ^: p S$ v# h# j' s
#define PINMUX19_OFFSET 0x16c, h: ~3 m! E) o5 Z
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR D0 g4 E( z; @; N( P
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR$ ?" c7 F- c: L. M2 F0 u4 h3 U
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
( Y" K( f1 L6 b. y; s3 _) @3 A#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR5 |( ?( R' t* _; r7 P, u
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR, `) _- S1 K$ G. p3 L) s
+ X+ X5 Y5 Y2 i# e. K4 O6 V0 o
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR1 M; g; q6 r. ?0 P, E3 q# k8 a
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR9 {% q" U, h5 Z/ C1 \
//PSC
# X. }( a" a8 U' \, g8 \6 h#define PTCMD_ADDR 0x01E27120
# F% B/ v1 ]: E. f- V! r#define MDCTL15_ADDR 0x01E27A3C& m; k3 u6 Z1 g( D
#define PDCTL1_ADDR 0x01E27304 k$ z' c: g6 r
//GPIO8 direction
2 N7 ^# b1 X: Q, M& V#define GPIO8_DIRECT 0x01E260B0
) I f/ v( D/ J9 ^/ @. Q9 c* P' h#define GPIO8_OUT 0x01E260B4
|9 }) K2 j4 q% \9 e#define GPIO8_IN 0x01E260C0
0 m& ^( I. `- h+ f8 I4 `
. ^& N, Q2 S" j8 Y j& a//#define MCBSP1_RINT 99
W" ^# |% l+ o {- l0 T! [//#define MCBSP1_XINT 100 ) ^7 I6 ~' N x9 Z4 E
static int MCBSP_MAJOR=239;8 `& Z0 F3 u+ L! U) E g0 q- u
static int MCBSP_MINOR=0;
6 }8 p3 ?1 P: e! Q: K( bstatic int count =1;
. c1 Z+ t/ i; H+ X, c7 X/ S3 d# s
#define MCBSP_NAME "MCBSP-device"
" H3 F* }3 {& P$ ?$ V$ H
, c7 d; T. V6 V8 I* Mstatic struct cdev *mcbsp_cdev;! P- O0 t: Q- I' O
static struct class *mcbsp_class;0 f! F r' w2 I- q" ?. w7 y3 y9 V
static dev_t mcbsp_dev;4 ?- W" M5 {& o
unsigned int DRR_data;, Z6 f# p# b. [8 G2 C% g9 A4 f
unsigned int DXR_data;3 S' y9 Z8 l* B; y0 E8 h! T
static int mcbsp_open(struct inode *inode,struct file *file)0 T% a0 k4 a8 y7 U7 |: J
{/ A, y! ]! ~5 u
`$ e: V7 x9 C //interrupt enable,initialized
/ O8 n k0 g9 @ unsigned int temp;, p! A5 ^1 m! j: g: u! q
//SLEEP_EN(GPIO8[10])---0
( Q# u0 G w% |8 P2 t' J temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* e3 `1 ^. D) J. [9 l1 D temp=temp&(~0x00000400);( l4 _) N% S# n+ s4 F
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]! v; n) |* G O; T% I7 L, ^
//RESETn(GPIO8[8])----0----1
9 }5 D% ^7 C& { temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 `- R% Z2 [" B; g, U3 R; x temp=temp&(~0x00000100);
( Q! h9 d- x3 p2 L# l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
$ T8 C9 N6 l7 k8 B. }+ R% {' ~ udelay(100);* I7 H& _( Z. I4 c7 T
temp=temp| 0x00000100;: ]0 ~0 e' y; `
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---11 v$ h- j# [% \# Q5 u4 d/ T
udelay(100);4 G K5 p% @8 @- m# D* G4 W$ U
printk("open success!\n");
% x9 L3 }' }. ^ return 0;
& R0 U: [) e( ~ a+ k! |}8 x6 C5 `% t2 c
: `! E7 q: u; r% Y. F' m, nstatic int mcbsp_release(struct inode *inode,struct file *file)' ?5 D5 l; C9 v3 s( ~ _; I( H f
{+ }; o) W! e C4 W7 j* R
printk("release success!\n");" W# h* }5 u' a' m& N
return 0;4 @# U; U( a8 G3 L5 V" v5 B6 C
}' L' Z4 g: d. L8 T2 L) K& \$ ~$ Q
! k' q+ Y+ l7 G6 F: U) j0 j+ k/ {" Q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ {3 G. n; u( D1 F/ w4 \4 v- e{. y) D- z0 b7 S. z- Y
copy_from_user(&DXR_data,buf,len);
/ v V% D9 s0 a" p1 X" q" ` iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
7 o9 z: r+ H a, ?& I: P return 0;
% G- r8 g/ W: ]! a9 M
; x% a( Y* Q2 i- t& p4 t7 U9 S}
. ?4 K- J p& w4 u, L) W0 G. Q& v" B. P& m3 L- R
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
) D- I, ^2 y* I; @- I8 i{
7 Y) V7 y" ~3 [- \/ `$ P DRR_data = ioread16(IO_ADDRESS(DRR_ADDR)); m2 M8 v6 }6 T- s# B
copy_to_user(buf,&DRR_data,len);
2 z- J: M. h$ X# j5 c+ y. e$ S return 0;- I) l3 }) y h" w9 ~4 o4 s/ W0 s
}+ |1 D: G- K! T7 h! C2 y. M7 X
8 |2 Z; x g7 F/ t" r' y
+ r7 c; Q1 N% i# W1 mstatic struct file_operations mcbsp_fops=$ p$ A& C& m+ g: ~+ H" t
{
9 ^8 h2 x: u, j9 f! Q, o, e .owner=THIS_MODULE,' b! W( f. }( Q! f
.open=mcbsp_open,6 t2 H8 v* A% B( A% A" q+ ]
.release=mcbsp_release,
) d* L9 Y( S# U2 \ .write=mcbsp_write,9 O9 S1 b" V: ~" O7 A
.read=mcbsp_read,
i; ^6 }# Z2 i1 \+ C7 M};
( e# R. Y0 }) e6 e3 H, s: q5 Cstatic int __init MCBSP_init(void)
9 t: B% n2 m( e" i7 U2 r{/ O7 h6 G. Y: h% r0 l) n
int ret;
( w4 L& G+ u$ M: y; [: Z unsigned int PINMUX1_REG_old;/ @3 Y: a6 x% B; p8 `8 T3 I* T# \
unsigned int PINMUX18_REG_old;
( f( B) T& s' d) Z unsigned int PINMUX19_REG_old;( Q6 Z( E. j# E8 D: l3 u9 q( [& S
unsigned int temp; - x/ Z- M$ [7 m/ S5 B
if(MCBSP_MAJOR)2 I3 W& D+ b6 @% \' j/ S+ N
{
& q* \2 J5 c$ N& R$ ~3 [$ H/ D mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);# U6 F; Q' F Q) L4 t( d
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! r) h' ]# ]3 d) e; g0 N( p
}0 A5 g ^5 B" S C4 P5 @- X
else
$ X& W3 v9 j& Y, ]8 B9 r {
; I' v$ G+ m6 M! N ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);8 v" ?5 k1 p9 D) x2 c; O! ?
MCBSP_MAJOR=MAJOR(mcbsp_dev);6 V0 O* Y, V. F1 c, \) S) v; b# P- Z
}1 f" ~2 _& W1 L1 R
& i6 }$ T' C& J7 o+ g3 d. P/ P
if(ret<0)
" A. s) T: ~) t: m# h {
( S8 [7 n: ?3 \, j# `) b printk(KERN_ERR "register chrdev fail!");
7 x! L( V: l0 Q5 X! W2 h h, J return -1;
& t! u! p" k' t X! W, H }
1 X4 Z K+ V- V 6 n& S/ ~& c6 I1 t6 h
mcbsp_cdev=cdev_alloc();* @+ V# C) v( {1 [! m
+ k2 J6 _4 R2 e+ y# q. t) v1 {4 W if(mcbsp_cdev!=NULL)
7 a, A' d6 |$ C1 ?3 o3 b, d {
# h9 G" Z T7 {+ j. x cdev_init(mcbsp_cdev,&mcbsp_fops);
* X4 P& v8 _9 h2 I3 z/ k mcbsp_cdev->ops=&mcbsp_fops;
0 N) p! s* C E5 S# P mcbsp_cdev->owner=THIS_MODULE;+ F0 U. P8 d( \5 R
: A% s- O! W1 Q2 X/ r if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 H: x8 m, i. k5 C' K
printk(KERN_ERR "register cdev fail!");% [5 i. q6 y) p) s6 z$ Q
else
% A& i' K* s* D5 a3 c8 K& o printk(KERN_ERR "register success!\n");6 A+ k9 o) x) q& Q
}
4 m3 l. I' \" |: x9 [ else
* S* c* O# F# u1 _8 \# b {( T0 x- S* q, \6 e" [/ J9 Q; V+ d
printk(KERN_ERR "register cdev err!");3 E! b7 z1 o, o8 m7 l4 D/ F
return -1;) Y: {; m9 Y& Z5 V: @
}
6 h& n, k+ Q6 \1 ^( m4 a2 Q
8 K) f' P7 E8 z2 R9 p. a& q mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME); W/ C c2 K' @5 G. D4 r
if(IS_ERR(mcbsp_class))
8 l- x5 @- k) g# N( H {, V6 I( V) G& l8 [
printk(KERN_ERR "register class err!");
0 Q6 r& J! m0 w" Z/ _6 C; e return -1;% K6 I& V# P" ~5 L' G# {
}: N2 _1 E) B" g
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
6 @0 x! ~4 ?1 L K6 r% E4 F) E3 }3 R) C2 U1 P8 ^: d9 }0 j
//PSC
7 d: F' L% v C/ @ _/ z P //add Enable MCBSP
/ K8 d& J7 `9 D) E. B5 L0 i //test/ t, X. D! R- ^( s7 D
temp = 0x80000003;; z% `0 Y4 Z! W9 p8 z0 y
writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 f+ i( d q; X" e3 R5 W
temp = 0x00000003;
0 U3 C" M1 V7 i6 I6 w3 G+ { writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 V8 a% d( V4 b( u% j3 [9 ] - l2 B& F$ W( \, r
temp = 0x001FF201;, e/ s; N- ]/ X: V3 _7 F
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 C2 P1 ]( y: G9 `+ R / [2 S, x0 S9 E" X8 N3 }/ e2 z# ?
//PINMUX
8 y1 E4 `* \5 E, j0 X% G2 \, W$ A; _ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR, p4 Z0 I7 [3 J' f
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); $ O9 R8 E: L7 ~; l
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 6 X0 A2 U. f4 n2 e/ d- n$ d
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 T! @! x5 [: z$ Z
; |5 m% X2 Z0 p7 u* ^! J //SLEEP_EN,EPR,L138_SHK1,L138_RC
) ~2 q: L1 Y1 }* z1 {0 Y( } PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 4 l' p9 K- ?: N) g1 r4 P5 v" K
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
8 C V! o/ g3 t writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);/ k0 b; T5 m' H8 I
5 t( Y# k' J! o! i2 p //RESETn,L138_SHK2
) f* y! C: C) @0 X2 _: Y3 X PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); . I- D9 W- m# Q* G* C6 N
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 1 B& Q% A! c: B. u# a) j
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( G6 o' `- G5 ^/ s
+ t- \" H6 z& s 1 a. u0 t0 N) M6 k
//SPCR Register Q- V( u+ d7 D; g
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. |' S9 s* o+ Z9 }. m% f; f
temp = 0x03000000;//(DLB=0)
+ C3 h' t; {$ G' }+ K // temp = 0x03008000;//(DLB=1)
! }1 D3 k0 }( y' Z writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
7 o( F+ J/ F0 v, U, [# P temp = readl(IO_ADDRESS(SPCR_ADDR));
7 a2 |/ P; P% C& o! T7 z printk("temp=%x\n",temp);' X4 S0 L! |# n9 w; M8 C" ]& Z8 G3 g, }
6 S) x6 c$ g9 C4 o+ D5 X7 ?
//PCR Register) A$ |5 M0 K/ l/ p
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0/ P, X, j9 u4 N) d0 x- `
// temp = 0x00000F0F;
! [+ p l7 f+ A% f6 ]- f* w temp = 0x00000B0F;' C: G1 w% J' K3 T5 E
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
, Q2 x" t1 Q1 T) i5 \ temp = readl(IO_ADDRESS(PCR_ADDR));
9 H# w' a. S3 H4 j- x printk("temp=%x\n",temp);
! m, I) |" i( j0 } //SRGR Register
& t( t" @6 B, r# N/ K //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11" {5 p: y2 |1 P1 I' R4 C7 n. \
//temp = 0x301F000B;0 k% F w6 v9 z; u/ X
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 5 [- {) B6 s# Z2 E5 |
temp = readl(IO_ADDRESS(SRGR_ADDR));
. u5 [! a0 n6 S& ~4 u printk("temp=%x\n",temp);' ]; j7 C' g" S% n; g1 p7 D% e# k
//RCR
% r0 y* j4 }" g$ k. r. ]6 b //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,9 O" l6 W' |" I! M
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" r+ m$ B% B A" _& ]! m( A' G
temp = 0x00440040;
6 _: Q) R; X5 I% t' I% V writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
$ P$ C4 q {/ G& w' z$ j1 p4 T temp = readl(IO_ADDRESS(RCR_ADDR));
- @$ ]7 A) y/ f0 b7 k- m printk("temp=%x\n",temp);
/ s. i3 L: e/ [; y //XCR( c% T% h2 n# s: ~
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 w7 ~( \2 ?& [7 f; H$ K //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! c. p8 _/ f. G, x0 o
temp = 0x00440040; @% D p9 n+ T+ m$ _1 D
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
. {0 n1 W# M3 X' ?; g: {5 ]+ ^3 p# p temp = readl(IO_ADDRESS(XCR_ADDR));( I% o" u. x2 C3 S* v4 V, G
printk("temp=%x\n",temp);
' {* M# ?0 ?) i8 _2 S; d1 c udelay(100);. g z+ J) i+ N; u6 J: g
//SPCR Register, T$ m! C3 T L1 J
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 o2 v9 ~; r; b temp = 0x03C10001; //DLB = 0 VS DLB = 1: b7 Z( \) P: G' k
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled& n% `* U$ x2 `6 ?0 H/ Y
temp = readl(IO_ADDRESS(SPCR_ADDR));
\" s) t! x, ` printk("temp=%x\n",temp);
8 P7 t x/ M* y+ M4 b udelay(100);
v' x& k2 w* y% u6 e
3 |0 Z. h, G0 F //set GPIO direction+ y3 }" L, r! M$ K
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
* T8 f- R) b3 T# L- Y* j1 t$ H0 b1 @ temp = temp | 0x00000100;//EPR----input& a! I7 X$ B2 d0 c/ `; d( o
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output; I4 ?# `; _1 n4 d% `4 Y/ Z" y
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ( y" Y6 V0 }. e/ C# M! V+ ^
" G/ m7 j7 q* L m6 E5 G( ^: S" P
return 0;0 U+ C2 z8 J/ n2 |
}
9 O5 I0 n2 B1 V- O# |" k5 x% k# Hstatic void __exit MCBSP_exit(void)5 ^: Y/ r+ C* S" U% G5 M' l
{$ M5 }, c# r3 b: N& k2 _
printk("mcbsp chrdev exit!\n");
4 i& X: w- E/ v8 Z z cdev_del(mcbsp_cdev);
" l. N5 Y* i: R! G+ F6 C0 t7 U! s% Z unregister_chrdev_region(mcbsp_dev,count);+ k: c$ U0 k |$ J) f) X
device_destroy(mcbsp_class,mcbsp_dev);2 t: ^- X. x5 q6 I4 J+ F# r8 }
class_destroy(mcbsp_class);0 }4 R- {2 a. y9 Z1 g6 s
}
+ l8 q0 N0 `! k8 O0 Rmodule_init(MCBSP_init);
: l8 X* L, m+ Q M/ Y9 A/ w( nmodule_exit(MCBSP_exit);3 v# z! o6 Z4 P5 U. L& U
1 X7 t: C- N. ^5 B6 b- ]; ]MODULE_LICENSE("GPL");
' C, R" g- ^5 \ C3 L6 E: }5 X/ b, D
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
7 K. S! K1 n2 e0 v- |1 o我的应用层的测试程序如下
: A5 L( |: \, R: T6 B#include <stdio.h>6 i- Z8 \8 ~, a5 F% T [. J, Y8 H
#include <string.h>3 B' i t& y a' N+ M, o
#include <fcntl.h>- Y1 s3 J- R6 ^/ ^% B! o- Q) Z
#include <unistd.h>
$ y$ R, t7 O+ t) @% L#include <signal.h>
% C+ P; [$ `; b0 i: D4 p3 [#include <pthread.h> //线程
1 }5 e, o+ A& [* v; V6 W#include <stdlib.h>
: p7 T' y B% u( ~#include <pcap.h> //捕获网口数据0 e8 D+ O; s: F. D
#include <semaphore.h> //信号
( g; u# W' L5 n% t- V#include <sys/types.h> //消息对列( J* Q8 H9 D0 n( o
#include <sys/ipc.h> //消息队列' I O1 B6 c! K' H$ L
#include <sys/msg.h> //消息队列) C: s0 M3 t" v. e3 u: W: V
#include <sys/select.h>" Y' e5 T; p; h) W
#include <sys/syscall.h>' R, z6 l& g# A& W3 J/ \
#include <sys/stat.h>
9 L& p4 @5 h4 w9 A9 v0 _3 u6 b#include <sys/mman.h>
& x% E7 i) k; y' p* P0 \#define msleep(x) usleep(1000*x)
/ u/ ]/ E% i0 L3 p( P
3 G: ~" m$ p& J* eint main()
7 J. o }% T+ S{
8 |6 q ]; x% v2 X //MCBSP,ARM与AMBE2000交互设备
5 M# t1 E2 W a) o int fd;
; h, E3 Q5 }) d; V2 D unsigned short data_write = 0x5555;+ \/ ~) B; u2 J5 _
unsigned short data_read = 0x00;
* ? c# l. f8 t5 L. o5 ^ fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( ~8 X9 w4 `. D% l* u5 g3 T
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);9 y/ T6 H [3 D7 S# Q7 J
: N9 ?8 h5 D1 v9 Q
if(fd < 0)
" y2 Q* g. R& Z8 m7 T( h0 I' m {, N: C' x# w& s) `
perror("open failed\n"); y( v& j# a% n& A6 R: _3 @ y
return -1;
0 q( }- O$ ^( Z& T* i a }
1 R* m$ J$ W- g" F7 ] @5 N" j ' R A# Q, m4 j; @- I
while(1)# r. |! i0 f) Z+ x
{
" _8 U( M' K0 D+ } H) U 2 h+ J7 R5 I* \: ~' o" V& R2 a
//AMBE2000每次读写是24个字为一帧; {) B% r6 U8 y) k) a
//写数据时将数据在底层存储起来,等到中断的时候再发送
$ L% p8 S' k: _% f2 m, S1 m; o% n8 n //AMBE2000输入数据是以0x13EC开头的
9 L1 a: u' L/ i2 U* g5 n) r write(fd,&data_write,sizeof(unsigned short));
1 h: f8 Q% c+ v
' t7 V; B- S1 Z" t/ ?7 y //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 9 z& J" U: A/ d: ]9 i0 |- |
read(fd,&data_read,sizeof(unsigned short));' P# s* {3 H+ j. B
3 D! `- D# X. q if(data_read == 0x13Ec)
+ Z1 `" R% }/ j1 N; O9 h3 \ {
, d& B1 _5 R4 w: d 1 ?9 Z: g, c9 E8 Y$ z
printf("data_read = %x\n",data_read);
* P1 w4 R5 O1 a# b8 @ }
7 ?8 ^7 ^ L$ s- K, w0 a. l% ]
# H1 v6 a( R8 L3 q$ Y msleep(10);
. ~. A$ G( o) v% B 9 _, [. n3 k: d7 b) v5 x
/* k$ L! K% N( ?" a0 k
ioctl(fd,1);
2 W4 j7 b) V0 V7 { q" K sleep(1);0 N( I, A5 [( V1 U c& e0 m+ B
ioctl(fd,0);
: p) e+ K$ e5 U7 o7 _ sleep(1);
0 v3 E& M5 K3 E; `1 ?2 Z1 N */
% a+ @) C9 i/ D, T4 W }
( j2 K0 _! \7 }& r2 S return 0;
( T h5 F5 b& t2 c6 } ; T2 O6 e% ?& i! D. v Q
}; Y/ F, N" r5 ~
/ Z+ \" `+ x5 d: o, O8 q多谢各位指教,谢谢! 急
& w: K% s/ y6 b0 G* N
9 ^& P3 e) L: `$ d9 x( J! t& G" W, f1 p0 q
6 j4 D* @ Q8 {( n1 e8 v( j/ ]. w6 M# k$ g. Z0 {
3 D3 c9 g! w) f F% X/ O! Y; P' K |
|