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