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