|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
) b' V( `7 H, p/ a6 K2 n( |; P! u! ~/*
! G+ l$ a% o+ k$ \) H3 o4 Q * Copyright (C) 2009 Texas Instruments Inc
8 ]6 b: h- R' x/ d8 C *1 Z: P; d, @' `! n
* This program is free software; you can redistribute it and/or modify
4 t4 w+ F, q; f. r. C, k8 d* w * it under the terms of the GNU General Public License as published by; n# N3 \. M5 @/ X l
* the Free Software Foundation; either version 2 of the License, or9 C1 o& f& y0 e
* (at your option)any later version./ J" P: o3 X \1 z! f$ u
*
9 P M% K* F6 k' f N' a/ E \ * This program is distributed in the hope that it will be useful,+ Y5 ~ }' ], H# r( b# p% }
* but WITHOUT ANY WARRANTY; without even the implied warranty of
/ }- w5 B5 O4 ^6 r) h: D7 ^+ r * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% v4 t7 `9 a' O$ x+ e& i% d * GNU General Public License for more details.; e$ E5 v) q' X6 ]3 C& @+ T% p
*; k5 y( m" A0 B% T8 n
* You should have received a copy of the GNU General Public License* {' m! C$ T5 r4 C9 a2 B. c) y; T. s
* along with this program; if not, write to the Free Software
$ y; B+ _0 t1 r* s+ r6 Y! ~ * Foundati
/ p9 F, Z+ v+ I- c2 I*/+ h% _$ g$ Y, p) t
#include <linux/module.h>( {3 c, E3 E3 N5 P) V+ ?
#include <linux/init.h>6 D8 _7 W/ x5 k
#include <linux/errno.h>" r& X; G4 Y* F% }& x
#include <linux/types.h>9 v% `' l0 U$ \1 }$ e
#include <linux/interrupt.h>8 a h Q9 ]; Y0 f
#include <linux/io.h>" D; I/ J0 Y5 T4 C
#include <linux/sysctl.h>$ ?; j$ b+ I9 z
#include <linux/mm.h>
4 ^5 h' h- s$ e% a#include <linux/delay.h>: h, |% N/ A5 s& k2 `. N m
#include<linux/kernel.h>! ]! C3 l8 x& L& ^/ o: E) L1 K) W
#include<linux/fs.h>; E8 O! n+ y. U/ ~- @5 S
#include<linux/ioctl.h>! S, q5 C0 g# C, N; E& N4 g
#include<linux/cdev.h>( \, v, O6 G, I
#include<linux/kdev_t.h>
_5 a$ v2 N6 f1 }4 q( _! p#include<linux/gpio.h>
& E: }, ?( ~7 C6 ~; q5 K#include <mach/hardware.h>! i% r' X" ?6 Z0 \8 p' `
#include <mach/irqs.h>
4 D8 | \( s! T9 d: Q% S
: d, X) k% | W( c; x4 u3 E% I#include <asm/mach-types.h>
& {8 i! w; v1 |5 H& q) R2 ^! j5 R/ v#include <asm/mach/arch.h>
; S8 O; W. u3 _9 s- X#include <mach/da8xx.h>; o: w1 g) _9 W* j( O# x
#define SYSCFG_BASE 0x01c14000$ D9 W! s& n- q0 T; x D
#define PINMUX1_OFFSET 0x124
1 _% t( J% Z/ [$ |! N& C#define PINMUX18_OFFSET 0x168
0 U* \. L0 R' P# k8 v#define PINMUX19_OFFSET 0x16c9 Z2 F' Y0 {8 F! }* b w4 g
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
9 y( w. J9 K! v" x9 ]/ }6 ]3 q( D#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
: N/ A0 l5 y, {# \1 `! _5 q1 q6 x2 h# a#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
+ }, X0 Y# D+ U% W#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR o* R2 K8 h! A1 `4 f
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR3 ?9 K7 T* d/ w7 k8 C7 @1 |8 Y# W
3 e. U: L: }- Z9 d1 s8 _#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
! w( I" t' R9 T, z; E( [+ j#define DRR_ADDR 0x01D11000 //MCBSP1_DRR+ U; K, b7 C. y k0 E* q$ i' o; `
//PSC
* H y3 l3 m# q" `#define PTCMD_ADDR 0x01E27120 - W% Z! V6 q s& i) T
#define MDCTL15_ADDR 0x01E27A3C5 C* s+ f: C3 ^/ {
#define PDCTL1_ADDR 0x01E27304: }3 c) R/ J; o2 L+ L
//GPIO8 direction
& {5 O2 H4 B& v: t. V! U$ t; t7 X4 Z& ^) \#define GPIO8_DIRECT 0x01E260B0
2 g1 H7 c& x: ]% u3 g- G7 O! j#define GPIO8_OUT 0x01E260B4( b, V. h) @( P) o1 O2 J- v5 H
#define GPIO8_IN 0x01E260C04 E! B9 N3 g+ [" G u! Q$ M
* ?9 D5 S! p7 r W//#define MCBSP1_RINT 99 : \) @( a# o! s0 Y3 h8 t. J
//#define MCBSP1_XINT 100 1 q+ S6 O# n) \( }+ Z7 ~( F
static int MCBSP_MAJOR=239;
$ C) o* t4 m$ F. _static int MCBSP_MINOR=0;# D/ K/ a! G! G) a i9 v" c
static int count =1;) t- W% e& C% }( _/ y! t2 V3 c
5 ?0 B7 [" U, o
#define MCBSP_NAME "MCBSP-device"
+ ^! U% D' o$ Z* {
$ f3 R; k* d: |; w9 G5 |& X+ wstatic struct cdev *mcbsp_cdev;
2 }4 H% H+ x+ `( Z7 Bstatic struct class *mcbsp_class;
( c- }& F: Z. u8 Y3 M2 T! wstatic dev_t mcbsp_dev;1 c0 P d8 Q6 X4 D7 _
unsigned int DRR_data;
, M( ], p4 u$ X; P6 z: G& ]unsigned int DXR_data; Z9 M) A' L' I. r' Y
static int mcbsp_open(struct inode *inode,struct file *file)2 ]1 q1 p: a0 l) w; X- [7 a; s
{
; H$ l8 N8 K- H1 u& s! z) H
% r4 |0 v% n& } //interrupt enable,initialized0 j3 }$ E0 Q, k/ {8 v4 N5 j
unsigned int temp;
\9 ]3 g+ y. z //SLEEP_EN(GPIO8[10])---0
: N6 V3 _% L& ~2 C$ m; ? temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( r( d- n& K$ h" _/ u
temp=temp&(~0x00000400);
7 }. I+ Y3 _ u' F/ f __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]/ w2 k- I+ S0 j% b4 C
//RESETn(GPIO8[8])----0----1- w( m, X) [9 f+ E: h+ \1 R
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 C4 l1 a2 ]* A4 { temp=temp&(~0x00000100);
+ s" A* A* u9 e4 g, T1 d- \& [4 K __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. A6 v3 v' R8 `. |: g+ ~1 L! d
udelay(100);
; M* |- h6 R) g3 V \$ s temp=temp| 0x00000100;& W1 |8 R4 g" E* f4 A. s e
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
) n2 T9 [- J. k udelay(100);4 L7 e1 {) r6 x3 ~! {- U( c8 _
printk("open success!\n");0 J& R; o- z+ s9 l2 u
return 0;) N7 E- u# o8 z
}2 p& K- G$ e( x, W8 L( @
4 U- D& s4 w, {4 m& T2 x
static int mcbsp_release(struct inode *inode,struct file *file)
- \/ x$ X1 s% o/ ?: z# R{: a( {) ?2 H+ D6 P; G2 P( V
printk("release success!\n");$ {& Z4 {! u0 y+ R& H
return 0;
$ y/ S4 D `- P) K8 Q}
- h8 I% [* X: Q$ p" O6 [! u4 h+ R6 y3 ~4 s% h
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
3 D5 ?; T# c9 Y2 ^' q* z{ a$ _+ @3 b, [* g5 V; ?8 ]
copy_from_user(&DXR_data,buf,len);
) B: Q" f" b" F. ]9 C iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); * c9 ]! m- T% @3 S8 f) T
return 0;! f9 A& W" r. C7 c
+ j0 G* F$ r( ]7 A
}4 A7 V. V. @' M
+ O' N1 X$ M2 i4 g5 M4 j. {9 e% k
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ [ T8 ^" T7 d$ W6 p7 S' ^{
9 X2 ?: n) J6 ^3 a9 j4 k DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
U/ I! B: W0 k2 g0 x6 g copy_to_user(buf,&DRR_data,len);
) G9 Y, R/ N2 d4 s |- ` return 0;
6 V( E1 z& m( `1 j5 J}
8 `& J* I$ t ~8 o2 m1 B6 S
6 i9 @# S* j- ?7 [3 D. e' [/ w' H1 Q6 x2 q# o5 Q) f$ s
static struct file_operations mcbsp_fops=
4 @# A6 v0 f8 k+ z/ C{
L! t% g8 B' q) M .owner=THIS_MODULE,5 M) H; l3 _# ~* Z( u
.open=mcbsp_open,
' u/ _- J6 L, i4 \ .release=mcbsp_release,
' E& A2 }* a; I" ^- ? n9 S .write=mcbsp_write,$ ?% j$ [2 H, l% d! \! M w
.read=mcbsp_read,
! d; N/ E& w' m1 ?+ y: b! g}; G% p7 v/ d& N8 b; h7 Z
static int __init MCBSP_init(void)
n8 i$ e/ ?+ Q$ t9 S, [{
6 ^# J4 m; ~# b4 i+ p8 e int ret;
3 e% f. c) g5 ^3 ^ unsigned int PINMUX1_REG_old;
& X8 P# K+ ~# V) d& v unsigned int PINMUX18_REG_old;
8 s2 I8 k( R4 a# X% x. |1 W* w unsigned int PINMUX19_REG_old;
! H9 @( X7 r) }6 V6 P' G unsigned int temp;
, _( P4 G% }. i* T1 u$ v if(MCBSP_MAJOR)
2 J9 H [' u, b1 L) L {
- N; S+ F8 F& D mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 L7 [+ W! L# J7 w$ O$ E ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
, V4 s4 y/ z* T# c/ T/ p }4 @1 K1 A& V! C" u. B
else
' }* S: k8 [! g% W8 R: N {6 d6 ~1 N" U5 n k4 R
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);" T. T, j4 H9 M# {2 V+ {9 {1 {
MCBSP_MAJOR=MAJOR(mcbsp_dev);* |% s5 h+ [3 s
}) n1 S% _7 E3 D/ x$ M
( B+ O4 y8 i6 k" c
if(ret<0)- w( _5 Q, {: Y2 I7 T5 T
{* a; Q% a' \% c
printk(KERN_ERR "register chrdev fail!");
1 P' K, x9 C8 J return -1;4 Z- m4 C m( g: E/ @
}6 V O/ X, {* s2 j. E
" @2 `1 I' A0 L+ G; k
mcbsp_cdev=cdev_alloc();
$ e# l) D1 @# q( T8 w3 G& d8 C5 t * s0 F5 Q# Z+ U9 v# U
if(mcbsp_cdev!=NULL)0 e# x$ V8 A, O; l
{
9 ~1 {7 k% x9 e cdev_init(mcbsp_cdev,&mcbsp_fops);
5 t; `5 W' e' \$ Z mcbsp_cdev->ops=&mcbsp_fops;% G# z; I6 R% M! }0 T- w- w$ C
mcbsp_cdev->owner=THIS_MODULE;
3 m. n# e+ S5 A& P8 H 2 G5 d9 p; E* e7 E5 f+ P! y
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
8 B4 O+ i! k5 K# a* P printk(KERN_ERR "register cdev fail!");* _9 y; Q$ @ O
else
5 \; `0 B9 s7 y# m5 ` printk(KERN_ERR "register success!\n");4 b: X8 D- E# }) a
}% |+ G# j4 g% [0 d& B
else
L7 b& ?- r$ @' x {
, {- [$ Y! U4 A1 N8 \8 \ K: J% O printk(KERN_ERR "register cdev err!");
- ?+ ^; e$ j! ~7 ~& C3 y" E/ R. z return -1;
. O; _1 H& ~' o4 q" _" h }
! R! r9 j# t' V7 {$ Y5 w* c( Y% p
1 ^! K/ S6 k% r4 d mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) s& U+ F1 \0 @
if(IS_ERR(mcbsp_class))
9 c/ D6 I; `) \$ w+ q/ {2 p- p {
- ^; ~: p& [6 d7 r printk(KERN_ERR "register class err!");' [# ^' D! d0 y* `6 ?1 J! N; J& X
return -1;
% E2 l% R0 Y+ E& ^, ?2 i }
* F4 j* T; j' y+ y7 C device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ \4 T/ D' w' ~; c3 o6 a/ W" m6 z" F5 b5 L
//PSC$ o) u9 L1 @6 l9 I6 r5 h
//add Enable MCBSP0 `, o& i. H5 H9 P4 h6 j+ g' P
//test! A5 i8 a% u; W& @, a& G
temp = 0x80000003;
/ W; z/ S2 w g) a' @ writel(temp, IO_ADDRESS(MDCTL15_ADDR));" r; m8 o/ P7 A2 y: q+ J
temp = 0x00000003;
7 {1 o4 f, N, B7 T" x$ b. s writel(temp, IO_ADDRESS(PTCMD_ADDR));. \5 z8 g( C' B. N# Z/ H0 j% Z
2 ^$ p2 C0 J" H2 w5 x8 X+ |
temp = 0x001FF201;
7 m: [. p, H. M$ C' |! E writel(temp, IO_ADDRESS(PDCTL1_ADDR));
) W4 S2 o; T0 d6 N- J6 R 0 U8 O( q0 F- f( ^. D/ o
//PINMUX " b, l3 X& F) `% {
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
7 k- W' }+ u. B: i% [ PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); % @: T' W+ Q6 t% o
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
6 G. ^7 D0 g7 T: N5 _' d) j writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. ?- j3 {+ w y; ]* B- h
9 y) w: [" }; X8 }) y, f3 | //SLEEP_EN,EPR,L138_SHK1,L138_RC! h7 W! `* F6 I
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 2 ~2 O( H8 W) _$ k. P
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
$ d. G9 n) L# g4 a writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: Y/ H; _& q$ U8 n; {9 X
( r* T2 i- _5 U m //RESETn,L138_SHK2
1 _4 S" W, ~. u4 s( {# v PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 6 k4 I# T& Q0 [9 `
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; # H6 M |5 l" t- ]+ J# z0 |; k* j
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- F7 ^# I9 o: X
6 H$ t) |" c v6 M/ l% S N4 M% f" [: ~, F+ W/ a4 d' J
//SPCR Register
J& R# A5 M, f% u& E //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
& F; Y, b1 V$ O- e* V \ temp = 0x03000000;//(DLB=0)
% e7 Q, ^, f: x$ x- H // temp = 0x03008000;//(DLB=1)" a9 C! o# B% y6 m+ r8 q0 v) z
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
$ Y, x/ E2 n m5 }; y' ?4 L) I temp = readl(IO_ADDRESS(SPCR_ADDR));! w. H! {4 _0 _) j
printk("temp=%x\n",temp);
' M, N: K5 X' Q3 f. p
$ G: k1 w. _2 ?8 t5 \% V //PCR Register& r) f& r2 `* {: m
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
! b! r9 e) i( g. l // temp = 0x00000F0F;4 a7 l3 Q3 j/ e/ E$ g1 q/ u6 } J
temp = 0x00000B0F;. @9 n9 r6 V, D& Y& ~! a* s
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 9 [' V" X) _8 t! h# y" y
temp = readl(IO_ADDRESS(PCR_ADDR));
" f; W+ f# }( d% z/ g printk("temp=%x\n",temp); " y0 m4 ]( w$ w& g0 p
//SRGR Register
0 t! Q9 d) i" R* s& p( N //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11& p: u7 \, j$ b0 @8 ]
//temp = 0x301F000B;6 @" ~8 Y& k, D' i3 w
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
1 J, W- C$ H6 r1 V" F2 W! M temp = readl(IO_ADDRESS(SRGR_ADDR));
- S; M7 ^3 ?) t3 k printk("temp=%x\n",temp);+ ?9 m) m' Y f$ f( y% U
//RCR& @, c% F! x Y. D' |
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ y" a/ X, [/ S) j3 _ z4 ]# \9 C
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0$ `! [& f$ J6 C
temp = 0x00440040;
3 p9 ~, |- _7 J: s; P0 w F3 |* x" ]/ { writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized & R/ h( a& r# G5 F( R( ^
temp = readl(IO_ADDRESS(RCR_ADDR));
+ V0 m$ j1 ?) R7 m2 {/ c printk("temp=%x\n",temp);
, K7 ?5 E8 U+ r //XCR" j+ N; ^; a$ U& o5 \
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
$ z" T3 f2 { k/ |% E# Y# { //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 B8 C! A# v. Y
temp = 0x00440040;/ H) I# Q4 W I y/ \
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ; w$ q! ~0 D3 P; [
temp = readl(IO_ADDRESS(XCR_ADDR));
% p; D" c% V7 U% O printk("temp=%x\n",temp);3 V, W `' i: a; }
udelay(100);
) F" O7 _( f+ N1 T //SPCR Register* }# _: d0 W) c' K9 T
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, U! J# U" F( b' C Z, p# R
temp = 0x03C10001; //DLB = 0 VS DLB = 17 V# @7 s$ Y' |; w5 T0 `+ X$ Y. Y
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
3 \. F9 ~; C% L) T6 p temp = readl(IO_ADDRESS(SPCR_ADDR));
' E; | g) g9 ~: i+ [ printk("temp=%x\n",temp);
! D0 G- N4 X( G. ?' q2 \* c8 C: w udelay(100);
" d; E: O4 U" n* `% b
* O! i( D+ w- i& e: b5 ^. G+ [9 F //set GPIO direction
0 b- _2 k/ Z) K5 |! u; | o4 Z& e. h& u temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));5 y6 p: i( l" r6 I1 M4 I9 |
temp = temp | 0x00000100;//EPR----input) }; `! D" a6 y( A1 u t4 C: L" ]. X
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
9 x6 e# C8 F% e) V/ Q __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); % J) x! T' t, ?' t! L; x
& r B6 M/ U; W6 H* O7 K) _
return 0;
0 v& h/ M1 V/ |( k$ d0 S. U4 Z; x}4 u% w& z) j3 r q# ? f
static void __exit MCBSP_exit(void)7 ~9 I' U* I7 M4 z; I4 {: o5 q
{
/ u& q3 V/ R! u" m/ ]0 x' a. c0 t printk("mcbsp chrdev exit!\n");
+ T7 `' c0 m% K$ k G cdev_del(mcbsp_cdev);
6 o% V/ h% H, j$ i7 v- }4 C unregister_chrdev_region(mcbsp_dev,count);
" v* v' y. y7 @# y device_destroy(mcbsp_class,mcbsp_dev);' g" L5 J, Z2 S& s% J* i; K$ q0 p
class_destroy(mcbsp_class);
& m* o, D. k/ y$ e9 X3 b}
4 }! J1 r* x4 @6 M- V: zmodule_init(MCBSP_init);
9 P5 U, `- r7 X$ ?7 J3 S+ Xmodule_exit(MCBSP_exit);' \; n5 F1 F# W6 @
2 O2 Q6 u |2 d% c% H( e; wMODULE_LICENSE("GPL");& w. }' h) I. H4 |0 u; y
1 c; t9 E: {: ~5 B5 Z% C
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" o% O/ R% e* ?/ T$ _! W' ?我的应用层的测试程序如下
% {) E8 \7 K* y8 S+ u$ j% u, z5 `8 A( ]#include <stdio.h>
) Y6 o8 `% p. l9 N. g4 _#include <string.h>
, K+ t+ y% r* T: ]#include <fcntl.h>9 }# X8 h- t! N& a1 f+ e9 y- i
#include <unistd.h>) J7 e2 ?4 H) n
#include <signal.h>
. d% F! a2 o0 C8 q0 C#include <pthread.h> //线程& _; l9 f7 J/ [# j2 M2 K
#include <stdlib.h>: V# o5 q5 i0 A* C( Z* J) S
#include <pcap.h> //捕获网口数据
) O! M7 l; [' x ~* G& j#include <semaphore.h> //信号
7 K+ F6 i9 q5 R" D#include <sys/types.h> //消息对列( ^4 \' Z6 ^# r
#include <sys/ipc.h> //消息队列; P; F! a' m6 F: a
#include <sys/msg.h> //消息队列9 E; i4 l- `- |0 h' Y
#include <sys/select.h>. j% q! q& Y# Z# u
#include <sys/syscall.h>
* {3 u/ g2 w, n) t( i& @#include <sys/stat.h>4 m( ~* x# m4 [' g- u
#include <sys/mman.h>$ L1 V3 s! }, Z6 @, }7 y* Q
#define msleep(x) usleep(1000*x)
% Q9 l) X+ y1 S- c
3 Q! ^# H' Z0 V9 w/ {1 Jint main()' t# a4 O% N; e% y8 `
{ 8 |7 Y& x# |8 y4 u
//MCBSP,ARM与AMBE2000交互设备
" r; s# ?7 {& u' Z int fd;, Y7 y# ~' }+ t$ o
unsigned short data_write = 0x5555;
- m& g! U" ~5 P+ ]# p" } unsigned short data_read = 0x00;% T3 G/ r" q. Q3 |
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 O% \7 e- X* ]4 f0 o% b( @$ X5 d$ j // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 u. c- _+ i" R4 e3 M ( b2 `2 x S: h! d- I. d
if(fd < 0)
% a# C0 |" B( Z/ h8 f4 D0 @5 t {
5 B% e4 I7 J6 k! n# C) z perror("open failed\n");- q1 f- ^5 M2 V2 M7 K4 h A
return -1;
+ o: w$ i# s8 Q, l c }
8 _2 \0 c7 ~& ? Y7 K
- {# k( f; r! W2 g4 B% O3 | while(1)
7 b% Y4 _# c, q ?* `. u+ K$ v {
2 V8 f! J3 V1 H% n7 J* i: n + `% R2 v8 n/ v
//AMBE2000每次读写是24个字为一帧8 x$ E$ r) r5 v+ G2 G$ x
//写数据时将数据在底层存储起来,等到中断的时候再发送
8 P' ]3 d4 b8 B6 {% k3 b1 j- I //AMBE2000输入数据是以0x13EC开头的6 N7 j. e+ L' F8 a: `$ d1 ~" ]
write(fd,&data_write,sizeof(unsigned short));
! f4 l+ ^1 W4 U( A. e5 l
; l3 k0 L% f5 G //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 & T# }5 T# d+ F" M9 M1 h* g! `
read(fd,&data_read,sizeof(unsigned short));
8 y/ Q6 e9 o& r4 T" b- A4 O ( p) ]5 z% E- M& x
if(data_read == 0x13Ec)1 M4 U5 C+ {# Y! q q
{
* o( I! e7 ~; u+ i
[: T" Q: D F9 [' |8 p7 W printf("data_read = %x\n",data_read);" U0 w5 B: K; {! S" E* H9 f
}
3 h* x$ d9 V' q$ Z 2 ]0 x& v0 j$ V3 w) g9 B
msleep(10);
1 s1 q A# }& w ~" r: Q [) o9 ? ! x) Q$ r1 n" q' t$ Z2 K% |
/*- s4 j* g( Z6 ^; o5 Q
ioctl(fd,1); 9 a; j: I, i; {* l% }+ z: a1 p
sleep(1);
6 g3 U1 B* o! ?- v6 M/ q- `+ h* B ioctl(fd,0); c" M6 h1 ]- v" j# J& Q
sleep(1);
2 `# I# b5 G* [7 d */ 6 B* x. s' }# w$ [! I/ \
}
7 G( Q* {, ~1 h/ Z3 R6 N# D+ Z return 0;
, z6 `+ H( t# U- o) b$ Y4 z# A3 r
- T- e9 d+ w4 n" ^}
% T$ X. Y5 S# @# R! }- O" N. G4 }# H8 B% S8 Y+ N R2 b
多谢各位指教,谢谢! 急4 _* n: S9 ~6 t" N1 D% I3 [9 A
[0 ] s( B' p- G" D% c
$ ?) W. ]. f. z' `, o( a% ^: K$ [/ n2 T0 Q, V
; R1 Z, Z* i+ {( g7 H* {6 K8 j7 |& Y# u! A( x
|
|