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