|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 @3 U( N* P: w, x$ `
/*
: n8 F: ]0 r, X* L * Copyright (C) 2009 Texas Instruments Inc
2 b: b3 y8 y! `1 A( ~ *) \" C3 l& g2 c! j( V. `, b
* This program is free software; you can redistribute it and/or modify+ c" c# {' O% n' u- b2 ]
* it under the terms of the GNU General Public License as published by
) L5 w- l! S7 v/ j0 ~6 C& M5 f1 f5 Q * the Free Software Foundation; either version 2 of the License, or
9 ?# s. c7 Q& Z * (at your option)any later version.7 P. p0 i! |7 R- r
*
7 u0 w% S4 C% b4 p * This program is distributed in the hope that it will be useful,2 w, O$ `3 ]2 _9 i d
* but WITHOUT ANY WARRANTY; without even the implied warranty of
/ s; t) a% i# c" a6 d ^0 { * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the0 H6 O3 X) d: H" Z- N- P' G5 k! e
* GNU General Public License for more details.
. P% `. i, k# W# D *0 Q. t1 z& v3 G( E/ v4 F
* You should have received a copy of the GNU General Public License
3 v/ I; \# f7 k# I8 r * along with this program; if not, write to the Free Software) Q) _2 v0 a" Q3 [1 B3 j
* Foundati) j( Y' b# _& t* B) T; _+ L, w
*/4 }* g" n9 B, U; T0 K* k% K. e
#include <linux/module.h>9 V* o" @3 p" Q# o- t9 F
#include <linux/init.h>0 }+ Z4 Z* o' \ o: _4 y
#include <linux/errno.h>) G/ [8 }9 w& F) I- e9 q
#include <linux/types.h>5 |5 r2 w9 ]# D; H t" W
#include <linux/interrupt.h>
0 j. v7 o' r4 d/ {#include <linux/io.h>
- w5 V, b2 g( U4 \/ D1 @* K" s8 e#include <linux/sysctl.h># ]( B" O7 R+ b$ d. e
#include <linux/mm.h>
3 c$ `- A+ R" A+ S#include <linux/delay.h>
' V8 X. M: `2 ^, Y' ~/ i& h#include<linux/kernel.h>+ s+ ]! G- X% f9 M* Y v+ \6 x
#include<linux/fs.h> S; [: {6 O7 V$ a; D# S) V
#include<linux/ioctl.h>; Z* X: G" S M( a
#include<linux/cdev.h>. R+ v2 I) a) g0 f! w Z K* n. q
#include<linux/kdev_t.h>: \3 A& m. S% y' G
#include<linux/gpio.h>; N/ G7 M7 J8 b y! z
#include <mach/hardware.h>
- T6 x: G& `" U; r8 i& z( ~#include <mach/irqs.h>8 s6 Z! L) l. d
2 C4 d; s% d+ {#include <asm/mach-types.h>
# q' D8 ~7 j* H# r/ F" U#include <asm/mach/arch.h>; Z4 u' h% @, Q7 }) g' ?
#include <mach/da8xx.h>) d# D& Q1 v+ W* K
#define SYSCFG_BASE 0x01c14000" C, p/ ]6 N. F8 `- C+ K
#define PINMUX1_OFFSET 0x124
0 C2 p% w, g4 y( F' q. H#define PINMUX18_OFFSET 0x168
3 f% E4 X- B( [#define PINMUX19_OFFSET 0x16c
0 t$ C5 v) C1 f K2 m; M+ ~' U3 |#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
$ k4 y, x) V9 M/ Z0 I( w6 T#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
+ Z) X& ?! e6 d9 `% e; g+ d* q#define XCR_ADDR 0x01D11010 //MCBSP1_XCR; b$ Z& D8 I5 A! A& w/ T) m
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
+ }8 g$ x% O/ h; J# E' i" A#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
+ y/ P+ ]- I" `: E( S/ n
8 ?1 p- D- d9 d, }2 z* f$ [4 u#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
7 \7 a5 [+ r7 M) w! g#define DRR_ADDR 0x01D11000 //MCBSP1_DRR" V; \$ m: D% p' A) J
//PSC
( S/ f# K' I( r7 x' ^9 }- _#define PTCMD_ADDR 0x01E27120
4 z0 Y) N; J4 e1 H#define MDCTL15_ADDR 0x01E27A3C
2 v7 q6 a6 c2 F" y T2 B& ?' ^#define PDCTL1_ADDR 0x01E27304
* H! p( f% w- D; [//GPIO8 direction: J, M. R, a S" ]: J. F5 S+ B
#define GPIO8_DIRECT 0x01E260B0
# d1 s! d# j3 y! {: X#define GPIO8_OUT 0x01E260B4( C- G5 `# G: t( u4 i v" s# a
#define GPIO8_IN 0x01E260C0
# Z: P( R1 \) ] l
6 m o* ^5 b' t) b: @//#define MCBSP1_RINT 99 % J/ C \2 D. W' h5 ]* Q8 o
//#define MCBSP1_XINT 100 , o w/ y/ H& w9 ^. K. B
static int MCBSP_MAJOR=239;
" _( Y% a# B& n% x3 {: t9 d/ Q2 c1 Qstatic int MCBSP_MINOR=0;
# u( a- X& K; d3 C8 l s6 Estatic int count =1;
9 p5 Q# w6 c# \9 j( v- q" o+ E7 H* \" n$ C c4 |
#define MCBSP_NAME "MCBSP-device"2 H# y% g5 u/ f* |+ l( S
! j/ Y5 s D* N- lstatic struct cdev *mcbsp_cdev;; y2 d/ c( l) Z' r8 z7 C
static struct class *mcbsp_class;# s' j( q5 P* ^( l/ D6 v
static dev_t mcbsp_dev;
; Q. g* G2 I) P( T6 ?' t3 i3 ]3 vunsigned int DRR_data;
; h% Z+ e4 {2 R1 gunsigned int DXR_data;/ G1 _4 n7 K0 V" {
static int mcbsp_open(struct inode *inode,struct file *file)) H1 W# {6 } `
{7 Z0 Y' ], I6 k f" p1 I
: Y) G2 I8 d6 `3 }- [2 i0 Z //interrupt enable,initialized
) y: h/ `. f# l/ x6 h unsigned int temp;
3 ~& y. q* v& v( o* S, g% W //SLEEP_EN(GPIO8[10])---00 k# O5 Y8 x) d9 Q
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 G5 L4 F. u/ r3 _7 o& B
temp=temp&(~0x00000400);; o; ~4 m/ X( J) H0 _
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
4 F/ A* @* L7 ^( J( k2 Q {4 v //RESETn(GPIO8[8])----0----1/ s6 ]/ k0 f7 e9 A6 h
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
( A5 I* x m" ~+ P temp=temp&(~0x00000100);
& F: o2 }1 P0 `" C" [: h2 d9 ] __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---01 ^$ b3 f; r. S
udelay(100);+ `7 m( m8 \- o% L( [% Y
temp=temp| 0x00000100;
# \; m0 L6 w* m __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; c+ e5 O9 ~! ?8 M+ Y& d udelay(100);% J9 ]/ A4 D* E! I
printk("open success!\n");8 D J3 P/ Y1 J& G3 v2 ^3 z+ |
return 0;" z7 d) _' o; S8 d2 D6 J
}
5 T, j) G+ U9 r: C
" z0 c8 o1 i" L* b: [% b1 Astatic int mcbsp_release(struct inode *inode,struct file *file)- @) a0 N1 r' B; p" a( f
{
5 h4 K% S8 } z5 E printk("release success!\n");) I; c+ L) z3 T/ G* `: C" _) f. Z
return 0;+ ^6 U! W5 m" L$ x
}5 x N) Q0 K( c# Y/ P' x; B
& T( u! T! {- k. u" x) X: |static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): ~) @9 V- P# ~+ Q4 l
{
* C$ Z7 ?0 Y9 \ G7 W) U copy_from_user(&DXR_data,buf,len);, y, A: }. A0 a$ i1 _: M, O/ k
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ; P6 p1 J8 c: a. x- @. v, @
return 0;+ T5 H! w7 H# y. o: r- L6 D/ B, `
) _6 l1 W9 O. ~7 g$ P}
3 s( u c" q* \; i y3 l" m" y' y/ [4 {4 l, x! x. F+ a
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 b1 _& @1 w4 _$ F# \{ * W7 o$ P3 U7 [' S: V
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* q' Z* f2 X# }, m copy_to_user(buf,&DRR_data,len);
, L$ ]" G0 u- I" s3 S r return 0;8 d6 A. ?+ u( Q* e# ?
}
7 M/ |. i. S1 G/ `) s
4 \, }# w4 w/ q9 g! ^) v: z9 t1 @3 P
1 w9 T+ M8 E8 F. j: g' fstatic struct file_operations mcbsp_fops=0 Z1 v& m( C# A; e
{9 {$ U( Q& e" N9 P" G- s
.owner=THIS_MODULE,
8 p6 R- b5 O) K, ^! [/ ~ .open=mcbsp_open,
) A) H% Q- J; b3 j6 B6 x/ h) H, M# j .release=mcbsp_release,
' F. P/ \* H( T( v8 G. G& v1 _ .write=mcbsp_write,
# T1 T; |/ @8 E8 ~; R8 ^3 S4 I .read=mcbsp_read,
+ ^7 ?8 h% D0 R' ?, O, q5 P}; R( W1 L$ P( D0 z! }! U/ @ Z
static int __init MCBSP_init(void)9 Z, T m6 f0 k- o O
{- p; B0 _% y* _3 _* }1 O0 U
int ret;
a1 n0 T- @) R$ F* s, ^6 m unsigned int PINMUX1_REG_old;
4 q+ @0 Z" L; k/ T; I unsigned int PINMUX18_REG_old;5 D8 d7 ?8 R" E3 K5 ^( x
unsigned int PINMUX19_REG_old;2 z) C+ a) q" p8 h4 M9 S6 M
unsigned int temp; + Q6 z: [4 {5 u6 }
if(MCBSP_MAJOR)
) M# B0 X/ C; _0 r* L' B {. h9 p' K! ~1 x5 J" t
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
/ | I( j, e+ Z+ y* Q8 g/ {0 ? k ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
' ~, r* k8 n u! N( _% x2 h }+ N5 }* {* c: |2 h& H
else" z; l( D; h& ^- [# O
{
. ^' r% h0 Q! J' P2 h6 i; h) D ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
, Z& \, B0 ]3 T' z$ M MCBSP_MAJOR=MAJOR(mcbsp_dev);
% G& G5 Z* s; y" a( `6 q2 P3 P2 i }5 ]) g* t" n' i' l
, M! ?; ^! N7 U" } if(ret<0)" ^) S3 q6 s% F6 E3 c' L* v
{3 Z3 [) `8 T! Q6 M7 v3 ]
printk(KERN_ERR "register chrdev fail!");+ W' l# O+ Q$ n( O0 a7 U! U
return -1;
1 g% P Q! T% h% k, k& |! @ }+ ~# x" q9 J2 T* Q
, w1 r$ @/ Y# S8 w* I% }0 i
mcbsp_cdev=cdev_alloc();7 R- }+ [# V# ^+ N; {1 u# \2 H
9 [2 K& T- w0 ~0 g( w
if(mcbsp_cdev!=NULL)
4 @9 H* \: s3 m" x1 V2 D {
; |' t0 A3 i9 _( h% ^ cdev_init(mcbsp_cdev,&mcbsp_fops);6 o3 P0 o7 f" u' {. j3 d# }4 s
mcbsp_cdev->ops=&mcbsp_fops;
- Y" B, \# F3 T% `; h mcbsp_cdev->owner=THIS_MODULE;
, C/ u* H' Y- `6 J7 _
- {! d" h9 @, O7 J if(cdev_add(mcbsp_cdev,mcbsp_dev,count))8 [6 A. p6 t8 V5 ~2 [
printk(KERN_ERR "register cdev fail!");
% A) V5 g7 Q6 Z# f* i: u2 ` else+ |: x. s& g1 b3 b) W! j/ U* K
printk(KERN_ERR "register success!\n");
, [; Y2 @: c4 B! |, C5 ] }
2 N( n" [1 B3 K f& E: | else' E4 O h8 l, a5 s. C
{
6 ^+ G R! U7 h0 l9 g printk(KERN_ERR "register cdev err!");, i# s1 l$ T& g0 a8 P( I7 W# x" o
return -1;
8 K7 E' }% e' J* E+ r/ o4 c }
# f* I- q0 ]6 ~
2 F5 ` e3 ]( ?" u8 N' N7 | mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
, S& k' Q3 i4 |; n if(IS_ERR(mcbsp_class))# V" X! m5 K# ?$ l
{
9 Q$ v! X' e+ Y3 D7 u printk(KERN_ERR "register class err!");
& ?- b4 H6 y/ N return -1;
. M% I1 t3 B, p8 j2 J F }
% z F# d3 n) T/ \' a: c device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);' r$ C4 K8 _/ c
, ]* ?' E6 f( @+ v m& R) T! O //PSC0 x. x4 t, @* R$ ^" p/ A
//add Enable MCBSP
1 I" X* x, G2 e, T; F# [ //test
t K6 o5 A# @* o$ n temp = 0x80000003;) k" ~2 Q6 x w: }7 s% {7 `
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
( [! q; ~& k5 N$ q temp = 0x00000003;
; u* k0 {- o% ]; L writel(temp, IO_ADDRESS(PTCMD_ADDR));
$ ^, h4 P5 z% Z
0 Z1 f8 D4 [/ P: g temp = 0x001FF201;# L0 f6 X. B/ ?2 x
writel(temp, IO_ADDRESS(PDCTL1_ADDR));: }' o5 P: | M) ~4 M
4 B8 B0 w$ [# V5 p7 _ //PINMUX
$ R4 v9 Q) q! h$ o# Z1 k5 p //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,9 n# P6 s& E) a3 A/ M2 k
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); f6 m8 a- ]1 K; U( Y- R
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 1 g9 ]4 X$ J8 b5 c9 c
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; p$ a; h* I- d& p
/ m* Q% V% Y) W% \' w //SLEEP_EN,EPR,L138_SHK1,L138_RC- u; L+ i3 n+ ?2 N# z& c
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 4 [) A- p4 U2 P% K0 P/ `7 O
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; & M- i% S. I$ c1 j
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);# h- Q4 z, e/ G4 q. Q& k9 m7 X
7 q4 L& h3 H; f4 E9 I //RESETn,L138_SHK23 c7 w+ q- s: A- F2 ]
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); : t' t6 h6 W1 i$ ?! E
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
+ G ]2 E( G; u2 V% u writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);5 U$ ?6 [9 n+ e7 Z
9 e6 [# |! \, e; V( c
C8 P' l5 f1 u+ T* n //SPCR Register
2 a$ }. v( r0 X, H2 e //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
, n0 }" f8 ?3 D6 | temp = 0x03000000;//(DLB=0); M6 ^& ^% h! Y1 T6 L, Z
// temp = 0x03008000;//(DLB=1)
' f* _6 ?* G/ ~# {1 B* M* v writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
! }6 E0 k/ p7 i9 m: j3 z; F0 F1 u temp = readl(IO_ADDRESS(SPCR_ADDR));0 s* Q% _, _# U8 C* M) ~/ D
printk("temp=%x\n",temp);
q [" V" N$ U( X7 i8 c 8 Y9 C/ C8 V7 Z i
//PCR Register
) o) T& K- n3 z E' b2 ^ //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
- A8 k- ^) N2 m1 Z# I3 Y/ D9 F% l8 ] // temp = 0x00000F0F;; X( J0 d- r) l: k
temp = 0x00000B0F;
: \5 Q. ]: j! [% o. [+ Y1 B- C writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
6 x! R* @3 \" P' R! _ temp = readl(IO_ADDRESS(PCR_ADDR));$ d' d2 K5 n# ~3 A) r4 K U% f3 Q
printk("temp=%x\n",temp);
9 c* P0 F7 x# T1 S //SRGR Register4 u" c$ U; D' N: c3 f, M5 y1 B% C# o
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
) W: a' B0 z8 Z$ j- P# } W //temp = 0x301F000B;
8 z5 Y( S+ z9 z8 a. z2 `# R6 z& _/ R writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 0 V& s" {- y( i4 |1 @+ C/ G6 z X1 |
temp = readl(IO_ADDRESS(SRGR_ADDR));
7 f1 q& @; P& i( U% C printk("temp=%x\n",temp);( B' ?( R0 N& U
//RCR
% R d9 H2 j. ~2 Q9 a* I! n n% { //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
4 n+ X8 W8 P. i9 C //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
) F& F% @. ]" [. X temp = 0x00440040;
+ D: |) a" w4 s& x* r; Y4 | writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized & T% Q$ |5 _: s( ?! q& T% r
temp = readl(IO_ADDRESS(RCR_ADDR));7 M1 v$ ]) T* X+ Y
printk("temp=%x\n",temp);; @8 n% P: Y# J' [5 N
//XCR2 r# c W7 C r9 i; ^* ?
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1, E( I$ }8 j% Q6 k7 {& I$ F
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
E5 c: n9 @+ F temp = 0x00440040;
/ r) [3 D0 l" V: @5 _# {: L W writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized m) y: n# z/ b5 G W' |/ u* [
temp = readl(IO_ADDRESS(XCR_ADDR));0 y$ h6 u. k$ [2 B q- Q
printk("temp=%x\n",temp);; s0 b& B4 t; n; Q7 P
udelay(100);' A' @2 X% I" C- E$ [
//SPCR Register
0 R( ?5 N1 H' D0 a1 |" }& v //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1 A8 S% k" c* v: E
temp = 0x03C10001; //DLB = 0 VS DLB = 1
4 [# A* R5 K. g4 X1 { writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
/ K) s- \! [; G* q3 \7 D. C temp = readl(IO_ADDRESS(SPCR_ADDR));+ a7 w- E Y6 T# [; C
printk("temp=%x\n",temp);
8 V7 c5 G" w+ | udelay(100);2 X: p7 u2 b# |( a; d8 j
; c- U1 i- a& T* x* `5 Z8 \ //set GPIO direction
3 ^5 y) j5 E; M1 S temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT)); t7 F# `8 Q) V7 B! Y. Y: b1 Q9 s
temp = temp | 0x00000100;//EPR----input
# {. k. o, A6 T temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
/ j* n& ?0 }+ H4 ]0 t __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
6 h6 |) U6 ~$ U4 c# @+ O4 S6 x
( p# u4 f7 \& n8 V" I+ \/ A return 0;
/ [& o6 g7 u+ i, i0 ~}, p- A4 t8 s* z3 s. o
static void __exit MCBSP_exit(void)
& _& |( [1 ^2 v/ ^+ D1 V{
# } u) K* l/ V; S: ]1 D$ [2 E3 ~ printk("mcbsp chrdev exit!\n");$ ~+ {' G: D! r5 J6 _* Y! S. S5 l
cdev_del(mcbsp_cdev);
$ b o$ z2 p( N M) w unregister_chrdev_region(mcbsp_dev,count);
2 O' i, g/ a8 |) B+ P+ o! t device_destroy(mcbsp_class,mcbsp_dev);; E7 b" O- Z# F# U E+ _4 r
class_destroy(mcbsp_class);
; N x$ z, |5 o0 ]1 _" Y; Y. a9 m}4 y3 C8 Z( i' V2 v
module_init(MCBSP_init);
8 p( k; N2 a+ Z4 zmodule_exit(MCBSP_exit);& M: I. {' r2 w% D- l7 k7 q
9 M% Y) Y4 Y( a* P- G: V# l
MODULE_LICENSE("GPL");
: ]* @0 R, Y, _: @4 ?4 w; j3 S" p; |% {+ P
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。" K4 V- R4 x$ @/ n# ?
我的应用层的测试程序如下
* G; p1 V, ]( Y0 p/ U9 R: O9 d#include <stdio.h>% Z# [- h% g8 e; r) j
#include <string.h>" V, N* \/ S! ^" P9 d8 k
#include <fcntl.h>3 h/ { b P8 I- V3 a
#include <unistd.h>
' T7 c5 W. I- s+ @5 @" P/ u1 }$ N) I#include <signal.h>
. e" |. ~9 f( u3 A/ `#include <pthread.h> //线程
1 x& Y# f: }9 I2 v#include <stdlib.h>1 d3 J. c) m& E2 D$ P# ^* e
#include <pcap.h> //捕获网口数据! _* n: M* L6 [9 @; F# g
#include <semaphore.h> //信号
9 b3 [6 ^; D) _#include <sys/types.h> //消息对列
* C: R y* a& a#include <sys/ipc.h> //消息队列$ W! |7 Z0 p5 r, K
#include <sys/msg.h> //消息队列9 @0 w& r& g4 ~
#include <sys/select.h>, Y" z0 M" S& i( S3 B( E, z& i
#include <sys/syscall.h>
( Y9 C4 t6 Y+ I' v6 o9 Q9 {#include <sys/stat.h>
/ B9 t: K% P' i9 X% K, F. @# m#include <sys/mman.h>
) ?7 j1 n4 V# z# ?$ c( z#define msleep(x) usleep(1000*x)
+ k, D+ Z& Z$ {* C2 z
/ B3 Y. y d+ T' Aint main()) b; X! F5 _( I3 j, P& X2 L
{
# j1 h3 t0 @+ Z3 d% g //MCBSP,ARM与AMBE2000交互设备) p* C( p* J! t: n1 p. C
int fd;( s3 l/ z, I0 a9 [! S4 {
unsigned short data_write = 0x5555; K. q3 m3 w9 S0 z
unsigned short data_read = 0x00;" p2 s2 q8 x# v( h6 n1 a7 M( Z
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
( v) o4 b$ E2 o* L0 j1 C% c/ n4 J: q // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
4 h& \, x; w0 T" s
+ M$ a; G; m$ p; V7 y; E& w if(fd < 0)
$ W# ?' i( a6 ^) D4 K& f {
" _2 B7 M- a( C7 }$ P/ H perror("open failed\n");
* U% u! j. M( w# H return -1;
& |3 l* T& k# Q# V: g4 F0 q; X }1 I& L1 c% n1 k; F2 n
9 q) Q$ {& O2 a& \! u3 ~ while(1)0 v# D9 f0 n: C1 L6 v7 a, K
{2 C6 v( g* n/ i/ F5 y
# |: u7 c8 r9 b( ^& x0 q S
//AMBE2000每次读写是24个字为一帧
- c2 x6 l% }" }, B2 m( B- i //写数据时将数据在底层存储起来,等到中断的时候再发送* ]/ G0 Y: Z9 j* Q. Y ]! [
//AMBE2000输入数据是以0x13EC开头的/ N$ ^7 f! @) }* ~
write(fd,&data_write,sizeof(unsigned short));
5 L; P' Y+ _0 f. k0 U: M: w6 v% P) D
+ m8 k+ Q5 X5 Q3 D, q //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 # X( ]" z$ \( @# a9 [! a
read(fd,&data_read,sizeof(unsigned short));4 c0 K# i6 P: P
4 T! y& M1 T# ?0 e3 C+ w3 a if(data_read == 0x13Ec)8 V0 _( g# |/ Z2 s' m0 F
{( c! b) z9 K# B
, B$ x0 K4 x; }$ p printf("data_read = %x\n",data_read);' z+ H u6 }. E c' `" \; E( |
}& z. {; |; ?9 n& W
% O2 k) \, |4 W) r; u8 e9 O msleep(10);
8 _* W1 v( M7 n! q1 X/ a5 p: M
0 b }' C/ o! s% {7 N /*; Z, M; k0 _7 ?2 W/ B
ioctl(fd,1);
@6 s: y2 l5 ]* H: X sleep(1);
?* q5 p+ @; s% `3 V, l! r2 J ioctl(fd,0);7 ]8 x# o2 X0 ?6 X. H
sleep(1);3 }7 j, v" C! G4 Z* d+ Q6 h- F
*/
2 G8 t z# c/ A, a, h }
7 \- w2 n! E3 U. b0 r return 0;
2 J4 W4 o) o% {' y0 O+ u
, F' q& c' F# l' Z6 V/ W- @0 n}
: {# o: @' }! d V# z% d1 \
" ]; L* w$ K, |' N多谢各位指教,谢谢! 急* F. C, Z5 L- q: j1 \
$ w& Q$ v, T# A8 U
* E1 l4 s% k" N Z7 f3 {' H0 a0 k) A8 J2 X) J
* E+ i9 `8 h7 U @, l! E3 F$ \3 B7 T% r
|
|