|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 5 a9 r# e$ f8 x0 L* n
/*
: S2 C1 J0 D/ g p1 | * Copyright (C) 2009 Texas Instruments Inc
, V! m6 l! t/ R& Y+ h! z. Z4 d *1 T8 b0 [( {7 l
* This program is free software; you can redistribute it and/or modify' r& Q8 O7 H; e2 `# V F
* it under the terms of the GNU General Public License as published by, u. `0 e. Y7 O' K8 _( Y
* the Free Software Foundation; either version 2 of the License, or
8 ]8 A$ g- |. y% d# k/ R9 V * (at your option)any later version.# z( O3 F6 I1 Z5 e
*# U4 a. f2 X/ `% Q# G, l
* This program is distributed in the hope that it will be useful,7 T( }: G0 ]4 C' P& d$ g* M
* but WITHOUT ANY WARRANTY; without even the implied warranty of
2 p- x6 U$ a" |7 W4 Q Z * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* b8 c; a& o. ]* o$ G * GNU General Public License for more details.1 T1 ^8 V/ M) b, B$ u Q" o
*; E# r$ J) w4 a4 l/ Z0 o5 C8 ]
* You should have received a copy of the GNU General Public License5 C. _$ p8 y2 { a6 y
* along with this program; if not, write to the Free Software
6 a$ b: d+ e6 A* V * Foundati
; K, M% m* G* x*/
: c" _# ~. u! u; N4 f#include <linux/module.h>
4 `: e/ D- {2 K4 @: P- T! i% J#include <linux/init.h> G9 p. B& x; m: H
#include <linux/errno.h>
8 E7 t8 Q7 o3 o, c4 u* W8 v#include <linux/types.h>3 v% W4 C. }# ]4 c0 Z
#include <linux/interrupt.h>
* \+ `9 J! m, P% G#include <linux/io.h>
5 E. p. L. Q: |4 ?6 u' ~#include <linux/sysctl.h>1 u }0 e |4 _ R4 O% @( q
#include <linux/mm.h>
: ?" ^- B& c0 ^3 G4 k#include <linux/delay.h>% u3 a, c6 C5 j2 u+ I
#include<linux/kernel.h>! n$ H6 f" I- a1 x
#include<linux/fs.h>
* g2 j) J9 Z ~#include<linux/ioctl.h>4 @' H. X! F/ C+ S
#include<linux/cdev.h>9 {* z3 }; c7 z: b
#include<linux/kdev_t.h>! }- G6 ~3 e! ]$ z0 i' Z
#include<linux/gpio.h>
5 P; i3 ]$ y$ L1 G/ i#include <mach/hardware.h>
9 T; f) J; z5 u2 _4 Y. l#include <mach/irqs.h>
( ?( n6 m: {3 w1 l+ i+ e& }
9 ?9 P+ M9 E _" t. n7 q#include <asm/mach-types.h>. K8 @9 S6 z- b& S8 x: N, L" p
#include <asm/mach/arch.h>
% k/ e8 G# v* v6 \8 w% @#include <mach/da8xx.h>7 G7 p0 O3 a7 f4 D. }0 p8 r
#define SYSCFG_BASE 0x01c14000
& }9 O- [( k: b5 z: G. a#define PINMUX1_OFFSET 0x124 ) S7 P6 C& H$ n2 p7 y3 j
#define PINMUX18_OFFSET 0x168 ; k* x$ Y* R+ A9 h0 i/ ] |3 G
#define PINMUX19_OFFSET 0x16c2 G5 E7 y8 H h
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR" ^: y6 { z" b% t' W( i& c
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
3 O M. y& T. K& H/ l. [#define XCR_ADDR 0x01D11010 //MCBSP1_XCR1 j/ j4 G( l9 O0 x5 d% V$ {+ a
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR, ?7 D2 [% z! H1 V; L& }
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
, ?" H9 N0 F y2 Z9 ?9 S: m, W m
" X; q6 p8 Q' c, Z3 p1 \5 z#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
$ v2 e+ A3 r( q+ [; c#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
5 q0 e/ k: T1 v1 N' q- w7 M$ a//PSC* F ~+ W% {% |3 U9 f5 e. ^3 r
#define PTCMD_ADDR 0x01E27120 3 R+ `& l: f8 `
#define MDCTL15_ADDR 0x01E27A3C
9 E7 h9 W$ c9 \5 b, B2 G b: ]#define PDCTL1_ADDR 0x01E27304
) { S3 B6 D" e, w3 _3 {//GPIO8 direction
- @& R% L! z4 x$ E' i. O* J#define GPIO8_DIRECT 0x01E260B0
( _7 ~% H) w' [* n#define GPIO8_OUT 0x01E260B4 b. J# c) C2 e! O
#define GPIO8_IN 0x01E260C0 H4 R, z/ l5 h" N' d
# I- ~. Y0 A0 l$ H- y) C//#define MCBSP1_RINT 99
, F. O2 h2 s( Q' Y3 X, a7 d: l8 w//#define MCBSP1_XINT 100 " ~9 N$ K2 y5 J$ s* o+ |
static int MCBSP_MAJOR=239;
4 b/ a% ]: e- { I6 ~static int MCBSP_MINOR=0;
2 V, E" r( l8 G) v$ N) k0 Fstatic int count =1;
9 h* D v: q5 f0 [2 P; D t# W" l6 J5 F
#define MCBSP_NAME "MCBSP-device"! V4 Z `" d: ?& ^3 ?
) [' b+ E0 ]1 P% rstatic struct cdev *mcbsp_cdev;+ c* R: V `2 P0 v- h4 N. x& X
static struct class *mcbsp_class;/ b/ z. @8 `2 l8 C0 u
static dev_t mcbsp_dev;
1 v# i! l# Z6 Sunsigned int DRR_data;. N: ?2 n. v# H
unsigned int DXR_data;
3 z& [ H; f- tstatic int mcbsp_open(struct inode *inode,struct file *file): Q$ f A; q3 O" D. [5 G6 i( i* @
{" B# c; b4 p& T
* W# I+ M/ S8 e$ S7 h2 r1 S
//interrupt enable,initialized+ u% X( X. G$ A: K4 H$ n: h
unsigned int temp;
& {: J4 R# ~* f# u' l, u //SLEEP_EN(GPIO8[10])---0' W# k5 P! x7 Y# S/ ?
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: I1 v" Z9 b; K( @7 R temp=temp&(~0x00000400);4 D0 m) P7 x9 g; v* j
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
^! `# X1 m9 A- X/ E8 `( u+ l //RESETn(GPIO8[8])----0----1/ _8 m6 D: Z) H# s
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& _0 w8 o: m( Z$ |! X- h5 y temp=temp&(~0x00000100);
$ g8 s! l5 z' Q& f( s7 q5 a __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ A& _+ M9 O6 I( k# G udelay(100);
+ l* n7 X/ I. X$ S temp=temp| 0x00000100;' r8 u+ }3 ?8 j+ S U
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ Z' `( D% g7 b& P* ]+ n udelay(100);: [ ?( G7 y2 l3 R" V
printk("open success!\n");
4 L1 z, E H% S% a return 0;8 F: P# i9 A5 u1 `! z! V& e
}
0 z# S( d2 A* L* D! t
$ r' q s5 M: A2 E; K( n, y/ Wstatic int mcbsp_release(struct inode *inode,struct file *file)
# {4 n& r3 D/ K; O0 @5 O K{7 i( o, w! B6 M4 m. ~5 y+ g
printk("release success!\n"); }9 T' d( k/ @: p* n% m/ y
return 0;- _. z3 C1 W7 G0 T
}( A& F7 l# B6 U; @
! F7 t4 N. {( B# s
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); q; D2 e8 ?# G. X' _9 K
{
8 A- y% z) W* X- |5 F% N$ y6 e- c copy_from_user(&DXR_data,buf,len);/ O+ ]2 H/ O9 b' e
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
4 ~1 ~# \) N/ K, o2 n1 E0 Z return 0;4 p/ t. I# ^5 h4 @/ a
# G1 L# I1 ]2 j! X( R3 B1 ]) m}
* j r1 @2 w1 `& c( X9 d- |
9 ]# ~3 Q/ n4 B/ A9 p' w# rstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ ^* X1 T1 V; d2 u' \* E{ 8 a+ S% L" w% Z& F9 y0 Y
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
/ W) m, y7 J" a! h8 Q copy_to_user(buf,&DRR_data,len);
9 G$ S6 ]4 a: B% W; s- y% c/ m, u) d return 0;/ R" V$ r7 f4 y& T1 O2 G4 T6 q$ W# x4 m
}# U+ w5 F- \* l9 z/ L; a c
! v5 R# c3 ]6 H. a! o
; \3 n1 w/ y" ^static struct file_operations mcbsp_fops=% z/ D# O& \# N# e
{
2 C5 l# Z% n+ J- _ .owner=THIS_MODULE,4 M3 r$ M6 K8 ?/ D0 r
.open=mcbsp_open,
: A# z5 E, `; k6 F+ Z .release=mcbsp_release,
: B: V0 ?- P2 z8 m$ |5 W* l .write=mcbsp_write,
+ ]6 l/ D: ^: {- h5 f) f6 V/ X* a .read=mcbsp_read,0 P0 f$ c9 k a0 W* k
};; ]9 L7 m; i4 @: O* X+ O3 h
static int __init MCBSP_init(void)' }( ]- c# I3 Y# {0 H: o
{
( x( ]2 q4 ^$ O6 e5 r2 s) M3 x int ret;$ S$ o/ ^( C+ `' i, }* V$ b
unsigned int PINMUX1_REG_old;0 K8 I( x# j6 T+ V6 o
unsigned int PINMUX18_REG_old;
% t# |! S2 a( O' Z unsigned int PINMUX19_REG_old;
3 n- C& H4 z) K unsigned int temp;
' w+ X9 ~! C+ T% ~ if(MCBSP_MAJOR)
9 d5 L! y1 ]5 d4 l6 v% D {
5 o2 |/ K( G( Q+ d1 {. f mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);$ K( g; ^# {+ @( M; ?
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);: D+ G7 K" m: D4 X" B
}
$ d: Y# J3 \% J7 a! K else
; D5 x# z# v" d( L) h6 m3 f2 b {4 D! h+ e. Y' l6 l, a$ O5 X0 P, L0 F/ C
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);& J2 D+ W- A& V; y7 F
MCBSP_MAJOR=MAJOR(mcbsp_dev);
% v3 D6 c1 _5 y0 V) v* [# a }# i( R+ V: m# y
' I- @2 R2 g& i+ ~
if(ret<0)
b3 t/ v. `9 Y6 K" i% s {2 _" g9 i4 B, w! R3 F
printk(KERN_ERR "register chrdev fail!");
8 ^1 p5 f) ~+ s q# t. G1 e! n, f return -1;# @1 V$ W6 w& }% t" x- u/ O. a
}$ z1 m6 y( g1 R' B9 i' P
7 o% R) r! h4 z; w# G$ E+ y% S! r8 p mcbsp_cdev=cdev_alloc();3 k+ s4 h5 S; [& I0 H
* Z! ]7 R; n2 W; V if(mcbsp_cdev!=NULL)4 I: V3 d! Q, [; |( l# r4 z
{
0 b# _% E$ ~6 J! I' f cdev_init(mcbsp_cdev,&mcbsp_fops);
6 \: o" K% O: Y8 N mcbsp_cdev->ops=&mcbsp_fops;) S2 A9 O! F3 W( ~9 h8 d: d8 h: ^5 v
mcbsp_cdev->owner=THIS_MODULE;3 l" H! {) S. h2 z+ {; \# E' o- ^
8 j3 b5 o! E; C1 u) } if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% P$ q3 B# ] i& S" j2 W B5 |
printk(KERN_ERR "register cdev fail!");/ w* { Y, Q5 e. n
else7 P/ {$ y- t# d' H9 i+ C; P K* Z
printk(KERN_ERR "register success!\n");+ ], S* f; Q- D! D0 N3 _
}
5 i/ ~% l d3 [1 _6 n( \- K6 Q" S3 m# x8 b else0 K5 \ b A% ]6 O5 f- W( |; X
{
6 h- @* N' \9 s2 @ printk(KERN_ERR "register cdev err!");" G3 F1 O! U* V( B6 ], I- o
return -1;
7 t" O9 n" B) {' j7 n+ P P- H* Y }
3 `7 b; Z3 H0 Y8 s0 a8 G $ m4 M3 ^- F! y6 {+ A0 C; m
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 Z6 p' u5 {4 w* u) {' H if(IS_ERR(mcbsp_class))
6 A& c8 y+ r! W5 S/ i {
- V% M t0 [2 \' ]$ _3 H0 X7 U* m5 o printk(KERN_ERR "register class err!");$ @% ?( R% T1 C( U+ d
return -1;* _* [9 c. W7 U6 {% C3 M: o
}. d. x1 B! M, W8 N
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 f. m+ X6 v- C) |
( s2 Y, g4 G L$ D7 m //PSC* W8 d" ^/ A* e
//add Enable MCBSP6 L% a, x# x+ x! j6 j
//test* Y+ M+ A6 Z9 S- w9 Q. g' {0 [; L
temp = 0x80000003; U1 ^8 N2 Z0 S, Z3 H+ m! r8 A
writel(temp, IO_ADDRESS(MDCTL15_ADDR));. d: g; Z' I* w% [8 o' @
temp = 0x00000003;. X; t$ d9 p3 c) a
writel(temp, IO_ADDRESS(PTCMD_ADDR));
3 [; l9 a& V: b/ U7 a ; C7 y- L6 v T% z8 t
temp = 0x001FF201;
, V2 V; p+ c5 G2 W3 c writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 ~6 h( V0 Z1 O- Y' z0 } 1 ~, `4 K* x9 B: N+ c5 G
//PINMUX
f5 z% s, V! ~4 A% J //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,% x0 v7 y! v4 {% ^0 U
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); * b/ k4 z2 E6 `. N. x) x6 d
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
5 i" i! Q# [/ E0 P writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 N2 u/ W9 `3 O6 M {
1 ?& k) H) t' @ //SLEEP_EN,EPR,L138_SHK1,L138_RC, t" e* G. |! N0 R0 c
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 6 P! D7 U4 H4 }* y$ x7 e, s: u, j" D
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
" F, X3 ^2 V6 K- H9 i* F- Z writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);- N6 p( h |$ }# n) N
) ^$ {4 Q3 l, P3 I. {3 T //RESETn,L138_SHK2
! T, o+ a, r. A9 ^, \9 k PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% z; z6 r( N2 M' c; ^+ V PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
! C% M4 ]! ~0 u0 ~! q% s writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
e0 w- T5 ^- C1 {; x" W" T
& }6 ]* P- @% {
$ V$ v& b+ T k+ j1 B //SPCR Register- D$ t! C' h1 g1 n' y
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset$ A5 I2 \7 \& V# z- j4 { j2 m
temp = 0x03000000;//(DLB=0)
/ Z# Q# x2 ^" @& @ // temp = 0x03008000;//(DLB=1), |* D0 o. X6 d2 k$ m
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
; P1 S9 K4 M" Y$ y8 ~6 J! G temp = readl(IO_ADDRESS(SPCR_ADDR));9 u/ x- I h- S" U$ \' h- V# ?
printk("temp=%x\n",temp);
7 x* J+ X' b6 E; w( r; J' v
7 r) {9 A" P* g0 P2 G9 [9 W //PCR Register; U9 `( v5 J0 l# D3 P6 d
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-00 T6 A3 d6 P6 {2 G. L
// temp = 0x00000F0F;
6 p: p& q6 k1 x5 r4 @ temp = 0x00000B0F;
6 R" n& {/ n) ^. }) V writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized , B7 p! [9 O' h7 d
temp = readl(IO_ADDRESS(PCR_ADDR));0 B# U# s( w/ d9 {# B/ ]
printk("temp=%x\n",temp);
0 F6 t7 S8 a' {; w5 X* }' M) Z& Z" r, x //SRGR Register1 @1 ~# x) n& p# o4 `
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11 {" [% }2 {- g. g4 J$ m) r
//temp = 0x301F000B;
2 g2 H1 e( U( t" Z writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
/ v6 b! H/ V9 f temp = readl(IO_ADDRESS(SRGR_ADDR));& x( v( k" O9 |0 {9 e- j2 r" r; s
printk("temp=%x\n",temp);
# D: g2 Y- T8 `5 z //RCR5 q5 l5 S/ Y* N. K1 D/ k2 }% w' z
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
8 j9 s2 [8 e: N+ z" L8 I //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 ]$ }+ c) o/ v, `$ F% y/ ] temp = 0x00440040;( j# h i# h0 M5 A$ C) _( x5 q+ s; E% P1 R
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
% V! M' b% ~ K: ~1 v- |+ \/ f temp = readl(IO_ADDRESS(RCR_ADDR));
; X2 ]" A' C0 r& ?, `- w printk("temp=%x\n",temp);+ s8 X/ ^' @8 V; @$ g; m
//XCR; q) B6 e# X' E8 V6 B, P3 ]& ^
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) [8 K- G# j8 [" t
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
2 f+ p x& R. r# H* o, ~ temp = 0x00440040;
! T$ v4 n1 }' y( A5 {$ J writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
# G0 [2 @; \) P+ U6 p# z temp = readl(IO_ADDRESS(XCR_ADDR));& ?) Y: d% N; X6 {8 _( B
printk("temp=%x\n",temp);. t& J* c x6 a5 g1 O: [5 I0 r4 l
udelay(100);
* N+ k: P; c$ X( \3 z8 f3 |2 F8 u. \ //SPCR Register# H) e4 Y) n) [/ _
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-12 D6 N4 o4 N2 k! E, U& Y
temp = 0x03C10001; //DLB = 0 VS DLB = 1
) k* c& a3 V* c% ~( ` writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled/ l7 q! _% |* ?
temp = readl(IO_ADDRESS(SPCR_ADDR));
' c' T- H2 ~2 r9 H" x) M printk("temp=%x\n",temp); j& i' J8 C7 }8 w' C3 k
udelay(100);( K6 C/ Q8 v* |5 N- c9 E2 O! R
1 g$ B+ Z, \2 [
//set GPIO direction8 G3 H0 i3 t+ V' O4 R9 W9 J, C- |+ {2 ~
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 i: l9 \7 }4 o! p7 C' M
temp = temp | 0x00000100;//EPR----input# P8 c3 C/ q5 @3 O6 H
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
t$ u$ F" O5 O, M% A' `8 S- g __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); $ a& z. K4 ]3 \& t. c" C: k7 w% E
3 \3 Y9 r- ^6 O3 j! i& v4 M
return 0;
% d& m$ j# n; p8 h- I}
( I2 | D1 d4 J: S! u( @# Vstatic void __exit MCBSP_exit(void)$ W8 g! m. a- ~ T5 I* v. ?3 m
{1 r3 {4 ]' y: Y4 W/ t
printk("mcbsp chrdev exit!\n");
& v; _1 @8 B, l. P cdev_del(mcbsp_cdev);8 a+ T4 t* U) F+ d8 t) |
unregister_chrdev_region(mcbsp_dev,count);
0 G# Y6 B& ?5 @8 i8 n y2 e3 u3 ? device_destroy(mcbsp_class,mcbsp_dev);
$ {( g2 d& r Y class_destroy(mcbsp_class);( f* h# p U2 k0 P7 O
}
! D$ x) g9 C* \- Qmodule_init(MCBSP_init);+ k5 C$ g2 m% E l# f
module_exit(MCBSP_exit);
9 I* x1 J4 U8 [! l+ ^3 ?0 G8 ^4 A8 ~6 I; N; m& D1 ?) y% E
MODULE_LICENSE("GPL");
) x5 ^3 j3 T* `
# o. s' y* x5 c% K/ F我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ a7 ?% D, l; \1 h我的应用层的测试程序如下
1 ]8 z; c' Q3 p% E5 n, E, @#include <stdio.h>
U' {9 ^" b& U#include <string.h>
8 I$ f0 ]) K- y$ {5 Y8 c#include <fcntl.h>
. n4 E3 v" |0 U, U3 E! S#include <unistd.h>
/ L# ~" i' }! k5 ^0 _5 f7 w4 c5 W) d0 k#include <signal.h>
2 ^$ p0 Y& G% x$ s! ^* r#include <pthread.h> //线程, }* ^, M$ o$ x+ c
#include <stdlib.h>
! V( [3 P# l$ b. h! `& q+ B#include <pcap.h> //捕获网口数据6 T2 g: ~% ~" g6 C, j
#include <semaphore.h> //信号1 R4 s+ y: r! g9 X; x n: g" s
#include <sys/types.h> //消息对列, K4 n; c8 v% ], k. r9 n
#include <sys/ipc.h> //消息队列
- a9 a* j7 ^1 D0 A8 P9 X) d#include <sys/msg.h> //消息队列- U; z2 [6 b3 H3 F- {9 c
#include <sys/select.h>
8 y* x8 d. l# f; d#include <sys/syscall.h>
( {* ~( g1 i; n. p#include <sys/stat.h>
1 q9 V. d* ^& s# T9 P+ X3 n#include <sys/mman.h>/ R4 }- z7 g/ W* b( J% [
#define msleep(x) usleep(1000*x), D* Q0 T/ j" P) J) j% j5 q4 r. N/ D
1 k e) w) L- ^" w' [) h
int main()
9 N4 x" h( s% b: a3 ^6 u# |+ W{
7 H, P! K1 n$ K6 s2 A //MCBSP,ARM与AMBE2000交互设备
( N- T; j0 U0 }, P% G8 X* n5 Z int fd;
5 S' a! M1 J2 v+ R# x: W unsigned short data_write = 0x5555;6 E. F# T5 W2 A) S a4 C: D; G+ n7 _
unsigned short data_read = 0x00;
. }: R+ D$ l8 g6 ^4 W" y8 P fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);$ h$ n% V2 o+ Y/ ]& E3 y) B
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
& Y! w, A, G! F/ d 2 A8 M" f! c' l8 M( K% n
if(fd < 0)
( L) x. e1 V, _6 B* B$ h {
4 ?2 V3 ~/ D5 {1 H0 O1 E perror("open failed\n");/ X, s: l* b& d# l3 i
return -1;
3 y, {1 @3 x: [' l% @4 u }
: Z* ^$ q# P) _0 l) J
& _( Y6 |$ J- [) V. R! q0 h while(1)% S/ l+ X- b: A9 ?7 `) l0 r. s
{
+ @! q$ d& X( L. V' K# c; P. S
( j/ l% v, J P //AMBE2000每次读写是24个字为一帧
; f+ a1 k- |5 }/ a //写数据时将数据在底层存储起来,等到中断的时候再发送
5 U& t. G% d& @* i //AMBE2000输入数据是以0x13EC开头的9 [* J; |& B2 G- S! H
write(fd,&data_write,sizeof(unsigned short));
8 a5 f" k1 G2 F# Q, N- P3 m
' w0 C3 G- I3 s. i //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 $ f$ m5 u9 Q* Q' R6 U/ l/ p
read(fd,&data_read,sizeof(unsigned short));7 m, _) |5 c8 U! Q! Z- ]
: v$ i# ` ~6 Z2 F9 _" W if(data_read == 0x13Ec)" B: H5 H+ |- x ?
{
$ z! P9 j! ?# ?2 {% U* N4 a) S * R# k7 e8 I1 y: j" j" S, n
printf("data_read = %x\n",data_read);0 X% K: U7 I# E7 H" c( r
}
7 [: Z. }5 a; X. l3 n' \# [
7 I7 i# e0 n: ?; l$ W+ L$ _: G: x# k msleep(10);
# {5 B% J! y" B) F% j7 k. P
: M6 P; ~4 o* T# p- T( ~ /*2 D) r* g& N$ ]$ u9 E
ioctl(fd,1); 9 g& K% f8 _! c
sleep(1);: ~3 _( B+ |+ E3 L: N
ioctl(fd,0);
2 z4 B& A& m9 L! a5 o: b sleep(1);, Z1 a) R: ~" s$ G' ^
*/
, e/ h. v& \. C/ V s ?0 I/ V } 7 T# h( U. g% `2 W; R" R
return 0;5 k- d" T0 y& c* N0 E
9 i! C# t2 U/ w! I, A: [
}
# @5 U1 P+ ~8 R% n8 a) o$ y" I" b
/ S7 _" b; T' V- W多谢各位指教,谢谢! 急8 l& p; Z, O5 e" ~! D
8 @& R' g2 k: u; W6 d
3 q$ k/ x3 t3 r9 d5 \. _: z
6 x) }9 t9 c& L8 S: Q, I1 U" U, `3 g* p8 a- C
9 j# ]3 ]9 c: Q; q4 f
|
|