|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: . x _. ?% W" i$ q
/*
$ ? P3 e# [0 D! X * Copyright (C) 2009 Texas Instruments Inc
& q2 y5 D$ F9 L' U *( R2 W: t5 _8 \5 t
* This program is free software; you can redistribute it and/or modify$ ~1 ?; I' a4 |9 K! {
* it under the terms of the GNU General Public License as published by
4 h4 F* H. @8 t6 g$ Z * the Free Software Foundation; either version 2 of the License, or8 C- W5 k4 u5 U& {0 G/ x
* (at your option)any later version.
3 p$ W% Y9 w- I' ]" ` *
( G% w; F$ q# ?5 e! H * This program is distributed in the hope that it will be useful,6 {! n2 u0 u! P k. Z
* but WITHOUT ANY WARRANTY; without even the implied warranty of
. k/ K1 f: H, \: d: C5 {% X' T" e4 m * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
: w$ ]. l4 Y* A * GNU General Public License for more details.
8 |: V2 \8 U: i3 i *
% C3 a1 A" c8 R3 F2 e8 t8 } * You should have received a copy of the GNU General Public License
2 H$ l+ p) M% q6 I( N) L * along with this program; if not, write to the Free Software k- \% l& ^( J' D3 z/ B
* Foundati6 m" c2 W1 q5 R8 y3 h' y5 [
*/, J6 I! p' J# o! R( x ^; H6 S
#include <linux/module.h>5 S0 C2 Q- ]1 P
#include <linux/init.h>
1 ], [$ u% L6 L }, |* D7 i#include <linux/errno.h>* N$ p# C3 w0 Z, Z5 ]1 Z0 U. `
#include <linux/types.h>
. [/ C. R! Z6 Z2 R#include <linux/interrupt.h>1 c+ U/ E. @+ L. B1 ^
#include <linux/io.h>- Z g( R' ]! y
#include <linux/sysctl.h>
, d* \6 m: x( Y2 R8 j0 v& B S#include <linux/mm.h>' |1 F5 z% _0 X, c# G
#include <linux/delay.h>
/ a9 w: T% K% j3 i( ? k3 u4 R#include<linux/kernel.h>' s7 D9 L, b! Q! ^1 \2 m' U
#include<linux/fs.h>
/ W/ ~. ~# a$ F' V& ^#include<linux/ioctl.h>4 V. b- J7 I4 u& ~% [
#include<linux/cdev.h>
" K- z6 @5 F9 X8 t#include<linux/kdev_t.h>* a( v- O) T9 F0 O
#include<linux/gpio.h>7 \0 d' G$ E6 T1 H/ D( Y8 o1 S
#include <mach/hardware.h>
( r) k3 u, y; W* k7 Y#include <mach/irqs.h>0 h" A l& J/ h1 n3 A9 o, ]6 G+ m
9 A6 T; X4 t+ [#include <asm/mach-types.h>
: E" a" a2 w; h! g) [3 _#include <asm/mach/arch.h>
$ v! n% v8 {. t8 g#include <mach/da8xx.h>
m3 }7 c. d. X#define SYSCFG_BASE 0x01c14000
2 ]- T2 e8 H; H- l2 X& W2 c#define PINMUX1_OFFSET 0x124 7 c8 M7 r2 J7 c: J$ y- P- w7 f
#define PINMUX18_OFFSET 0x168 , Z/ j# k9 P8 T* S! A8 f
#define PINMUX19_OFFSET 0x16c" H8 T3 {2 o1 g: e
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
8 z0 W# H* ~* w2 w#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
. V4 t2 d% w {: E2 N#define XCR_ADDR 0x01D11010 //MCBSP1_XCR% e7 \0 Z) c' J4 r5 ]
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR- w9 u7 K1 `6 p+ ^. r; {# f: \; v
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR- G, b# Y5 C' y n5 `5 k: F
5 D1 v, Y( {9 k& z2 M8 e#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
. B/ ?3 v6 e0 u#define DRR_ADDR 0x01D11000 //MCBSP1_DRR9 ~9 N! A& ]6 H! {
//PSC
! s( m# T- }! p#define PTCMD_ADDR 0x01E27120 0 Q# e" K1 N! [5 c6 W# J' `3 \
#define MDCTL15_ADDR 0x01E27A3C, ]& a3 }# i* g; L+ ?7 R
#define PDCTL1_ADDR 0x01E27304
0 z8 k0 T5 V% y/ L//GPIO8 direction
@; G) X- O2 g# K#define GPIO8_DIRECT 0x01E260B0 E* y/ G& F+ O
#define GPIO8_OUT 0x01E260B4
9 F$ d- v$ ]+ p#define GPIO8_IN 0x01E260C0/ {* C9 O- K5 T# |. W# d. E8 Q
, ?! U" i( T6 V2 N2 u6 r//#define MCBSP1_RINT 99 6 l& Q5 |) v) g# {, V
//#define MCBSP1_XINT 100
7 Q" i: D5 F# R% N) Istatic int MCBSP_MAJOR=239;+ d' o# z* N6 n/ P6 O3 s/ |6 ]7 \
static int MCBSP_MINOR=0;
. S4 j" [8 v& Q3 Lstatic int count =1;) g+ U x( l* P! ^4 Y& C
/ w. g( K3 h# A4 o) P* E/ y* E
#define MCBSP_NAME "MCBSP-device"; S7 ~ C+ b# q3 Z% U( U8 k
7 d" J4 l5 [* M9 Q# W
static struct cdev *mcbsp_cdev;
4 V7 A1 e; q, X5 O! z3 \static struct class *mcbsp_class;" i7 R6 \" t7 z% J! ~
static dev_t mcbsp_dev;
3 x5 [, r# }5 a0 o1 g7 h% y* y: \. ^/ I+ ^unsigned int DRR_data;0 b5 H P$ b3 l4 S
unsigned int DXR_data;" R7 {4 P7 H4 e. ]/ g
static int mcbsp_open(struct inode *inode,struct file *file)5 t( @4 ^1 X8 a z+ J- y
{
2 i) H; C* [7 I- h7 s+ f
8 i3 N+ t) Y7 u/ {7 t# Q. x) } //interrupt enable,initialized
" B$ D' m8 c3 C* I: u unsigned int temp;
) Q2 E! g" u! i% k* |: D4 V //SLEEP_EN(GPIO8[10])---0 u7 E% O1 k' m6 ~7 B8 L' z& [
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) e- C' t. e" v9 T temp=temp&(~0x00000400);8 g y# v: K1 |8 y4 M) x9 Q9 g
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
. X- W: H ~, u3 ` //RESETn(GPIO8[8])----0----1 {1 }( d- U: b% t# g
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ w5 d: u! B5 b& A+ l. D c7 Z temp=temp&(~0x00000100);# U" W: V8 o7 G, E* D7 g& s
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
" c: o' |* Z' C, O& S6 j udelay(100);
7 ^! F |) M( O6 e" f5 ~* ?. M temp=temp| 0x00000100;4 t* Y* a6 b+ @, d" D/ }6 M
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---17 c, i3 {4 A* i7 x
udelay(100);
O# w8 [: ]4 k/ o* J4 ] printk("open success!\n");3 h2 R) [6 s( F1 G
return 0;. U# x$ ]# v5 |5 O+ c; R% R/ a
}
8 ?: m( V) j% d7 v+ J' ^/ R% Y. v( Z! K& {7 v) Y
static int mcbsp_release(struct inode *inode,struct file *file)
4 l8 o$ H: o J$ a{
( _4 d4 e4 k& i2 F2 n printk("release success!\n");
$ n; t# X& @2 k! b- l return 0;% x) p/ j" [# r; Q. I
}1 N- f" D! s3 d
: v2 U T5 Q* L7 l3 s( z5 N0 l! h
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)0 @/ c" x8 O. Q% N% [7 F
{) S: R) P+ W; m
copy_from_user(&DXR_data,buf,len);
& l7 i2 P D) v. @0 ^2 k! v iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); : \- @3 T* V* t e$ a
return 0;* I g# w7 O3 O; Z1 a
4 Z9 X* C8 d" d2 k. |3 c- E7 P
}; l8 h4 i+ S3 s: N$ N
" E' D& t% b: n( |1 H+ k( ?: U
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 G3 b5 a/ b0 j6 Z3 f& a+ U
{ 2 ^0 u, _4 u b& A4 ?% t. e' \0 Z5 d
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
3 Z, @& _- A5 ]% }: s( X: O( {( K copy_to_user(buf,&DRR_data,len);
0 r% V8 Q5 C( h2 {& d return 0;# {1 _4 s: ~2 p6 u3 \6 M
}3 g8 F6 f$ r. N' p' F4 X: n
. f+ a: ^5 g: ?/ [4 @, b2 H
) |6 U+ y v$ c7 I4 ?, Xstatic struct file_operations mcbsp_fops=3 N, ^' l2 V; a. J6 B" ?
{3 X0 G! w( v7 o* J
.owner=THIS_MODULE,
: e, @! R. r3 l' x3 s2 l! m .open=mcbsp_open,9 y: S% J* X1 X7 A E3 q
.release=mcbsp_release,
* [8 X1 \7 h+ F7 M8 m .write=mcbsp_write,
- ]9 R/ x, R) I: l .read=mcbsp_read,
$ q5 g: I1 | t+ n4 D1 x};( {& T8 l1 U& v) E
static int __init MCBSP_init(void)
; o' r: O3 E6 E! w# E{
* |. N$ z& J; Y; F$ r2 t int ret;; l2 G# S: e' v2 x! Q( n; S
unsigned int PINMUX1_REG_old;
+ C3 o" x+ d2 S" k: F& g unsigned int PINMUX18_REG_old;
D" t! N$ d. w: a/ Q) V unsigned int PINMUX19_REG_old;$ |* Y( k. h3 A' e! _4 i
unsigned int temp; # a# C* u b. M, i; y
if(MCBSP_MAJOR)3 h7 n7 n2 h& A: @# Z
{
# y$ X* X2 V' v+ } mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 e5 T; v- s+ o! f ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);3 u% J$ x$ t2 B$ F" ^ x: s8 t5 G
}1 b4 ]( w# K& o l% _4 i- a& l& S" j R
else
7 W: I$ [. _: W. |. }4 f* y- C7 r {
y T) B0 A- S# b I# E! G ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 \! D* ?! q$ q- q+ T* j MCBSP_MAJOR=MAJOR(mcbsp_dev);
6 [. C4 B1 ^. |; d* W: k+ _ }% @9 j4 e2 F9 L1 Q' h$ G6 O/ R
0 v, h# m' W: k1 Z
if(ret<0)% M2 a2 Y/ [9 r# k1 s( |
{
, o% t7 e5 _/ [8 u: O9 K5 h6 C! K printk(KERN_ERR "register chrdev fail!");
- z8 O) l4 J8 e, z; s- _ return -1;) S/ {# h# x+ I- \3 C2 t
}
- { H! u+ X" Y% r- p* \
. K: o$ W; {( A4 u mcbsp_cdev=cdev_alloc();
2 i3 A% U- s1 `6 I2 O+ X& L' l 6 i& W: e- Q5 e$ I# ?" T
if(mcbsp_cdev!=NULL)+ O& ?. Z/ x8 Q: f
{. x, R3 L: w3 ~, \% w$ K% F: B
cdev_init(mcbsp_cdev,&mcbsp_fops);8 H) d4 F- g- h
mcbsp_cdev->ops=&mcbsp_fops;
7 J5 {2 t/ p- { H: b! B4 ~! B% H; w mcbsp_cdev->owner=THIS_MODULE;
2 v- v/ N- n' e8 b4 m3 |5 q : ]+ u7 Q7 g' P. P8 ~ ^7 O+ g
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' i% q- I& H n( N( `0 _ printk(KERN_ERR "register cdev fail!");
4 m. Y1 _. K7 R else) I$ J2 Y+ Y" ~! e0 _* o; [
printk(KERN_ERR "register success!\n");& w( [- d: A1 p
}+ O! w" D& a0 W) \- Z
else3 @9 N) G# v. ~" `" R! ^
{
* A3 V) x$ x$ ]7 F printk(KERN_ERR "register cdev err!");
. }; t" T2 B2 B& p* T+ s return -1;5 ]# S; ~. i, O3 G% E8 @- y) K0 |
}& Z3 e$ f, u, r$ K3 ^- t
* t: n& g1 q6 Y* _0 ]$ o mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& S( U; d; b6 _9 S* W
if(IS_ERR(mcbsp_class))
- Y0 d) ^0 A( t7 q1 q {
9 j/ a; j. j! M* V7 r+ u n0 C2 M, F$ m printk(KERN_ERR "register class err!");
6 E1 [, c0 v- | return -1;! n+ P" b8 T% l. X' z! B1 z
}
- X5 t" R) |( m+ ^8 h4 g0 f( c0 ` device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);4 a: n- N3 r- a) u7 b& }0 S
' ~; B1 i# _6 w" O4 } //PSC. _" D0 U. x' q& M, q
//add Enable MCBSP. S+ a" Z4 w- h! U7 [
//test+ q" q5 F! { z/ |( I) s
temp = 0x80000003;0 G! p3 |( [# U# _4 Q
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
Q7 r' [: }+ F+ y% ^ i temp = 0x00000003;
9 L8 w O) T4 s4 v; Q6 l8 r+ ] writel(temp, IO_ADDRESS(PTCMD_ADDR));. w" o4 }) I5 W) R# t- H I/ Q
: T8 q6 O3 }; ^! I; n
temp = 0x001FF201;* ^9 D# p/ z' Y. m- W& t
writel(temp, IO_ADDRESS(PDCTL1_ADDR));, F) @2 U, z, M! t) T. t" [! ?: e
: N R# M) B6 z& i1 c //PINMUX e: O7 ]; j) X7 M5 V9 O+ u, z- v
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ i2 w2 k) o, ?- t- Y* C
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- U' B- A% u% _. t7 I: G% h+ x PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ) x G* q, Q; k
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
& }: ^/ z8 z7 t# B; E
S, y( L, `- q3 R+ [ //SLEEP_EN,EPR,L138_SHK1,L138_RC6 h" g; I5 D8 G' [( \5 b; g4 G
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); # y+ k/ D+ W+ l0 y
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
$ W# u" ^( G& r9 N5 Y! R& b. l+ O writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);3 I( R4 j/ S9 y! d' o
. | z/ k; ^1 P+ v8 K h
//RESETn,L138_SHK2/ E* M$ K6 S1 U: \) l7 ~
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); : V+ h2 n9 i6 @/ D( ^+ ^, R; }/ C
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 6 g# H- h5 T6 j" x% i6 \" e
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 _' G! f* x+ m + v J! s: r6 Z n5 b6 G3 G5 T% K
1 p& U( X) W; k+ r' M //SPCR Register
8 c' \ R0 _) K" u0 F1 u //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
; T, u5 P5 T' I( V5 U2 \0 A temp = 0x03000000;//(DLB=0)
9 M% W* z: _( p9 F& ] // temp = 0x03008000;//(DLB=1)
# q6 x9 h" u- D9 Q. ] writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% o: s3 u0 I. W- N4 E# v. b( R: ^ temp = readl(IO_ADDRESS(SPCR_ADDR));
! j) r: A1 J6 X& a9 E- ~4 v printk("temp=%x\n",temp);
3 s: E) f- ?, ?; c$ ~$ y 7 N$ I/ F2 I% L' L5 j- m# Z2 N
//PCR Register1 t4 R6 y- ]/ @: a
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
* N9 w% A* g8 r // temp = 0x00000F0F;
; d" i- K+ v' E9 C3 @. O9 u* v5 y temp = 0x00000B0F;/ X' g7 H6 I- x
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized & i/ @4 l' K+ P0 M/ R
temp = readl(IO_ADDRESS(PCR_ADDR));( D( A9 d1 {9 E9 v. z$ ~$ N3 Z' a
printk("temp=%x\n",temp); " N! A% i4 Z6 ~# I! K4 k6 a, [
//SRGR Register
- e1 J5 d w S: r( w# |; T //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
% Q5 r+ O5 k7 H- {1 R8 A9 C //temp = 0x301F000B;4 y# D1 C6 d) D- `: t
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
" F1 X( D2 z% o4 `. L: b0 f: R temp = readl(IO_ADDRESS(SRGR_ADDR));5 W8 U+ w8 r ~. \
printk("temp=%x\n",temp);
; u! ?+ N: M2 D0 X) m L //RCR
( m* k$ G. f( l: d( g0 v //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
& r- d! s; Y" j- r, E. o //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-05 X& j% j) E. i! A# L8 `
temp = 0x00440040;$ P% z0 q3 |! G. n) K8 s; D& J
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
* z/ u: }2 ~# d5 H: D temp = readl(IO_ADDRESS(RCR_ADDR));0 v( d" r2 P- B ^0 _
printk("temp=%x\n",temp);8 ?5 t- s7 B7 D8 V8 W
//XCR
( d# c0 x" d2 C* ^0 k% n //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
5 j1 K, T" D; g1 w- l //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 _- Z; r; b3 o$ A8 i
temp = 0x00440040;( d. F+ |. i) p
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
$ u+ V+ ?1 D+ h+ _# e8 q: v temp = readl(IO_ADDRESS(XCR_ADDR));
% u2 M1 M9 @5 n printk("temp=%x\n",temp);5 {* i( d3 D8 q+ {3 O s: E0 Z
udelay(100);
2 R: F: `. N& C4 y$ V' x& {* [; n) r //SPCR Register
# L# Y' a( x8 ^. |9 X //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1# K2 n, ~2 q6 D6 e
temp = 0x03C10001; //DLB = 0 VS DLB = 1# V0 }/ q* f# k6 a2 W- R
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled; o- O# B6 f3 B8 Y
temp = readl(IO_ADDRESS(SPCR_ADDR));
9 c/ {( G& y/ C$ m printk("temp=%x\n",temp);. d9 v* [6 c# q6 A) d) I$ @
udelay(100);$ m9 v& X% ^2 X
" s: x" t2 Y' d$ i* T6 J //set GPIO direction$ X, u c" P2 T. |8 M$ ^
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
' j7 C3 h6 q8 ?9 g) z temp = temp | 0x00000100;//EPR----input* |0 Q# r4 r6 x
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output9 x, M3 d [1 n O% g' N: ]1 w
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 9 C; w4 e: }) h$ M7 G
. s# t3 h$ u& D- D' w8 n
return 0;9 ~$ ?# s- E' v2 C' L0 A3 h/ a, z
}( A$ x- [$ n1 @( e; }0 w* M6 O
static void __exit MCBSP_exit(void)5 u* h U+ G# T B" [) Y
{: _4 s- i* g# V
printk("mcbsp chrdev exit!\n");
3 ^. i4 {6 z9 J( P& W, v cdev_del(mcbsp_cdev);
' D, u4 L) D; d+ y: | unregister_chrdev_region(mcbsp_dev,count);
4 y& i" |; Q& I- B1 [* \ device_destroy(mcbsp_class,mcbsp_dev);; i- y- ^6 d, q) o& ^8 b' G
class_destroy(mcbsp_class);0 s/ j& d4 T6 P* W
}
. [4 _) \ N/ F! q& q* W3 Fmodule_init(MCBSP_init);
5 s- `6 O* |0 h" K- |4 qmodule_exit(MCBSP_exit);. s$ b M7 m. b1 f
! G( @$ D5 {0 Q# nMODULE_LICENSE("GPL");
0 u4 Q, b1 s ^. f% h! ~0 K6 i1 c
" B" l" I; X, e0 Q2 @+ Z# T" B' d我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。$ a1 Z. x, a1 I2 e9 i2 D
我的应用层的测试程序如下
# r% i' a& I+ g7 c#include <stdio.h>
. _8 M4 X+ t S/ U! V0 r; }#include <string.h>
9 K- K4 J" ]4 t) n8 D/ G1 [#include <fcntl.h> B& P# _$ v9 \% E' K o: `
#include <unistd.h>
; y" V1 d6 Q9 ?- b, u#include <signal.h>7 r1 f- L+ K3 [' s+ t, {
#include <pthread.h> //线程
7 l! v. @$ h0 ?$ k$ u#include <stdlib.h>! p* |. F9 M( P: t3 Q5 f2 ~; x: T
#include <pcap.h> //捕获网口数据7 W0 E& ]6 ^; J
#include <semaphore.h> //信号
$ i! ?' G- {6 N4 V! N* d* _! v#include <sys/types.h> //消息对列1 A1 A6 y$ L- u' b
#include <sys/ipc.h> //消息队列8 x2 ~7 x Y9 ]
#include <sys/msg.h> //消息队列* |3 e9 z6 i, `% e7 ?0 ^# Y
#include <sys/select.h>7 t6 {, N/ V% h7 ^/ j
#include <sys/syscall.h>- w2 i6 m; O( E `, l6 \9 w% V
#include <sys/stat.h>
. s; }: k" m* J. J* {2 ^% r#include <sys/mman.h>
( K. u# y8 J' G. Z#define msleep(x) usleep(1000*x)
* M) |: @* I1 W3 ~, g+ p. x) Z8 m8 d; t: T1 R" U8 b+ r
int main()
! t, ?& e2 O5 l+ F. P+ y% G" w9 c{
( `, Z9 H* `2 u+ w3 P# Z r5 S //MCBSP,ARM与AMBE2000交互设备$ l7 }' e- T7 }. B# O
int fd;
& k2 B$ p! K, ~. {+ b% N5 h- m unsigned short data_write = 0x5555;; s" T6 ]$ b) H; z7 l( e) N# ~
unsigned short data_read = 0x00;
, w+ |7 B+ O8 C( c3 h fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
% p* b/ u7 y; u! E g // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);+ ~+ @5 F6 q( n: m/ I- c8 D8 }+ t
" R1 W( Q. @1 @7 b9 c0 z0 B" X if(fd < 0)% h% O, |4 b' g: Q. z* J
{
; i- O+ C. X* f3 D, a3 F! k perror("open failed\n");
: l0 h. d( C( o3 X& a return -1;6 t& E7 z# x9 x. {
}
3 [, b/ J0 M* V! B, W* R
% @% M; [3 d9 {: U while(1)
3 X; m/ T' ^2 _6 i# J {$ s( Q2 L* R3 _9 D7 G) p
8 h9 o1 C2 m9 o4 f //AMBE2000每次读写是24个字为一帧
) Y0 O0 ]2 ?4 N9 z+ M! K- q //写数据时将数据在底层存储起来,等到中断的时候再发送
. O: Q- E; W. c //AMBE2000输入数据是以0x13EC开头的, q9 c0 s7 d/ |6 y' g4 z# f
write(fd,&data_write,sizeof(unsigned short));
" m: ~ }3 K7 Q) i& B
8 _* G# x7 c+ h' ?) G2 [ g0 p! n! c //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 2 O Q( r- J, w2 Q$ H( M' V
read(fd,&data_read,sizeof(unsigned short));. l) t& F$ ~" \! ]0 [( d
; I6 n2 K; P$ A& e! s if(data_read == 0x13Ec)
2 N" |( ^4 |2 m6 S. [ {
: p; r; ]$ e, u2 l3 b- f* q
1 A' W$ B- R9 x. m0 E; O" e printf("data_read = %x\n",data_read);
* R9 F0 k+ c- g5 t1 H5 u }
$ R9 |' J# h# Y
- Y8 Q8 }' f/ u3 n4 O. u msleep(10);4 M8 {+ T$ S. a3 p$ k: s' U! M* n
6 o* |" Z7 j. }/ d2 u$ l) n7 f /*+ R0 _7 K- r( i% L5 Z' O$ }, d
ioctl(fd,1); 0 P5 h7 ?: O6 T# q
sleep(1);
: _6 f0 H+ n, X# Y! A# s0 f! m/ X ioctl(fd,0);5 y- C2 o& S8 J9 J9 ?/ a0 |8 T5 c% U
sleep(1);# b6 ?: T0 A. v. `
*/ 2 G m' p% z" \9 K9 k
} h& k( x) I e$ f
return 0;
0 z4 g5 ~; Z7 n4 d' F' G
/ l1 Q/ z' Y% t/ M' D+ y! N5 u}7 P: Z6 I3 t& s- n9 H9 j
- \, R* e2 f. `/ [& D8 |
多谢各位指教,谢谢! 急# }- G# f- w2 I
* ?6 S4 B; Z; a
9 N% }$ m$ }& L1 Y' H6 }- u9 K' p' {
1 ^4 f( d% |/ d9 R0 k0 O) r2 S G4 @7 ~1 W
+ a3 D/ T8 @6 ?: u! _! R" V
|
|