|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
- Y' ^3 {8 k( D" C# C/*
c U& ]" B2 f* @ * Copyright (C) 2009 Texas Instruments Inc3 Y* w3 {; w$ Y W1 q
*
4 ?+ H6 ~2 h- k% X * This program is free software; you can redistribute it and/or modify
2 J' k- `& Y/ B4 a# Y' V * it under the terms of the GNU General Public License as published by1 ~* N# P5 Q; K' @( x% z
* the Free Software Foundation; either version 2 of the License, or6 Q, Y" |7 ? V k+ G
* (at your option)any later version.8 ]1 x) l, L: o7 W, w
*
$ G( K% T, K- t3 @ * This program is distributed in the hope that it will be useful,
) i. v0 [& t0 m x* W3 Y2 L * but WITHOUT ANY WARRANTY; without even the implied warranty of
/ a; ?& Q1 {6 H! _0 o; x0 \/ M * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4 A+ x! N2 l# Y * GNU General Public License for more details.+ i1 k1 M9 D4 T9 ~$ K; c) U$ B
*
7 t) D- l. G- B * You should have received a copy of the GNU General Public License
, a7 w _. d! j# L * along with this program; if not, write to the Free Software
9 q& z' o3 M6 a9 d2 J/ e) c6 ] * Foundati$ u; f4 H$ ]8 |& c6 L. W2 d' \0 H7 k
*/
- c Z. L& w9 c* ^#include <linux/module.h>' W! Y% i4 [9 {' j" v
#include <linux/init.h>7 s1 N3 \* v/ D8 v4 K& b7 e
#include <linux/errno.h>
) [( w6 x" G! j' |% Y#include <linux/types.h>
/ N5 S) p, K, Y0 W9 e#include <linux/interrupt.h>
5 \1 l, `4 K0 A. |3 }#include <linux/io.h>
2 A9 l" y& [/ f4 L! ^#include <linux/sysctl.h>: \7 v0 h. w3 N+ z8 y
#include <linux/mm.h>4 [" y, T/ @/ J7 u V/ Z
#include <linux/delay.h>2 O5 V( c9 A3 E
#include<linux/kernel.h>
1 a0 P% ~' M6 z9 H# r#include<linux/fs.h>
. L8 ^4 U/ b+ ^#include<linux/ioctl.h>) v' {+ f- [! l& F( n' g3 q* F
#include<linux/cdev.h>* ]# \! P5 H" [9 C' {
#include<linux/kdev_t.h>
9 r0 T2 x+ T5 P! `/ Y#include<linux/gpio.h>
$ z- V6 F. r0 Y' i: H. F6 k$ s) i#include <mach/hardware.h>
+ z2 X! @0 e0 S/ ~) v2 I#include <mach/irqs.h>( {% \: o" H7 p- _! K! t9 Y
& T) T2 j# h! S4 m
#include <asm/mach-types.h>$ C- r* G R% j
#include <asm/mach/arch.h>
7 U+ ^$ ^7 \/ z: b' h( j#include <mach/da8xx.h>
, t ^' s* e* \3 T% f#define SYSCFG_BASE 0x01c140007 k: I. k( O1 p3 D& s1 ~$ P5 y
#define PINMUX1_OFFSET 0x124 3 p W+ e! K1 r! q% {% M
#define PINMUX18_OFFSET 0x168 9 H- }! ~8 q, R% u Z
#define PINMUX19_OFFSET 0x16c* F1 W- l& \2 s% p; ]' Q; g) S
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR5 J# L' f2 n( o3 c
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR; ]5 i0 @* \2 e- z2 u- W' ?7 ]" Q
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
8 H# q/ {8 j5 H# T+ E9 K6 Q#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
" X& `, n, q! z s1 l#define PCR_ADDR 0x01D11024 //MCBSP1_PCR' ^6 l. i5 v" Z$ a% P- T6 \7 a
0 v& d7 @% Z) X( @9 ?
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
2 K! j' _2 S* a" ]! N' ^8 B: a$ J; E#define DRR_ADDR 0x01D11000 //MCBSP1_DRR- i# i3 t ~; ~" a* a8 p4 ^
//PSC
' E8 a( b- Y8 P+ ] J: z#define PTCMD_ADDR 0x01E27120
; T# a" e5 C! A* ~9 O" s6 m#define MDCTL15_ADDR 0x01E27A3C
+ `9 H$ e9 c( D4 Y. i#define PDCTL1_ADDR 0x01E27304: q. F, r1 _, I+ o W" L
//GPIO8 direction3 ^5 V+ U1 x. i- \8 Y( _' T
#define GPIO8_DIRECT 0x01E260B0/ o P* Q3 E B. b; P9 V( F9 A+ H+ `
#define GPIO8_OUT 0x01E260B4. S$ Q) |7 @) G9 y+ M( N
#define GPIO8_IN 0x01E260C03 d/ T# j. i/ e& V" W
& k- b- c$ ^# {! c//#define MCBSP1_RINT 99 7 M) s6 @6 _/ ^. u0 C& `
//#define MCBSP1_XINT 100 + ^4 s* ~4 N1 [3 e, V" w! u
static int MCBSP_MAJOR=239;/ z6 J$ j% w3 C$ w
static int MCBSP_MINOR=0;
! e0 S6 {% _! {8 ]9 U* cstatic int count =1;* W' C7 E8 u8 s4 [
& Y3 y5 T) L' F
#define MCBSP_NAME "MCBSP-device"
; d+ z, L* s+ \5 \4 `1 e/ B
/ e) J& N' c0 m+ E0 Lstatic struct cdev *mcbsp_cdev;
( L1 b$ l* S( o: j L xstatic struct class *mcbsp_class;6 `, B0 W; m7 I8 _, J! k; w
static dev_t mcbsp_dev;
* w# r9 b+ d. L5 Munsigned int DRR_data;" z4 X% p: Q. W# c- D& @
unsigned int DXR_data; O( z8 z4 D8 k6 N$ v, M
static int mcbsp_open(struct inode *inode,struct file *file)6 e. O- m& G2 V1 H9 [3 P: k; m+ q/ B
{
# T7 u/ V, Q1 L% {0 A$ B 9 I& \) e6 b- K- z
//interrupt enable,initialized
5 L# P8 s$ H/ y, e% q/ b/ x unsigned int temp;
% i- s( n- |4 b7 B- e1 G //SLEEP_EN(GPIO8[10])---0
) D3 j+ i, p/ \" X3 ^ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( A: A& j. e6 b7 |3 D1 S) j
temp=temp&(~0x00000400);( K. t4 S" B4 X: H: N9 v
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
* C7 Z. f% j9 S: \9 G1 }/ V' S //RESETn(GPIO8[8])----0----1
- k3 [- ^! a" K# V6 g! i temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% ~: l# S. q$ a7 \* L) w8 ?. i temp=temp&(~0x00000100);
4 E- C5 x6 E6 h2 T' B __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
) e* i( W1 u( M8 G. R udelay(100);" D* j/ _5 a, K* B9 T0 ]" x
temp=temp| 0x00000100;- P9 K4 k9 X' N! z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
q/ g! e7 I* x1 N& F# o0 Z0 w% X# ~ udelay(100);
1 [- v3 s% t. D printk("open success!\n");
! o8 j: R9 }6 i return 0;& S* d5 w* e( n
}
8 w- e$ S4 Z P3 f) f1 ]$ A! w; q* I
static int mcbsp_release(struct inode *inode,struct file *file)
+ M; W8 V+ @8 [0 q0 l5 [{4 [* Q* w7 I5 q4 _9 [% g
printk("release success!\n");
m- I8 H4 K3 W* a9 V6 A1 n: L6 M7 \ return 0;
- Y# g5 K( _. h# ]6 z4 X- `}
* ?+ l/ V: l/ m) s: J4 I" G% M( ]& p0 {5 y. P
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off), O: X5 ^: G% ]& w! j# A7 c1 ^& Z
{
0 M9 G0 h3 s% F" m# R copy_from_user(&DXR_data,buf,len);
1 ^" S: k- j. t; i2 h' s6 P) W/ t iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 9 @7 [) Q4 l: P
return 0;
. s6 K( X; T. G5 U) [" v 3 a! t3 d: m/ b6 x
}, g6 [" F4 G+ F6 V7 q3 Z2 I1 @
9 k3 n* E+ j4 D! Lstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)+ A2 Y- m7 W$ A6 \' u
{ ' u* C$ [* [' a) C$ y: `% p
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));: U( F2 W8 u7 ~
copy_to_user(buf,&DRR_data,len);
( P& j0 C8 k0 f5 N! a- g2 t) w return 0;
" V3 l% F; }# h$ S( g}
$ R; T8 h' F! y' S
, |4 S8 [# J% |* S' `# G' Y2 A' U
" f! P' i9 W9 n% ]7 W3 T7 T$ ^: E4 u* }static struct file_operations mcbsp_fops=4 ^7 I/ |8 ~) n$ F: p
{; Y8 J0 K9 ^" C' _8 ?
.owner=THIS_MODULE,% @6 m9 p) E8 m! I5 Z0 h0 ?
.open=mcbsp_open,2 {* {$ G" j' M; X' \0 m' q
.release=mcbsp_release,, C( ~& Y, j m% M* x
.write=mcbsp_write,
+ h# l `, L' u' d: k) E) K7 T7 Z .read=mcbsp_read,
) ~2 ~( G$ ?& c- J};
! E2 J6 Z, X5 x; R* tstatic int __init MCBSP_init(void)$ }3 Z8 {, f6 f3 b; ^
{' V3 x4 E1 X! e, ]
int ret;
; s' ]4 Y* j) g. ~$ }7 { unsigned int PINMUX1_REG_old;
7 {0 J! d, ^" r' L0 e! `0 h unsigned int PINMUX18_REG_old;
+ m1 |! G5 B) A) c& O# Q' W unsigned int PINMUX19_REG_old;
. C1 M0 t! o/ A8 E8 {! Q2 @ unsigned int temp;
; h4 S, Z& t+ q3 {, Q+ A Y0 F! g if(MCBSP_MAJOR)
4 `# _3 R0 S9 w( h {$ f, C9 U% H. C9 b2 I
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% {' g- Z9 q- V6 R" T4 Q1 S; D ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
! E; H+ y( _& J& `$ Y% F# L }
+ R1 n) a: f* h! n% x; Q3 U else
* p J& G0 Q' ~8 N {, m8 v" m# K, _' s4 P# S' W
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
( a. O$ _1 `, W: {2 K* C$ G MCBSP_MAJOR=MAJOR(mcbsp_dev);
% K% o' w! O$ z& K" u }- H6 T2 y! D6 p: |- M) C7 O5 W
, @5 ]8 y& }# O# Y: l4 N$ f6 U if(ret<0)
$ g% t9 s/ `! V; R( ] {
9 m+ R5 w% S$ I$ Y% S6 B printk(KERN_ERR "register chrdev fail!");' D* I6 P+ R2 |- s
return -1;
/ R% H- m, ]; \6 U. a! @: l. | P }
4 o1 ^4 S* S- [8 X* ]' C. e
( j/ j( ?- f+ T' C4 u$ B mcbsp_cdev=cdev_alloc();2 V6 H1 f4 t, H
- T: W. p4 E/ Z3 V7 t- W, a; Z+ u8 W if(mcbsp_cdev!=NULL)
0 t' v) A2 H9 B6 F {) M( T5 r+ t2 h: Y i9 y- M
cdev_init(mcbsp_cdev,&mcbsp_fops);: n# e/ G- H- b
mcbsp_cdev->ops=&mcbsp_fops;
" R+ c! @8 C: |* G2 w( j mcbsp_cdev->owner=THIS_MODULE;- |; s2 ]# I& K
6 ~3 x3 K/ g; v% l1 W# |% [
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): K: _. j2 O; ? i
printk(KERN_ERR "register cdev fail!");3 G8 W; O$ }% N+ C% F
else
) Y1 K2 K. T$ v* X# K printk(KERN_ERR "register success!\n");
% C0 X6 s" _* K5 O; {" ?6 e }0 N2 e8 U( |' i9 _# R& v
else( ?# Z; f$ p1 o( T
{( I+ |. B$ S6 D+ u
printk(KERN_ERR "register cdev err!");- d6 g* i/ L' l
return -1;
4 e( w5 v( ]: s5 S8 N' z }- G. p/ S* d! q9 l. \& D& B f
6 N* E- L7 x, L9 f. h
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);: R6 w" M! @- l; H3 K0 s! t; [
if(IS_ERR(mcbsp_class))
" _% ^/ x7 V$ G+ w2 M+ Z. u% Z {8 M6 B6 y: C8 H: H+ g
printk(KERN_ERR "register class err!");
5 l: P' O, [# V& \ return -1;9 i% m5 m! b1 j# o& T" q& m
}7 ]. Y' L D7 r) i+ H" |: R
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
6 {2 t! l; e/ E% T; ?/ Q8 H# m0 C8 {9 W) j9 @3 g
//PSC
$ M* ]5 w. i9 _- Q( Q //add Enable MCBSP
% \: M# x) D8 A5 W# G+ G //test* N5 f' e6 I6 ?( L. k C# e
temp = 0x80000003;: g+ ^/ t: G' d. e: ?: Y; x
writel(temp, IO_ADDRESS(MDCTL15_ADDR));; n3 S) V. g" c1 D- R( k# ?7 I
temp = 0x00000003;( T7 B5 |8 m A0 I
writel(temp, IO_ADDRESS(PTCMD_ADDR));) t' S& b0 x k5 X) x3 n
1 d8 g4 }1 e9 p# @4 D& E+ A6 C
temp = 0x001FF201;
+ U! W3 p# P! m. k writel(temp, IO_ADDRESS(PDCTL1_ADDR));
% h1 I7 r; U& Q: h- Z* z5 [
& t1 U7 {5 j/ M+ `' R //PINMUX
3 C4 b9 W1 E* z# K //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
( H6 z6 k% Q0 _8 _9 L PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
' |4 w4 M s- r+ N PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
/ C; o% [! P+ `# I8 @" { writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
- X X2 A+ d+ S5 j6 u3 _
5 y1 @8 w2 K2 Q" W; X, g) K //SLEEP_EN,EPR,L138_SHK1,L138_RC3 L1 j- M) E, G0 ` E# B
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 [) j2 u1 u/ T' o; F* G3 m8 y' v+ r PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 5 r! W7 K+ x6 ?1 `. o
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
$ D: D4 D- Y+ s: D4 p
, o3 R% o* L+ V5 \* d% V7 I& g //RESETn,L138_SHK2
, ]/ _2 \1 d& a n6 F* d! w PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
$ m0 m, Z7 k I; O9 J0 R4 e PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 6 Y' X( o5 [3 G9 h! N# L
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);6 r( M# l$ l! n; E
' C* w0 S" r1 ]6 i0 P0 [
2 a6 U8 n! l0 i% {, x1 f' k //SPCR Register) M7 X. u8 b. n! C. \; y& w( L
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- d* S/ Z) ^) {2 M4 n& ]3 e2 `! y5 h
temp = 0x03000000;//(DLB=0)
0 y5 C# e# P; V- Y: ^2 W1 P9 [+ J // temp = 0x03008000;//(DLB=1)( E4 m2 S0 W% t& J
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset& B& i: P6 D+ X1 a4 ]; v" K
temp = readl(IO_ADDRESS(SPCR_ADDR));
# Z% v! t/ d5 z printk("temp=%x\n",temp);! ?' A3 ^& y( q- D& r, ]; e
9 c- Z/ O3 N% w- A
//PCR Register" }8 G: ~" G1 F* L
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
& b4 h3 i# R" ]4 ` // temp = 0x00000F0F;+ q4 P+ E0 _3 X# N! S. [
temp = 0x00000B0F;
# }% \. ^& N- c: e2 `- X& [ writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
& C7 J0 }- Z- H4 I5 u' K6 H* | temp = readl(IO_ADDRESS(PCR_ADDR));
3 C( W! p6 x7 t0 R% m: x& E' O: u printk("temp=%x\n",temp);
+ r/ f. u c: p" h& n2 ^" }6 X //SRGR Register' R- E9 h( a6 h! o
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11+ d: T5 [- k1 y+ X: U) T
//temp = 0x301F000B;, c v* `# l9 M5 o- k1 v; R
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
$ C& y2 k6 f, L# |3 W temp = readl(IO_ADDRESS(SRGR_ADDR));
) H( r" [9 Y/ D# ]2 I0 ?# d printk("temp=%x\n",temp);
) D8 o* Q5 c3 D* {1 s* j. N //RCR1 U4 I; u1 J% `7 M0 X; @
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
* S' n8 W. n4 X8 B& l //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
+ T0 X( n* k/ k2 N( Z( w" m temp = 0x00440040;6 X" y9 a" B2 ^* a8 ]
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
9 |& J/ ?+ V7 @4 V) I2 ? temp = readl(IO_ADDRESS(RCR_ADDR)); ?6 i+ m4 z& S
printk("temp=%x\n",temp);3 l5 L' n$ g1 N$ R$ ^! N
//XCR" ~4 }. {, o: b- T. _' X
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1& p8 L5 p6 T% s% Z: M J- i! W
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
m2 a* T% p( g( u K' S temp = 0x00440040;7 y. {5 K/ n4 q( U4 I
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
' O* A2 o J. \0 l# y, T& j temp = readl(IO_ADDRESS(XCR_ADDR));
3 I: K! U( [1 B printk("temp=%x\n",temp);- u9 z. j/ y. E o
udelay(100);
7 ^$ Y2 ^- l# W8 S, x5 g5 h# a( p/ B //SPCR Register5 K6 L: {# \3 S
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-16 A: j1 ^" c7 Z( Y J* u6 s( z6 O
temp = 0x03C10001; //DLB = 0 VS DLB = 1+ Y/ W" e t, C
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled- F8 r5 R L( d
temp = readl(IO_ADDRESS(SPCR_ADDR));0 X2 r4 k) B* t8 s& R4 U
printk("temp=%x\n",temp);
' k/ x' r7 Q9 q9 Y) W( A udelay(100);- ?! @ o. t E% U; E+ K3 r
# e) N+ h7 `0 ~/ Z' C7 H8 d* @ //set GPIO direction* l: i2 `# j: Q8 {3 D/ D
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; z' J" x! F. N5 K+ e3 t6 S
temp = temp | 0x00000100;//EPR----input ?* A5 m. S, ^5 v, Y
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 W0 j! e! |0 c' f3 i' c8 ] __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . u4 Q- u$ g8 Y4 H# {! g
% N' ]3 v* |& e7 W/ K% w return 0;
1 V- k) n7 R/ |' n- w}( i. G( |8 D" `# s' s) ~* M
static void __exit MCBSP_exit(void)
7 _$ Z( N3 j+ C9 x: E{
' b6 d6 W; W# ?- ?# |0 I printk("mcbsp chrdev exit!\n");
& i/ e8 q4 Y8 f4 C+ n cdev_del(mcbsp_cdev);
( I, B1 A" _& h unregister_chrdev_region(mcbsp_dev,count);$ ^' q' n. Z5 T9 f) k3 v& {( Q; `
device_destroy(mcbsp_class,mcbsp_dev);
( }- I( u, k0 k. x5 \! O$ ~ class_destroy(mcbsp_class);% T- r# ], O1 {4 v
}
' Q- c. C; `& W* O. _4 qmodule_init(MCBSP_init);
m0 c# Z7 F A0 J8 D* ^( Z$ ^. vmodule_exit(MCBSP_exit);
( }( x8 _+ L' R; e) l* h/ d0 j: a/ l. e/ u
MODULE_LICENSE("GPL");2 [3 q# @ I& G) K( [; q. L
# q l2 K2 U; m9 f
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! m8 o, u: _8 n! j9 b
我的应用层的测试程序如下
+ ]1 Z; g9 G6 K/ V0 p/ ?#include <stdio.h>/ q1 Y6 H C, d: i! k+ b
#include <string.h>
2 \; e: z8 B6 a#include <fcntl.h>
5 ` f+ P9 b, h, e6 U5 W#include <unistd.h>
O5 v/ @/ i/ D9 B! d7 ~+ s& c#include <signal.h>! A6 }* `6 g, B/ d0 J* F0 X7 a
#include <pthread.h> //线程0 Z' @4 c5 {! W9 k C
#include <stdlib.h># {. d5 U" Y% T: F4 G3 \: J- O
#include <pcap.h> //捕获网口数据
7 \& _4 {6 f: v#include <semaphore.h> //信号
1 L2 w1 a0 v$ K7 r( v3 j#include <sys/types.h> //消息对列* X$ {8 L/ p% e9 \
#include <sys/ipc.h> //消息队列. C8 z- U, S9 r) I+ Q* ^+ q0 n0 g! d
#include <sys/msg.h> //消息队列$ E; x' s* D7 Y
#include <sys/select.h>
7 M7 A7 P' P- ~* R% k3 y#include <sys/syscall.h>2 p7 _6 M) c2 t9 b
#include <sys/stat.h>& q! R( X. o- Y) c% ~" H
#include <sys/mman.h>
4 i1 M& u% ~9 J#define msleep(x) usleep(1000*x)" |* X0 m' _8 \" v7 s9 F
) y1 S, D$ X' k# j+ n
int main()1 z0 V8 Z" n* u4 Z* t$ E
{ 9 f% d# A* {( g8 M) N" S
//MCBSP,ARM与AMBE2000交互设备
/ B4 H0 j. ~9 A: Z. O, h int fd;
( P- G2 Y5 E& W( ~5 B' | unsigned short data_write = 0x5555;
! V: f$ B* z' z- G' H6 c6 R0 m1 {3 ?- c unsigned short data_read = 0x00;
5 z+ _; T- h+ s6 V% ~! [ fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* B1 D. c8 k' p
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);5 |' U( h* q8 g8 j* A9 a+ C
2 n7 _/ s0 l3 w) u if(fd < 0)* X: ?- w+ j& H2 z% _- g& i5 T
{0 {$ n4 p4 s3 a4 q, Z O* ^2 [
perror("open failed\n");, X- I4 Y& z4 g& M+ S1 J E
return -1;: a u: V; s8 y6 a
}
- ^* A+ F* k1 U: x1 G
5 A6 S+ W# n9 h' I; q( u while(1)
$ s4 V$ P4 y( c, W7 Z$ q {# G9 J2 C. E& n3 w) C! T
7 U4 N2 r. b) B2 ^3 r% |8 B9 w //AMBE2000每次读写是24个字为一帧
; r+ @2 T& k9 g6 j4 J //写数据时将数据在底层存储起来,等到中断的时候再发送4 v& [/ _7 M( ~5 j! \0 f1 j
//AMBE2000输入数据是以0x13EC开头的
, \$ c! q- l2 u% m write(fd,&data_write,sizeof(unsigned short));8 Z& Z9 H+ g' F9 r/ q1 _3 e
8 U% \/ U# D8 h& k
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 0 V% J; n) y/ O8 T5 _
read(fd,&data_read,sizeof(unsigned short)); D, ^( L- @" p+ Q# }0 E6 v4 R
& E3 t6 c( I; U6 A2 p" Q- N
if(data_read == 0x13Ec)8 Y4 s6 p: [4 N. z* D0 ?
{* P$ v, o5 x* E8 y; h2 E3 Q
+ O+ y' h. h+ J2 c+ \ printf("data_read = %x\n",data_read);
& a: O- e! V2 o" x+ X L0 h8 } }3 V7 L+ |( q7 h+ S9 h& s8 l
4 i- N9 |! [& }$ J2 O
msleep(10);2 |2 ?0 k* _- U8 J
1 b% @! f3 K& n /*+ D; G) |" K. ]" H8 A# A1 M
ioctl(fd,1);
& r Q, }) H- L+ r' }3 S, j sleep(1);# |* m. F+ ?' W2 X( k: D
ioctl(fd,0);% A" V1 E @6 Y1 j5 y. M% d0 c
sleep(1);
+ s, f2 c& Y% U8 I */
* s/ l$ z4 u# S) ]5 N0 x' L. Q }
( K+ w9 o6 S' I return 0;4 c& Y* S8 ?6 ?0 @
0 K+ x7 j( K! i}
+ Y7 D4 @) t+ ~+ W! n! q
$ d0 B( E$ j9 T* O1 T( y' k多谢各位指教,谢谢! 急
+ J2 P7 q2 M: E" P$ x, G: _7 t8 c* F+ Q& T
9 w5 c! l# c6 j& q! ^/ f+ e0 J
' v# s/ K3 f5 ^1 E9 g$ X( d" J( v
( h# W# T# }* \4 s `& t. V* c
: C6 f N' w4 d8 e |
|