|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: / l$ T: f2 A5 L% g P
/*
2 F. c- }% Z6 |3 s. X% X * Copyright (C) 2009 Texas Instruments Inc
; W5 \$ Y+ U0 | *! y4 [. |" I, g7 x7 M
* This program is free software; you can redistribute it and/or modify* r5 v0 O/ L- A) U
* it under the terms of the GNU General Public License as published by2 H$ W" }9 D- [; V' U o
* the Free Software Foundation; either version 2 of the License, or
9 }* ?* y R/ k1 f * (at your option)any later version.% `0 n4 N, ]( m9 m
*2 N) ^ }1 M" ^$ r7 d
* This program is distributed in the hope that it will be useful,3 y' w3 w' L" o5 T
* but WITHOUT ANY WARRANTY; without even the implied warranty of
5 Y7 H `1 M1 S \5 n% _1 V, j! ~& y * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
: @2 @/ j0 b7 c/ }4 F * GNU General Public License for more details.
% E3 o7 ]+ [, l4 b+ W; Y7 v- A: ~ *
, _: z0 \7 p4 q P% z * You should have received a copy of the GNU General Public License1 X" O' u0 L' f/ y8 |# f& }
* along with this program; if not, write to the Free Software
. x/ Y4 q3 T1 ] * Foundati' W- h& d: S# z- v8 {2 \4 V o6 y, V
*/
( V- O- K, Z2 M1 h) H2 A% r4 K2 n#include <linux/module.h> ~, K+ q9 z z# d
#include <linux/init.h>
0 r C( M% Z. ^# [#include <linux/errno.h>
7 y; b [; i0 g" t, A9 G, j#include <linux/types.h>+ k9 e3 J! j. w6 W0 y/ ?
#include <linux/interrupt.h>3 U3 V, ~( l( ^. \% l! o9 x7 O
#include <linux/io.h>
6 H) B9 v4 Y0 @#include <linux/sysctl.h>3 F( u' ^! O l7 Q9 ?. ^8 b1 w
#include <linux/mm.h>( H9 F5 A. y, L- ^. x3 z! ~- i+ ^' ]
#include <linux/delay.h>
/ z& V8 `4 K, I4 V9 }2 X#include<linux/kernel.h>
$ E& ~9 Z. y8 n8 }% [#include<linux/fs.h>
) [2 Y9 Q7 |5 }6 j7 O1 m* j0 w* |" A#include<linux/ioctl.h>
4 T `0 O6 x1 ~' l. N% I#include<linux/cdev.h>
@/ C4 y7 f5 M, F8 v& l1 L" W#include<linux/kdev_t.h>
4 o$ M/ }: w( }1 k#include<linux/gpio.h>
4 Y/ t/ g* B9 r#include <mach/hardware.h>
( A1 B4 v) E) c! ^5 P9 i. J8 q#include <mach/irqs.h>
6 q" C' F0 F$ v; A, t4 B! f% d7 _2 u
#include <asm/mach-types.h>( W' W* K4 Z) O0 T
#include <asm/mach/arch.h>9 H- M$ h- e( _( {+ F
#include <mach/da8xx.h>5 E- I/ C) v& B& {: Q$ [
#define SYSCFG_BASE 0x01c14000
: I6 O' Y0 K6 E6 F! Y: _* p#define PINMUX1_OFFSET 0x124 4 d( n* P% k1 |( L
#define PINMUX18_OFFSET 0x168
1 u; F0 ^* E2 ]#define PINMUX19_OFFSET 0x16c
) x; G2 v( ]# V# K0 I! H1 v4 L#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
. W5 _7 K1 R5 V8 Y5 a: s#define RCR_ADDR 0x01D1100C //MCBSP1_RCR- J1 P9 p6 q% u) ~
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR( F( S0 z/ n! k% G3 W! r
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
% e1 f8 Z, Q( b% X. j& S#define PCR_ADDR 0x01D11024 //MCBSP1_PCR! S$ I% S- F: N4 f9 u
5 r2 m7 d9 d5 r6 L3 s3 J% G$ |3 T7 ?#define DXR_ADDR 0x01D11004 //MCBSP1_DXR& _- p1 R2 Y+ s6 T* V
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR: g( {2 j/ w* |
//PSC
6 U7 m% }+ e/ O9 \% ?#define PTCMD_ADDR 0x01E27120 4 n1 Z. L* E! c( Y9 ^1 W9 [
#define MDCTL15_ADDR 0x01E27A3C
, E3 N; M2 J! n#define PDCTL1_ADDR 0x01E273046 q. O7 N* Z; S8 a% _2 x: p5 z- m
//GPIO8 direction
6 D2 t. z! p) M! a# b#define GPIO8_DIRECT 0x01E260B0 \* w% G0 ]; D5 j W! l) q. L
#define GPIO8_OUT 0x01E260B4
& @4 E2 c! L% p+ }# P* d7 T# Y: W#define GPIO8_IN 0x01E260C0
+ B+ u; h7 x* b) y+ c2 ~8 k ?9 k4 |: C; Q1 }( I3 Q7 @
//#define MCBSP1_RINT 99
2 Y" i2 |# w5 M) S//#define MCBSP1_XINT 100
8 I' {7 J% C* P( q7 Lstatic int MCBSP_MAJOR=239;. d0 N2 C. \6 u1 P$ G9 w/ g5 m
static int MCBSP_MINOR=0;
) |. x* P$ H+ s- r( H1 Zstatic int count =1;
! V" N! Z' k7 ^; a0 ]0 m3 s1 v5 g( O; g6 o0 |" {+ f$ x0 J
#define MCBSP_NAME "MCBSP-device"4 m$ T$ a' e. q* T
; x1 ^3 n- z$ V3 j
static struct cdev *mcbsp_cdev;
/ s; E+ f. Y; {& @! m ~' w" Jstatic struct class *mcbsp_class;% ?7 E+ y, u- E1 q
static dev_t mcbsp_dev;
) w4 ]1 h' }( k$ _ iunsigned int DRR_data;6 {% Q5 r! M u# J
unsigned int DXR_data;5 e5 o% Q; f2 Y9 i/ q
static int mcbsp_open(struct inode *inode,struct file *file)
; f/ d; k, v; G2 p6 U' d{
, _& z d; L$ v" z
( }0 g, F% ?) W* l7 W4 H3 I! P! ?& t //interrupt enable,initialized Q& H1 r* R5 N8 t! R3 P" Q- X
unsigned int temp;
# R. B1 M" C' N //SLEEP_EN(GPIO8[10])---0
C3 w" z+ T4 m temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 Z! z; v9 J ~: t9 ^! z% r
temp=temp&(~0x00000400);
1 w' }7 ?. F; T" H __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]" w' G; }: f* @( _
//RESETn(GPIO8[8])----0----1/ n- g. Z: }/ f" y+ Q) u
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
* g' E4 m( b$ D Y9 J1 d; ?4 s temp=temp&(~0x00000100);0 M G/ H$ m6 u M
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0 H# h" [; f% H9 ]7 W( x8 x
udelay(100);
, ~+ A0 Y! y1 f temp=temp| 0x00000100;
( b: A s( g8 x5 z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1+ _6 \! ~6 o! j D6 s
udelay(100);
: T8 n& {0 k% z' b, Q- U0 ]; w3 g+ p. r printk("open success!\n");
. [# T9 |6 e( M return 0;2 M3 L' M1 C; l
}4 ]" v- g+ [& ?5 W; k2 _' ^! Q
! G2 W2 q6 _3 \& D
static int mcbsp_release(struct inode *inode,struct file *file)
: y+ m( Y' s8 k5 V3 q* h& f% p2 q{
1 V( R3 h3 B% E$ o( P5 ] printk("release success!\n");& K8 G, O) K! U- E) l
return 0;: Q6 y, E' T+ n4 k: e
}" |, P% L* c/ J9 t ^
$ s3 C: n1 O, ]- ?- O8 L$ hstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% x& M! u6 q9 ]{
" _8 Q$ H( d7 n# G+ \ copy_from_user(&DXR_data,buf,len);
6 y8 f% p: G0 ~) a iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); % q7 ] O6 M6 L1 P* L. _% B
return 0; q" i; e& t. w' u
: P5 ]7 S1 e$ ~! t6 c/ ]
}
3 c1 Z1 j* W* C% Z. u9 \( u( ?
) U7 D i, t. Dstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)) g" p& D; x+ u+ u
{ * c, @4 m. N* G5 `7 K
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
% n2 @- h( T+ u: D0 t% U7 z& j4 L copy_to_user(buf,&DRR_data,len);
9 Q& @# X9 u5 X return 0;
2 N7 m* X- O+ \9 j: \}2 B1 ~$ u' R4 }( q D' N. L4 _8 x
' ]3 l4 [# ]7 \. q: H! y/ {* x! t+ A. n$ c- k2 t
static struct file_operations mcbsp_fops=
+ p7 i- M# w* d' F& Z9 e{5 w( Y \9 `, ?, T. C
.owner=THIS_MODULE,
2 k1 l% K& ]) i! |7 k% R: j .open=mcbsp_open,
C' J7 n5 J8 }/ O$ B .release=mcbsp_release,
5 h0 j* i, l! t* j .write=mcbsp_write,
/ R1 v9 M- H+ j2 V+ ~+ |: y S .read=mcbsp_read,' I0 k: ], U' v6 N$ S
};2 ]4 H1 ~, V! T2 H
static int __init MCBSP_init(void)
$ _; R7 f0 A2 h9 Z{
5 C; D. I* J4 m8 ~' }+ k" O$ a int ret;
0 B9 D) M' @, S( g$ B1 K" C unsigned int PINMUX1_REG_old;) u/ }2 U/ _4 x& X+ J! \
unsigned int PINMUX18_REG_old;
8 D% W( ]4 h: t8 g unsigned int PINMUX19_REG_old;
+ O, U Y% L3 S8 S unsigned int temp;
% ]$ t3 A# l8 e' f8 @1 g7 g' [# ` if(MCBSP_MAJOR)
) M, ]$ h( E# O0 @8 f2 `4 u$ Z {
8 V$ n6 Y. B5 E) L$ D mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
8 A5 e" I* p4 f/ W ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
/ n1 q# ]; J4 J3 I }9 ~7 b6 C- H- Z Z7 O1 Q5 M6 g
else
! X& `! c3 n2 ^& i7 [+ I% y {9 q7 i0 N2 u9 g: Z& d
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
+ R% c( L0 r+ z# E* R6 Z MCBSP_MAJOR=MAJOR(mcbsp_dev);
, t' \* l8 @7 {8 Z% E }
8 a$ Y# x# K0 F' H, n" n: E
; O0 g' U3 g4 P0 \1 \3 x4 s if(ret<0)/ {7 } w: S3 t0 _: d5 f
{
% ]. I; C! w* U8 o5 G# t printk(KERN_ERR "register chrdev fail!");
9 z: J& i+ t- Q return -1;. J3 z9 W# j# p! U. ~ h
}
7 c/ n8 N8 y* f# u- L9 a# m
. ~3 G* u6 {" Q( {! ~3 t mcbsp_cdev=cdev_alloc();0 w* {0 }; z) V( T% g) \; f+ u' X
" \# ^: t. c1 l1 _, f' g9 ? if(mcbsp_cdev!=NULL)
' w: e: N/ c, A3 x) o {- O" @3 A) e, @8 O# K1 r, s: j7 r, j& }
cdev_init(mcbsp_cdev,&mcbsp_fops);
0 t' k0 t: l# t) h& }. U mcbsp_cdev->ops=&mcbsp_fops;: U3 E: Z7 I$ m9 N# D
mcbsp_cdev->owner=THIS_MODULE;( Y/ x/ H7 y/ U
- |( B+ R7 n3 v# i, p: B' N4 F" a if(cdev_add(mcbsp_cdev,mcbsp_dev,count))5 t; }) O" F2 d3 k" m, O+ L, F
printk(KERN_ERR "register cdev fail!"); N1 O, N9 v$ f- ]3 b9 k* j+ |- B
else
) _1 U/ q# w# ^ printk(KERN_ERR "register success!\n"); \9 D: y3 Z5 h5 m+ ~3 S
}% U% z2 i4 N0 q
else
# {6 |0 g5 K/ }% ~" s1 k {
$ W# m \+ _8 q, b- |: s printk(KERN_ERR "register cdev err!");9 Q5 H$ w9 A) u7 q% R- u$ E
return -1;
. ~3 }+ t t. g8 N }8 i2 N. v/ M9 n$ Y+ S. o! N& T
4 b* Q8 w1 G6 B( f
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# f3 Z( q, z9 ]4 D. ^8 u# m if(IS_ERR(mcbsp_class))8 z3 M( C$ G6 a( e6 v9 J/ n5 W
{
- T2 h4 ~1 T( D9 D, S% E( t printk(KERN_ERR "register class err!");: n V% y( g# O
return -1;
0 c+ K9 [: b# L: B0 A, `1 { }; L# w1 u' d, i' w* M
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);' f: y, a- z$ \+ F9 t; _
2 T0 W6 m+ f$ M& {) K' u# N4 K
//PSC
# T$ Z8 m* k8 V //add Enable MCBSP
+ |7 G: Z9 m: [9 Y //test
& f. z5 ~7 i4 Y# q$ N temp = 0x80000003;6 V/ Y8 l* m |! B7 ?: s0 ]: q
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! A0 }& E8 X. i% F1 Z$ [& m: g. v temp = 0x00000003;
4 H2 n9 R& T2 c+ y writel(temp, IO_ADDRESS(PTCMD_ADDR));* G5 B$ z/ t5 l2 F6 z) L' }
0 Q5 l8 R* |% p i& F
temp = 0x001FF201;% O' O: `) i/ J- [- n
writel(temp, IO_ADDRESS(PDCTL1_ADDR));) {" z0 Y. |/ x; D$ Q1 q, q0 N a
+ W5 v- a! J/ P* B( K0 c) W
//PINMUX
1 j' {3 v- I5 a$ p8 t% `1 b //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
* W4 i0 T+ F4 H* N PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ! e- O# g2 D0 e3 O- ^
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 8 ^, [9 Z, a5 A
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; Y# n, z5 M8 a3 w- Y
2 N- W+ G3 o6 L& c) {7 z% Q! J //SLEEP_EN,EPR,L138_SHK1,L138_RC
% |$ k8 }4 B v3 ?" k c' u PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 i6 U9 J( w) {# l PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ! Y& g9 j" v& E m. C7 z
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: E2 t7 l- Q- p
% M7 _7 B; P. b# [# K //RESETn,L138_SHK2
5 s# y" g6 U' f4 r PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 o9 q8 j e) t, d6 ?! J% j3 i PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
/ W9 O* I l0 |: C( f writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 S9 Y* }+ n7 ~7 Z/ }7 L: M, F 3 I% T6 e/ B0 G: _" q. R% C
. T$ t+ x. Q1 N( q. h8 i0 G: {5 H5 F //SPCR Register
/ v3 `# a3 q8 m" B) o //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
: i o7 p/ r" \4 ~2 G" N) I temp = 0x03000000;//(DLB=0)
9 c8 M- Z& {/ c2 O6 R5 r // temp = 0x03008000;//(DLB=1)
2 f7 c a2 H& U6 @3 O7 G9 V writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset& n3 }* s9 \/ I( x8 ~7 P0 b
temp = readl(IO_ADDRESS(SPCR_ADDR));
Y+ k# N/ H F printk("temp=%x\n",temp);" |4 m# @5 t2 l5 J' m) |8 V
9 M5 O1 Z3 ] Z* x! {
//PCR Register1 ~; Y+ x9 F( U0 I! \7 s! S7 Q
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
; U! S( k1 _& I% h // temp = 0x00000F0F;( M! f @1 K* A9 p+ K
temp = 0x00000B0F;8 o4 h# a' Z) d Z/ P
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
% m6 M+ U7 e* H' G- m temp = readl(IO_ADDRESS(PCR_ADDR));( _! o. x" v3 }2 ?+ E- l
printk("temp=%x\n",temp);
* V; ]9 e: Z: ^: V% Y //SRGR Register# T1 N+ N+ X7 \+ l* A# N
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 `1 {9 s8 \. G/ x! M- Q
//temp = 0x301F000B;& f( y8 u, a6 y. f
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
" c$ c3 o6 B( f* s temp = readl(IO_ADDRESS(SRGR_ADDR));
8 B- p3 C+ k, q2 B3 y: U printk("temp=%x\n",temp);
, J4 o. c+ n) d' l P1 C! Q1 A- q, p //RCR
% g& \8 e W$ {' D2 O: N //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 B0 o! \; G7 m0 X3 b% j
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-02 q' x |# {; n: u" e: i% H
temp = 0x00440040;
$ D( m* r3 S1 G writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
& @$ e* F- P& Y- [# \# w$ H temp = readl(IO_ADDRESS(RCR_ADDR));
2 P+ Q' e, b! _2 o. N printk("temp=%x\n",temp);: o6 U. f$ H& b$ E! w% C% ^5 r( D
//XCR6 ]0 ?; Z5 \' ~8 T) U
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1; \" J' o' O& j0 \7 G
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
) `% ?9 |& h+ G/ u- F temp = 0x00440040;; q, b! ~0 y. t' n2 e$ y; k; I
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
4 {! k% c5 Y5 v: E, A% B temp = readl(IO_ADDRESS(XCR_ADDR));" C: k& H' M% ~# y) ~- ?
printk("temp=%x\n",temp);
2 z- g7 ]0 D3 N3 ?% y8 M# t udelay(100);
6 t1 o( ]+ s" @. B0 u/ b //SPCR Register8 [3 r* `, Y5 k/ ?% q3 S9 S
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 k0 t: R4 U+ _ temp = 0x03C10001; //DLB = 0 VS DLB = 1
3 i- g* Q8 a/ O( h2 K! i, U# g writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
" B" f) g1 S# b/ v3 [, I- p5 A temp = readl(IO_ADDRESS(SPCR_ADDR));
' x5 F. D- i2 v1 b2 k printk("temp=%x\n",temp);
) Y! b9 h& i3 e! ]: d( E# \# i udelay(100);" y3 o, Q# R- q8 U$ i; A1 V( Y
1 n+ ~: x/ Q6 b
//set GPIO direction
; k: h4 x& S, Z- `) v6 V temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));* u& P$ v: n% Y2 c, |. y
temp = temp | 0x00000100;//EPR----input
6 B+ k' h9 M% X9 K& @+ ]) F temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
" m3 J$ O) a* p __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); : K% @, l/ j& V# f
" G6 K8 R! i' s8 E' K9 Q
return 0;' u5 H: F( _( f6 u
}
% }' b b6 q* @* J$ @0 vstatic void __exit MCBSP_exit(void)3 \' P2 P/ Z n6 E' F
{9 D. G- T8 F0 R- p* C) C: s" S
printk("mcbsp chrdev exit!\n");1 \& n L, [: x( Z. C! l- F3 _
cdev_del(mcbsp_cdev);8 H+ h! d; g h: k/ v8 @
unregister_chrdev_region(mcbsp_dev,count);$ {; B y, g6 Y3 F
device_destroy(mcbsp_class,mcbsp_dev);6 ], n8 W8 P5 e, m
class_destroy(mcbsp_class);# |. U, i' D) \! n1 I
}
7 A: j( i7 [5 W7 r0 S9 b7 u+ x8 ]$ u% vmodule_init(MCBSP_init);
* o) @% H, T8 y" xmodule_exit(MCBSP_exit);; z- x- C2 q- H, o
% D5 ^. |2 E. x5 t' RMODULE_LICENSE("GPL");; o: w! y/ b& e# ]
* C+ J( _; ?# p0 u7 t3 }. s2 m I' ^
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* k) J/ C( y. |% f
我的应用层的测试程序如下% g1 T1 T( A! J9 l/ W/ R; a
#include <stdio.h>3 B" Z; a/ l& b7 n0 G: O* B
#include <string.h>
% Q& m1 s% A: p* k8 m# C4 V#include <fcntl.h>
2 t3 t6 F& h6 y3 \#include <unistd.h>" x: X, x9 U4 B5 D3 E" q
#include <signal.h>1 z6 i! z3 M+ p( x
#include <pthread.h> //线程; g/ Q5 Z! X9 K1 @9 [3 q6 {0 }; J
#include <stdlib.h>2 E" V0 A* A [
#include <pcap.h> //捕获网口数据. ~) f" c9 `- h, z- J) b: y4 H; y
#include <semaphore.h> //信号
% y7 K, F4 P5 d+ H#include <sys/types.h> //消息对列
1 {1 y; ^ ?) f! F! `#include <sys/ipc.h> //消息队列+ J% c, p8 |/ m3 S" X5 f3 F
#include <sys/msg.h> //消息队列( t7 I; h E' r. w( M
#include <sys/select.h>
$ c& g3 Q4 n- r3 \* q' {* k#include <sys/syscall.h>! H# L4 v4 d' b* \
#include <sys/stat.h>
8 Y: K. W2 A, X( X% u6 J) k#include <sys/mman.h>' F1 C+ O0 W( Y0 U: I
#define msleep(x) usleep(1000*x)3 e+ D: [' ^- y+ \# [( L0 r( F
x, G' ^1 M# W) ? E
int main()3 j3 C" R1 g+ b; f$ C5 s
{
* [2 k/ w6 w2 b7 l //MCBSP,ARM与AMBE2000交互设备& ^3 X& m- t6 T3 b+ k
int fd;
( D- X2 U) g% f" D unsigned short data_write = 0x5555;
- H$ [6 D9 z! {' b5 ] unsigned short data_read = 0x00;- v/ F: h6 Q. p; I" z, S5 O
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);6 U1 K9 T1 A- O. V$ E) D
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 R/ D5 ~9 c- \
8 q7 J# f4 W: i' m" Z: W2 ?1 {4 X
if(fd < 0) A' g5 I8 q! w( E
{
- ?- }# w' d# f% m4 I) f: C perror("open failed\n");
- X+ T- p( L& ?: r; h return -1;9 l0 w1 f$ j6 W
}
0 o& D" [: A5 v" c# m ' e& t. V G+ C { C
while(1)* }# R, W6 z0 [ ~7 G2 x7 p
{
' g5 k3 Q- z4 w6 G# f4 k
/ X, @- L4 _/ G; `' d //AMBE2000每次读写是24个字为一帧
- l$ n v6 x) _; Q //写数据时将数据在底层存储起来,等到中断的时候再发送1 q0 |5 o, c6 G( A& a3 b
//AMBE2000输入数据是以0x13EC开头的! K2 J* M; ^% h4 X
write(fd,&data_write,sizeof(unsigned short));6 j, O* r T& q+ Q
1 _% o7 E& B3 l1 k& V: t //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
/ d. n7 k, s( W read(fd,&data_read,sizeof(unsigned short)); N/ s% {* s7 y8 U
4 H7 W4 |6 p4 T3 f if(data_read == 0x13Ec)
( w8 S0 f4 x: `) e9 J {" V! \& q) C$ J3 \
* \; F4 T! M8 h4 O+ n- z& V" m4 a printf("data_read = %x\n",data_read);5 y3 p' [% L3 R5 t
}9 p& ~, [, u* Z4 g
) v4 d& O6 y5 e. ?* [
msleep(10);
5 C% W* _' f; y8 ?2 Z: K6 r
$ V0 K+ H- h8 s3 \4 V3 D /*8 P+ F& I* K1 g
ioctl(fd,1); 9 r5 ?# K/ i" v8 W% V# k
sleep(1);3 F5 u. m; r2 u! B+ P- O! ~: e
ioctl(fd,0);
* C6 y+ m9 m) t3 S" Y$ r0 [ sleep(1);9 } i, F! m# H$ j
*/
& c) o4 T1 ?- k u4 F( A }
- X' `' L; A3 D. }( c V return 0;
# b! |/ ]8 ^7 D4 e # \! |% J$ v) ]3 I
}
' E, A) d; _, I: U2 r; H8 F2 o# r& {) m% R: n/ A- I% R
多谢各位指教,谢谢! 急
* h- H" w4 X& L0 v* z! q' y5 A- \
, _2 Q8 v& d, W# p- ]1 ~0 o& j& [9 j4 y9 v& {% q
2 w, A8 ~7 |1 T8 ?$ K5 K! \
. m+ t( g* ~+ m: I% r8 r& v0 ]% d" K. |. \
|
|