|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : G! j7 H8 l* y+ _
/*
( n' N7 _ t/ s5 G$ A * Copyright (C) 2009 Texas Instruments Inc9 j8 B5 u" ~3 {1 `
*! P; N# l3 }+ E) x' p2 e5 e
* This program is free software; you can redistribute it and/or modify
$ w+ [/ A( ~0 z$ a * it under the terms of the GNU General Public License as published by
/ T' Y4 z$ E' z! d% _6 l * the Free Software Foundation; either version 2 of the License, or
2 O! Z5 y0 q& B$ e, e, k! p6 W1 | ^ * (at your option)any later version.2 X/ U0 _7 \/ z( ?
*
; D7 e+ X# I; f, M/ q * This program is distributed in the hope that it will be useful,4 r! o* f+ i0 j2 g
* but WITHOUT ANY WARRANTY; without even the implied warranty of. L7 n8 Q: m3 ?/ ^3 U+ M4 E( n# e
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
z' W6 s/ J8 F% O4 G' u * GNU General Public License for more details.
" W: v2 Y$ ^4 e: u' n; l$ z *) r( V" {5 Q% `. _+ C! a5 V" `
* You should have received a copy of the GNU General Public License
Y. B% c$ n% a7 }0 [4 u1 o * along with this program; if not, write to the Free Software
3 f/ J* j. w5 e. e. G- B * Foundati0 W) \, b4 b; @/ a) |0 a$ H0 O
*/
' H) W9 z! w: U: @$ z- E#include <linux/module.h>% _8 l$ P- ~7 \. M+ N) N9 u2 Z
#include <linux/init.h>( Q7 r" f, c) M, ~! x
#include <linux/errno.h>: g3 M8 [: A. H+ N3 V' F
#include <linux/types.h>& J/ s( @% z2 N1 V3 x8 o1 J: O
#include <linux/interrupt.h>
7 ?1 r5 t* ?( O' f; ^6 b5 h& y#include <linux/io.h>2 @: u9 d. L/ X! P2 x* f
#include <linux/sysctl.h>% P) q$ H' }' ]% X* L
#include <linux/mm.h>. a7 A8 R* i. a8 Z* Z
#include <linux/delay.h>7 f X1 H) r8 @; ~- _
#include<linux/kernel.h>
: n: c% f# V% y6 H5 Z- [8 R' R#include<linux/fs.h>7 {: E' ]5 x9 ?8 |5 r7 R* L! n
#include<linux/ioctl.h>2 J6 \. @3 n3 w3 c- M3 \- X: x
#include<linux/cdev.h>4 J- L) m5 X# l+ W6 b( N/ c4 f0 h
#include<linux/kdev_t.h>2 w& \, ]* m5 z! v
#include<linux/gpio.h>
6 V" a8 u1 I1 x7 {( Q6 D7 e#include <mach/hardware.h>
% B3 Z% Q4 ] i8 S. a6 N+ r4 h#include <mach/irqs.h>. y" c# K1 h0 V ~
1 r* i; `" Y' w3 S4 o) W! y
#include <asm/mach-types.h># l$ V f- O8 U3 h
#include <asm/mach/arch.h>$ ?1 r" G& w- l# O
#include <mach/da8xx.h>0 M7 l3 d1 u3 {
#define SYSCFG_BASE 0x01c14000
4 \$ |% c2 o5 ]* `5 n0 V4 l#define PINMUX1_OFFSET 0x124 ! V$ `4 f4 _- ]. D
#define PINMUX18_OFFSET 0x168 9 t- Y# _+ M* s3 _ g' S
#define PINMUX19_OFFSET 0x16c
4 T6 e1 s4 C# ]! ?' l1 K9 \. z#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
4 K7 h. @% z( q#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
, W* F* b' f& x; S# v g#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
5 j+ p8 z7 S4 S. `2 T/ C#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR1 N: @. p# J+ Q0 m7 c
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
8 h" V7 [5 y' R- R( _
1 ?* N" V# L! [: z#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
/ @( G7 W2 U& ^. T7 t" H2 S' M#define DRR_ADDR 0x01D11000 //MCBSP1_DRR8 d# _) T. H) u5 u4 v0 V6 w
//PSC
! Z. B; q; x) u. u/ V- N#define PTCMD_ADDR 0x01E27120
; [4 a4 }0 H9 s. G: d3 K#define MDCTL15_ADDR 0x01E27A3C: @5 i+ T! J' {. g, F& y
#define PDCTL1_ADDR 0x01E273041 Y! Z4 r7 K( O* M; \$ `" {0 f) _
//GPIO8 direction
3 p4 Q+ y w/ b3 m3 T& N#define GPIO8_DIRECT 0x01E260B02 z f9 e. P& f( Y( g1 L6 z6 E& `! `
#define GPIO8_OUT 0x01E260B4; X) j+ Q2 ~8 a% `, j2 p
#define GPIO8_IN 0x01E260C0) E+ t3 X+ u! m$ T2 [1 I4 h
' Y) Z8 Q$ P, p2 r
//#define MCBSP1_RINT 99
/ Q2 e7 m2 @& f y3 M& y+ F. ^6 m//#define MCBSP1_XINT 100 $ r& D* c& W# V; R, e4 b; {4 Y7 u1 d
static int MCBSP_MAJOR=239;
3 h, B1 K9 a% K% o8 {! Q+ Estatic int MCBSP_MINOR=0;' ?& \8 Z! F5 h4 f8 n
static int count =1;
* h# n6 ^! C" v' y( \4 D" F7 Q; ?) M, O/ v. V* j
#define MCBSP_NAME "MCBSP-device" m+ X N6 A2 W! t0 ]- x
9 N/ ~9 k$ N+ B, d% c0 Cstatic struct cdev *mcbsp_cdev;0 M. {1 {- [. s+ M. c
static struct class *mcbsp_class;) O/ B' G7 }& J) W
static dev_t mcbsp_dev;5 `- c" M- E1 C; E7 D7 `" v) X
unsigned int DRR_data;
* G" U9 y! b S+ R7 xunsigned int DXR_data;: d% o; o* M- {9 r% ]
static int mcbsp_open(struct inode *inode,struct file *file)
- _. u6 D; H, g! c! V7 M{
2 f+ t; c7 B: B' P4 ?4 [" A
) }4 d/ O$ p0 e$ a //interrupt enable,initialized
, l. u4 I6 f7 e8 R unsigned int temp;
' u; \- ~9 N' @$ I7 T" h8 n //SLEEP_EN(GPIO8[10])---0
' M7 Z0 x8 \! D! X" C8 d9 ` temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 p7 s- P% |( d% u( n- a
temp=temp&(~0x00000400);- B0 e" \ U6 t* g R; ^
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" b3 @! d1 {) K# W+ d M' ~ //RESETn(GPIO8[8])----0----1
: m9 s: `& q, p' h4 i) k% a temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 ] {$ w! Z- `3 p- n
temp=temp&(~0x00000100);
7 z1 e" k# X3 Y8 e! |; V# | __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0! n3 y5 n' D" M: x( Y& v1 x) }
udelay(100);
0 b9 V+ B$ X/ m4 p- a temp=temp| 0x00000100; J! x$ R8 T, U5 a& E
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1; _/ W0 v' @: B. t; v A
udelay(100);5 q% R2 o# F* [ I" \+ ^1 U
printk("open success!\n");! N7 D Y1 I) l( g0 D+ e
return 0;
) |5 u+ }( M+ [% l+ ~! l}
7 h9 E7 ]6 B* G* l' G* `- o! p z$ Q0 Q+ g6 [4 P
static int mcbsp_release(struct inode *inode,struct file *file)
) m5 @" ^+ L+ E( w/ ^ m# v{
0 {7 c0 a$ P2 `" Z7 l+ y- V printk("release success!\n");/ f9 `) h7 F- D) R% }( s; {
return 0;
" {- w8 R5 c5 ^}; N0 \; P' s9 r* j2 h
6 f4 l! a9 p+ n/ @. `; B
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
|% }! D" f! V3 m{2 S" A) ]% q) A8 O9 |
copy_from_user(&DXR_data,buf,len);
+ v# w$ ^, `+ V& J" \ iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
) K9 b$ R6 u( s; F; ^: h* a% T return 0; Q! ?+ ~0 E5 {. G; c
' G1 [7 `1 i! W8 V* I, j' y}
e% H3 I. s- i! D6 H! K& f/ {% ]6 v6 h. S/ g
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)/ k. Q3 k& W* P1 N4 J% E7 @" ?
{ 0 e+ Y8 |' m# |1 {& _9 B- j# |
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- E Q$ E& D# b$ ~& v+ P7 v$ a copy_to_user(buf,&DRR_data,len); ! A) _1 {/ R( e9 A8 ?4 G! e6 j
return 0;' ` w( _' v5 x: T2 j" k1 `
}+ ?" w" |) _6 L% n
5 d" B+ r3 F/ A k$ S- B( B: d; [# k' m0 d0 Q5 l7 b
static struct file_operations mcbsp_fops=4 A% K3 X' B% O
{, [' @ v* ]& I) X
.owner=THIS_MODULE,
$ j7 P! D6 y$ b* f .open=mcbsp_open,$ X: m- i. `5 f3 P% |
.release=mcbsp_release,
; g3 m# s0 y# X' B .write=mcbsp_write,
9 H0 r, }" ?* C0 c I7 l t" s" [ .read=mcbsp_read,
* J% P6 T' n& S. L7 W( m Y9 J}; V; u! }# ?9 k8 }( F
static int __init MCBSP_init(void)& m# Z! Y6 [3 T0 j+ q0 y
{
* e& v% C- G x0 P int ret;
7 r% Y- q# L7 ` \1 } unsigned int PINMUX1_REG_old;
! `/ @: b) p- L6 y) @ unsigned int PINMUX18_REG_old;
2 `, X+ o a2 C- M5 s unsigned int PINMUX19_REG_old;1 L1 J$ a" D! q! c* n. N7 e
unsigned int temp; 5 r) j) Z! N, I
if(MCBSP_MAJOR)! O$ x- r5 d o9 P/ S3 V
{
' @6 t$ q. s( `3 K mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
+ D5 {" N% O5 V2 P( r6 L! r ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);5 V( f& t& f H
}% L& s: D/ J% q) v! P+ P
else+ `" w' Q6 [, _8 [$ p
{3 m0 C6 O5 z. Q+ F' \( W) C
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME); J0 E% _& k Q. g
MCBSP_MAJOR=MAJOR(mcbsp_dev);
) f# R( |: B' f6 \- f4 ~ }8 e: R! y6 @6 k- h* p& L
% K. z# t }1 G- f* u
if(ret<0)% K. z/ J6 o5 C$ |) c* n' ^
{9 R. W2 [9 ~ M/ p2 r% v
printk(KERN_ERR "register chrdev fail!");( D" S% U8 y4 ^3 e2 U. [8 O% H+ \
return -1;
; i5 y6 F$ z0 S* C* `( [+ U; W }+ h: F$ j$ ^: n) F. C$ f# V( q' v
. t& J- t9 ?: B mcbsp_cdev=cdev_alloc();
( c5 P/ d: p7 m- D( H! Q: ?& ?
4 s y8 H% @+ i! V0 n& h4 L1 } if(mcbsp_cdev!=NULL)/ @+ c; g# J" Y8 m9 h
{
- d. Y( @7 \4 q- V5 K cdev_init(mcbsp_cdev,&mcbsp_fops);
8 t+ \' o+ @1 F) T. z% _ mcbsp_cdev->ops=&mcbsp_fops;6 z% |, K, ~& I- E
mcbsp_cdev->owner=THIS_MODULE;
$ D5 ^- m+ t+ e5 Y3 ~/ R ; \# ?1 R2 U7 K$ v, y5 g6 ^: H
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
+ V/ Y! B( ^% o3 A D printk(KERN_ERR "register cdev fail!");
& U; K- B& }: n2 |- c" ~ else
2 v0 f) A# Y3 t/ X+ W printk(KERN_ERR "register success!\n");
: W/ z1 q8 n3 D9 r3 e* ?3 R }$ C+ _$ b& J- R: p8 `8 |9 ~) e3 a* y# I b
else% l5 S+ X% ?: y! y! Z
{
: p! ~' I: x1 z9 P4 u4 t+ L printk(KERN_ERR "register cdev err!");- O* e2 W3 s+ ?! X6 m: e
return -1;
5 }. |) r9 c( \ }; _& `' x+ d. ?' o. D
# G3 e3 J- {, p1 ~/ v( f# s! C1 o mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
/ t0 I+ ?4 K- A if(IS_ERR(mcbsp_class))
: \% U0 R. {! e h/ c4 `6 K {4 H; ~: X3 L. O& x
printk(KERN_ERR "register class err!");: R0 o, F4 w6 ]. c. b" e* u+ X
return -1;4 M" G6 F- W. }/ Y9 f9 N* ]( G) h
}- {1 h$ ?9 O0 n
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 b% o& _! w) @0 G. `) h
& Q, D. Z7 d. p
//PSC. P8 [/ l- H3 o/ s/ l0 g. l8 d
//add Enable MCBSP
; d9 n8 K6 J: Z9 U" U //test% \2 o0 ?( M5 g
temp = 0x80000003;( L$ h$ K Z' Q
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! u0 X2 Z! h2 `% U6 z7 _; c% t# N temp = 0x00000003;
. _; I; Y8 p5 R" C, } writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 @( o0 T. _0 n* m7 E& D + |! E4 [9 s! z: ~7 ~0 w* U
temp = 0x001FF201;
6 N( A- B2 C9 } writel(temp, IO_ADDRESS(PDCTL1_ADDR));
& R8 j9 V3 [3 ~9 C3 o* |: W2 H( r
% A7 [3 x+ v; X //PINMUX
) S, E s2 ?! [ V# N/ }0 Z% g //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* L/ J6 Q% g/ l. F0 Z) S3 ]
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
' P! S; f, W+ |- v& V, T* ~; C1 N PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
; }, B5 `. |0 g5 Y& K writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);* e' {) y* y. O4 k1 O; M7 R
1 \" A4 d# {, ]- H2 n //SLEEP_EN,EPR,L138_SHK1,L138_RC! K) q1 d8 z1 m. E
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, I7 F9 E5 P/ x PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ) I4 q/ t2 U3 n: S$ D; x/ O; t
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! O/ J( Y7 _; Y- j. T $ e4 u) ?# D. N; y
//RESETn,L138_SHK2
. r" _+ s ]/ v; H% f% z PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
# g+ l! s [3 V3 X0 q- Y4 Y/ _/ @ PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
: b1 [1 Y4 ~2 m, y" n9 c M writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; D; ]! @4 g3 c" W( w
X m$ c/ K% }5 a: ]2 G; ?6 ~) X + y9 A# S, s* Q- r& j$ Z7 a: Y
//SPCR Register2 w# M! @' a7 ~
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 e a9 ~0 P! G$ d: A4 g temp = 0x03000000;//(DLB=0)4 U% q0 E( ]) X: s0 f; |8 I
// temp = 0x03008000;//(DLB=1)0 x: O7 T* S' I8 j
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset) D/ W5 v3 _* E& t) u
temp = readl(IO_ADDRESS(SPCR_ADDR));
- B: g( P+ a/ {. N& U5 ~7 u printk("temp=%x\n",temp);
8 ]9 _1 M0 t5 T5 X6 D # x) `9 H' D! f+ B+ q- I; {0 K9 K
//PCR Register1 l' X3 E( Z2 D; Q( S/ G3 h% b
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0+ ^% f/ W0 A4 Z8 [+ \0 X
// temp = 0x00000F0F;
0 E4 A, n F) o' e8 X temp = 0x00000B0F;
# n5 M' n: X' q, h7 e writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ' o1 p" r3 ?) p% P
temp = readl(IO_ADDRESS(PCR_ADDR));
3 g: u% F2 u6 _1 A printk("temp=%x\n",temp);
1 N) j4 J- z4 m0 t5 }$ f9 } //SRGR Register/ z, B: {! s z% f1 }4 }) ~7 k
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11# W( i- ]& @( `
//temp = 0x301F000B;
1 S4 X; [. h4 v9 [ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ; s3 u+ _5 } b
temp = readl(IO_ADDRESS(SRGR_ADDR));
8 v) S4 x0 A3 I; F9 Z& s printk("temp=%x\n",temp);
6 G _& P+ x+ N, M6 X //RCR) Q, W& w/ [) H( [6 e% q( L
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,4 X% q2 K8 ]2 S! Y M
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-06 l# o/ m3 K& g5 {
temp = 0x00440040;4 P* m2 f# A! G6 | O! `
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized % t' B! h/ R8 l4 [! \: k
temp = readl(IO_ADDRESS(RCR_ADDR));' @+ G+ _8 H/ J, q7 y
printk("temp=%x\n",temp);
+ ], w% i$ b) F0 d //XCR
6 n) b6 Y2 S* L/ g% J; O //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
. [) }: p; g# i j- d! y% Y6 {% Q //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! _/ R1 ~$ j, M
temp = 0x00440040;
5 _# {& ]+ L% w writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 8 h. K5 j' n& ? y; z1 N3 ]6 s
temp = readl(IO_ADDRESS(XCR_ADDR));5 H: N! D2 E' [) p( {% E
printk("temp=%x\n",temp);
7 i# Z3 [) A4 q$ v" i udelay(100);6 t9 g! v/ r; [$ j1 D# t9 q
//SPCR Register) F' ]4 @7 p% p) E1 U
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1: A6 W5 x" u3 X/ ]* H) u
temp = 0x03C10001; //DLB = 0 VS DLB = 1: ?2 W+ y2 M$ [. C) c) e+ }
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled! ?9 S$ e$ H" ~& x
temp = readl(IO_ADDRESS(SPCR_ADDR));
' y4 o& V0 V" p3 J/ w4 n; R3 o" ?* j printk("temp=%x\n",temp);: A2 d* X- x( U' y
udelay(100);" h* P1 J& s$ h; \$ Z4 T, F" y9 @
: i: V4 F* i" r0 o) ~. T, g //set GPIO direction9 I, F' M: b% h+ T) o
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ [7 V0 d+ h5 k. D- j5 z; x+ o
temp = temp | 0x00000100;//EPR----input
/ n1 O* u7 z2 e, |6 W, p temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output- \$ F7 b! ]- { p! @. w$ V
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 n$ ~+ e6 O. O; U
8 h' |, o9 o8 S. H
return 0;
3 a# d$ e& ^5 {# f8 R}
* x" w9 ]* \' Bstatic void __exit MCBSP_exit(void): o( s6 z- `2 o( j0 G B
{0 W1 E) P3 S* Y8 o
printk("mcbsp chrdev exit!\n");8 _" j: x d" U: \7 P9 m* f! A
cdev_del(mcbsp_cdev);
1 f' }0 L4 `2 _ Y. R5 V' o unregister_chrdev_region(mcbsp_dev,count);
* r& m6 [( ^+ Z0 {( s device_destroy(mcbsp_class,mcbsp_dev);6 Z" W+ V0 \' d; f7 q0 _
class_destroy(mcbsp_class);& h( r9 f$ M1 ~0 x/ J
}" m- W1 m- k! N, [- }
module_init(MCBSP_init);- a* {0 {4 O: S" Q/ [) t* `
module_exit(MCBSP_exit);- p0 f6 D% S. T9 @$ }
, R" _& P3 Q5 Z4 SMODULE_LICENSE("GPL");
' l) g/ b n9 g7 L7 r- Q/ z
S3 w2 s5 x/ x* N [* Y) b我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
0 `( s! c. x" g/ g5 u6 [我的应用层的测试程序如下6 S+ o6 x6 a# a: d! a
#include <stdio.h>
: @6 o0 g; X9 H* M7 w- {% p# j#include <string.h>
7 ?7 ~9 o/ e/ E. ]0 l#include <fcntl.h>
/ U/ z+ C' D) U e& u#include <unistd.h>
* R* _' p' f# A4 Q#include <signal.h>
7 d& U: v+ g6 w2 ]/ X0 G- X* F#include <pthread.h> //线程
" A# v& ?. W$ J% M* }2 J2 Y#include <stdlib.h>
5 q6 X# @( Z7 _) m. o#include <pcap.h> //捕获网口数据9 F3 i4 G. a7 I2 _* D, a
#include <semaphore.h> //信号: t7 m* ], c! E8 j& F. Z2 W4 `3 C
#include <sys/types.h> //消息对列
s( Q# \# e, `/ V#include <sys/ipc.h> //消息队列* _, R" q' ~! H6 u# E
#include <sys/msg.h> //消息队列, t7 d9 S8 h; s0 C# t0 p" W
#include <sys/select.h>
: \3 L9 R+ ^/ |# S0 `#include <sys/syscall.h>! ]7 f% K) T# F8 o3 b2 {' E
#include <sys/stat.h>
1 A/ i% }7 r4 {- D) |' k0 W#include <sys/mman.h>
9 p/ n6 l& p0 Y#define msleep(x) usleep(1000*x)
& `! ~% i( G% x# D& M2 [5 m, V, B$ a& h! x$ z; ~
int main()
, D+ }2 i: u8 s7 _; t5 q V5 j{ - A+ Z& N+ d& ^* h" n5 E; K" z
//MCBSP,ARM与AMBE2000交互设备! u% ^' o5 C( r" O! b
int fd;5 K1 D; y2 {: X
unsigned short data_write = 0x5555;4 B- U" T; g2 M& y
unsigned short data_read = 0x00;
. }: @0 ]$ ~+ a; I2 W( a f" F fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);1 Z/ N/ q3 }( i7 T# j8 E1 w7 N" @8 { `
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);: e& Y' r8 Y$ X
# R3 E; s+ v! `8 }
if(fd < 0)
& y; b) W2 w: _" N' p {2 \* k7 |( \1 o" r. j2 D
perror("open failed\n");' I6 N4 N3 q/ o. }
return -1;
( `' A) ]8 H( Q1 F }2 O2 k! p7 l7 D1 d, ~
- O0 q+ Z2 _* c9 d; Q8 B
while(1)
# l9 j3 J5 b) f( U3 S {/ U5 T# K# A3 S8 G
4 U0 w3 E9 ?0 F, r) G3 C2 S //AMBE2000每次读写是24个字为一帧
% c# q' F6 _- W0 ^# D) W //写数据时将数据在底层存储起来,等到中断的时候再发送
: P6 r3 k0 p/ _7 [5 ~& s9 X //AMBE2000输入数据是以0x13EC开头的
$ A( E$ u5 }/ G- ^' Q% ]: [ write(fd,&data_write,sizeof(unsigned short));: T/ }# Z& m% e
: r' V! ]) P6 p; @# D
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ( o, ^( }- i6 s2 q* e$ Z, A
read(fd,&data_read,sizeof(unsigned short));
$ y5 R! w! |3 `* }
# j q c0 m& X3 i4 U' M if(data_read == 0x13Ec)
* W' o0 f$ I/ }9 a, V {$ T( g1 L6 j$ e5 T
4 o: b) X, N. @! F# D: }8 h
printf("data_read = %x\n",data_read);& h" D2 p2 N2 G$ v9 [" c( `
}
2 ~0 \" n- \1 p7 C: o, h. f v0 J
0 H* F# X% P% I) a/ b msleep(10);" ?5 `7 }& {9 l& w# R- r
: v& ^+ ^, _2 R# m. b u
/*! _6 l: N% \3 P z4 b8 Q3 n: F( n
ioctl(fd,1);
' @, Q% e! v2 y0 P9 a4 D$ w7 v8 t sleep(1);
+ ^1 {4 D# ?2 @ ioctl(fd,0);! q+ |2 J% [/ R/ j, l' ^+ K' p; k
sleep(1);
/ o- e G9 _& Q */ % _/ X R8 i6 S/ \3 u) L
} ! E, \$ ]) s+ V9 t J- F
return 0;
3 s7 F1 }& n9 B' S" i: [; d
* G M ~3 {0 C2 t/ O7 q}, e' h* C# p$ A( }- }1 F% ?
& E) R& n- |( q Y" T1 b
多谢各位指教,谢谢! 急! Q: P0 j; S* ~
, r6 }: c. O! B% g4 G2 p9 e& J
5 d) u/ A: A( o* F
% B+ q; j8 B: y# w) j9 O6 J8 \" E* e s, J# i. N
, M/ T; r- O; s- g
|
|