|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: H! F# s* Q- z9 x) ^
/*; W+ m5 L, X; r! j4 W% B& a/ A
* Copyright (C) 2009 Texas Instruments Inc) X6 e; Y* T3 L4 c3 W
*
- E9 e3 Z2 T- w% F, P: B, g * This program is free software; you can redistribute it and/or modify% z' K; ?2 |# j# p B% |( N& V
* it under the terms of the GNU General Public License as published by3 c; e7 L0 ?9 E7 O$ E+ g* [; t, u
* the Free Software Foundation; either version 2 of the License, or
9 R Y4 a) j7 N * (at your option)any later version.# A3 P; C2 m( |& j' H ?9 G
*4 I7 ~) n2 D& T' r
* This program is distributed in the hope that it will be useful,
! A4 X) o, V% j7 {1 l4 ` * but WITHOUT ANY WARRANTY; without even the implied warranty of
3 j: p0 v0 T G% g5 ~7 o; }7 x * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 l s* z; `. [+ ?9 I5 J * GNU General Public License for more details.
/ D& L) F* F9 Q, o* g8 o+ M( G7 E2 T. M *
0 u+ N/ L1 [. q, S" Z/ S * You should have received a copy of the GNU General Public License7 F+ ^0 y. i6 L3 s" W
* along with this program; if not, write to the Free Software
- S) F6 i* h& e6 c8 Q4 @1 P) S * Foundati; e3 ~. b8 L& o! a: A
*/$ [) }% v9 i0 a! z
#include <linux/module.h>% d% V$ k) V/ R! w' y. d5 E
#include <linux/init.h>. N1 \0 u; q3 m/ U8 b' w; D
#include <linux/errno.h> V5 h; g8 ]' ~, D/ E G: L& v
#include <linux/types.h>- \2 }8 z" M9 V1 B% x+ _
#include <linux/interrupt.h>
) ^- N( M* U4 _9 G. \6 l8 ^#include <linux/io.h>; v* P, }6 ~! h
#include <linux/sysctl.h>" w5 `1 P0 O- a
#include <linux/mm.h>
, [/ _/ N3 g! K% q#include <linux/delay.h>
; p3 `& B3 W% G; }3 {4 T2 P' I#include<linux/kernel.h># P; K& t7 z, z) z0 q+ m
#include<linux/fs.h>
& ?1 _2 H: H* ]" p* k#include<linux/ioctl.h>" I& _: q" }; i) P* v: w; _+ F' D. M& D1 C
#include<linux/cdev.h>
' _. x. Q7 o! N#include<linux/kdev_t.h> s" c" B" g o o
#include<linux/gpio.h>6 U8 Z. n0 c) c- t1 r9 C" c( ]6 f" L
#include <mach/hardware.h>0 Q# a; K$ R0 _6 j3 A
#include <mach/irqs.h>
; U8 U' I: X% X3 Y7 J+ H: U: ?" A0 Y, O5 p5 e, Q" t
#include <asm/mach-types.h>
0 v0 v* m$ ~4 V5 Q! `& o( {+ W#include <asm/mach/arch.h>
+ [2 y4 v1 e5 Q8 b; m#include <mach/da8xx.h>
1 i$ L( b! T$ G#define SYSCFG_BASE 0x01c14000. U: s" ~& _) | ^ w8 [3 a8 m
#define PINMUX1_OFFSET 0x124
0 k+ `! I" M4 Y& @ N0 E#define PINMUX18_OFFSET 0x168 , Y" d+ {2 g+ o! E9 u1 |
#define PINMUX19_OFFSET 0x16c, s5 f9 j2 w' P V+ p
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
1 a6 A9 A1 f/ R' |/ s#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
. M4 I; u6 W+ Y4 A5 E/ h#define XCR_ADDR 0x01D11010 //MCBSP1_XCR, R$ b: `; b7 j4 ?! Q& s" ]
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR" I& }1 t9 i) w' f0 |7 e+ ]! K0 t
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR0 D3 L0 \1 G/ j$ F, Q3 ~
, c5 _7 z/ m! n9 h) y: x# W$ m
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR( z% U. ^* G3 t' f
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR q* S @9 v8 y, Y6 u3 r
//PSC4 X. `2 ^( _! f2 ^* k
#define PTCMD_ADDR 0x01E27120
3 |" U% V5 Q; T8 D+ Y#define MDCTL15_ADDR 0x01E27A3C5 V- J6 R0 R M9 I5 o$ C2 h
#define PDCTL1_ADDR 0x01E273041 ]$ T, t4 c1 e7 j0 K8 [
//GPIO8 direction
. I* x5 n% W5 A/ p: r#define GPIO8_DIRECT 0x01E260B0
9 h* s9 V, v3 T- P% l; B1 r% r1 d#define GPIO8_OUT 0x01E260B48 B; j3 E" p+ f1 q5 P0 f
#define GPIO8_IN 0x01E260C0- _3 d' m: A' D& b
0 U: J5 z+ z! h( L# L//#define MCBSP1_RINT 99
( T8 h; j! J: @2 n. L//#define MCBSP1_XINT 100 # O2 ]( d* h4 e$ Y. V
static int MCBSP_MAJOR=239;% U& g! T1 b: Z, F1 a& J
static int MCBSP_MINOR=0;8 A- }* U4 t; {9 p! q! p6 k9 u
static int count =1;
+ n( y6 V, M# F- c! X% [. r9 F3 s5 p5 i8 B1 J3 z! D1 _
#define MCBSP_NAME "MCBSP-device"
1 e* Q0 N, f3 d& O; h, y+ u
0 X9 v) q& i; H+ M- M5 Ystatic struct cdev *mcbsp_cdev;
. O$ v% c& m( w* y# astatic struct class *mcbsp_class;
* d; j7 h! M9 ?9 xstatic dev_t mcbsp_dev;8 G0 J; b: ]! k" q% C. k
unsigned int DRR_data;
6 G9 X6 G5 ~) K( f0 }/ q$ ?unsigned int DXR_data;
: V: u' W0 H8 A! ystatic int mcbsp_open(struct inode *inode,struct file *file): p$ N/ Q9 h6 C
{
; P: Q: V* `3 i F0 @& C$ N 2 a, Y$ X3 @. k
//interrupt enable,initialized
8 ], ~/ \. L0 \! K7 P unsigned int temp;
" k; b8 X5 i& d6 u2 a0 q/ C //SLEEP_EN(GPIO8[10])---0" s( g/ {4 p1 P" X
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ \3 x1 z% w' U# a temp=temp&(~0x00000400);4 A8 v4 J9 e; B4 n' z! ~
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- J) e* R8 D: D! g" ] `
//RESETn(GPIO8[8])----0----1$ z" a2 @/ W) p1 b3 l; R5 ]
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' w- y- P8 e8 V8 a7 x temp=temp&(~0x00000100);
0 f- ^8 N s) k0 L3 m __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
0 m. F% q" w/ k6 Y- v5 K udelay(100);
0 k: G. ]5 u6 }( }, f8 I temp=temp| 0x00000100;8 W4 P8 @0 g& E% J5 r* j
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---13 r' c6 N* f9 s* s+ {/ ?% J
udelay(100);, T$ F8 M# N' C" b; n( g9 B
printk("open success!\n");
& m z5 p) l3 ` o* B% e, h return 0;5 o- b; N0 k. J; Z. V
}
% q" a B5 Q( \" H! D- x
* w! A7 k$ ^* zstatic int mcbsp_release(struct inode *inode,struct file *file)9 Y1 v j+ z K- v6 J9 U6 b" ? h
{; A5 R3 R# R4 M5 V; z6 u, ?5 [7 N: ~
printk("release success!\n");- [. b3 t) [1 N# b
return 0;
3 h. |* [7 \1 i0 z2 G$ m+ C}, c' E: p; R4 p9 U- Z% D
0 ~& V/ \+ f Z+ k2 m
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off); W2 k; u3 L! `
{
- ^" }* o* O& _4 ~" J$ | copy_from_user(&DXR_data,buf,len);
+ L& B4 C& ?+ g iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
- y: w/ G* m8 F' o7 a1 {0 G' { return 0;
$ c) u3 G7 r7 X* v ( G% D* F. v; f) y* C
}
9 Q7 R3 g6 P- ~. x# p# S: k; A9 b0 r4 ^8 Z. _
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 T _8 ~4 A7 G/ i+ R r
{ 8 n/ e- |, x; a1 v, E
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));% n) H# Z" x, w6 @. e" s' k
copy_to_user(buf,&DRR_data,len);
( N5 n) P0 l( a6 C5 M; w/ q% p4 E return 0;! ~! O8 r& M$ o# l. u! n
}
1 `7 T) l) N3 o# k1 \8 y4 ~ i. Z" w8 U' J) }
) [8 t5 Y! F5 m; g! E, Y7 h5 ^
static struct file_operations mcbsp_fops=
: I1 k+ ~0 n/ h: W{2 p' W6 E" r4 \# E
.owner=THIS_MODULE,
1 m6 ~+ f3 T, B" B .open=mcbsp_open,% y# ^# u" q' m
.release=mcbsp_release,
% i0 { E% y5 \ .write=mcbsp_write,
$ z; ~' [6 _. W3 h6 |6 k .read=mcbsp_read,
7 Q: J& V) H4 P' f p# j};; s- b( j& z5 m
static int __init MCBSP_init(void): f9 k/ ~4 V$ j2 s
{
4 t8 I2 `6 u1 x; g5 P5 m3 r# P int ret;
) H; y1 C4 l6 ^4 K& r# L" y' E unsigned int PINMUX1_REG_old;; @5 t. W9 s# E5 W8 w! W0 f
unsigned int PINMUX18_REG_old;! e% I9 L+ @3 a! v( U2 I# Z
unsigned int PINMUX19_REG_old;
* P# F$ @/ @. o2 \: U( L, H8 t unsigned int temp; / H$ s4 v& S M1 ]+ i! O) S0 i
if(MCBSP_MAJOR)
3 H" d. I0 E5 g9 m" R {
7 f& z3 H0 ~/ g5 E! b8 X mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);7 P( M+ \$ o; w8 P1 C- O4 g
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
" g# L' B% Z) _5 j/ ]( J }
3 ?% d! a& k6 E else1 Z4 M% A) n3 z5 o& J0 ]* W& |- z, H
{' c9 ?" b) \! g% x
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 H8 ^6 M+ E7 |: s0 R
MCBSP_MAJOR=MAJOR(mcbsp_dev);( I' F/ a3 Q1 ?5 y
}! [" L; i$ X% Z0 p7 c1 e
. p# G; Z- _: ?) C# v
if(ret<0). S/ ~: ^! N: l2 V5 n* ~1 o4 ]
{2 j# y, t; g" j& `: r3 W6 e
printk(KERN_ERR "register chrdev fail!");
4 ^4 O( Z: `/ E# k+ l J$ L& S H return -1;
# R3 s& m3 A6 m3 b }
4 ~( _4 U8 J1 Z) `5 o; ~4 ?7 X ; X' K' G! n, N* V0 Y4 q
mcbsp_cdev=cdev_alloc();
; d( q! F7 D7 A/ \9 c0 [0 q , f3 m3 m1 \ S/ _. `
if(mcbsp_cdev!=NULL)1 z! f4 j8 y1 i* I3 i
{9 \/ d. g( O$ ?7 Z) }( _
cdev_init(mcbsp_cdev,&mcbsp_fops);
& \' I8 N' R/ u$ g( h1 Q mcbsp_cdev->ops=&mcbsp_fops;
3 K# V# G1 |; Z# s mcbsp_cdev->owner=THIS_MODULE;
( |6 K4 {) t0 E- P
; ~" G3 J7 ]" y9 Y7 t! g if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# c$ s/ b \7 G7 i0 u5 x
printk(KERN_ERR "register cdev fail!");
( b& |- c4 |8 Z else
, p6 J( H" i: ~0 e4 \1 m" P0 m printk(KERN_ERR "register success!\n");
2 Q! e+ y7 c4 m' b3 T+ _ }
* P- z; a6 [0 | N, l! x, u' V2 C0 ? else
1 M( J' B* x4 i* b1 b {5 i V# {' a8 [4 t$ K/ M, L
printk(KERN_ERR "register cdev err!"); s( ]& q& W/ h7 c+ r2 r
return -1;
0 H8 R( w, f) S& C+ ?0 `( n3 e }
; M! @: o0 c8 S5 s7 c+ ? . T3 b0 A: i$ [* h# D- k" r- Q
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
M1 S) p' M6 s# O6 d; v2 I1 |( H if(IS_ERR(mcbsp_class))
) |' W" o& p7 J5 _9 D8 J! D; A6 d {
: I7 F8 C3 @+ z* m" v& T printk(KERN_ERR "register class err!");
5 j! d$ u; W; \; X; C. t) _ return -1;
2 M5 Z# M# U7 r8 } }
% o5 P0 \/ g& N$ P/ f device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 g; j( Z( F2 p: C( J* b: j
, y- D1 W$ w% W5 F //PSC
( U7 T7 v% S. [" L //add Enable MCBSP9 t4 ~7 y" _$ h
//test7 ` T- K: O' |" `) G4 T( l/ u6 J- a
temp = 0x80000003;
; q. [) b; N$ [" j' v7 y% ]5 L writel(temp, IO_ADDRESS(MDCTL15_ADDR));
: a7 X" _. w5 ` temp = 0x00000003;
6 h( E9 [% o4 p$ p* K& d7 ^ writel(temp, IO_ADDRESS(PTCMD_ADDR));9 Y9 {/ [/ m$ Q |
, R3 m+ E" Z2 O: |2 I! W temp = 0x001FF201;% \8 U& I; m9 q7 x2 W- g, K
writel(temp, IO_ADDRESS(PDCTL1_ADDR));$ d. e& D# t. R" h$ D
% G' J, b3 K& F, F //PINMUX
( _6 `7 G; V6 T9 z //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
# L# L d* x& W9 w3 C; h PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 |: y8 ~( M& T" `7 W PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 5 `, n: B/ e7 Q9 ?
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 m# s( T, q( E9 ]( V
9 W: I5 ]! _8 W% L& m$ \! K8 H //SLEEP_EN,EPR,L138_SHK1,L138_RC
5 r- }8 t' k8 [! n- e9 i5 Q- r PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ' A1 s# {* {: Z2 J# w
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
) t' `" U& a4 c( | writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);6 |! Q: Y5 d1 }" A* }
' q; e/ p' s! K& i: h$ t) b //RESETn,L138_SHK2 z, Q% U/ G8 _5 N
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); * L4 ]* Y5 t, t2 N* V2 @1 W# n
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
2 {3 `& B \9 c. }" M9 j3 } writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);+ b6 y0 L$ f; {% }. @3 t' u7 X1 z
# V# `4 B9 ?) |" b9 x: Z ( Y0 L; K3 C t9 Z- U& H, n f
//SPCR Register- p% T" `8 ~1 i- r1 w3 d% B- R- s9 N! H
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
: ]" T9 C& q5 q temp = 0x03000000;//(DLB=0), w9 `: b& e! Q" [( `
// temp = 0x03008000;//(DLB=1)
/ R! g3 g) B6 `- P% T2 ?$ }+ O writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset7 C. Z+ S" ?- i" g8 D( I2 ?; E8 G
temp = readl(IO_ADDRESS(SPCR_ADDR));
" x; q/ u' |# R1 K$ `" L. ? printk("temp=%x\n",temp);
8 P; W: H# s2 e& x
% b/ K9 l- r8 X! B //PCR Register
7 Y K3 G Q$ f! ] //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-01 ^8 y: E) f) M* y$ w, S5 H
// temp = 0x00000F0F;
0 `/ V2 P. j8 |$ a. } temp = 0x00000B0F;" T3 W/ h& \( s7 B8 {9 C
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
. [3 n, d/ l' @ temp = readl(IO_ADDRESS(PCR_ADDR));+ G3 i9 J& G. M
printk("temp=%x\n",temp); 6 U4 D d) y% ] {
//SRGR Register
7 p4 o/ K/ Y7 s //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
! t' N, J& j! A0 b# Z1 y6 N //temp = 0x301F000B;
4 L/ Z( t4 |( v+ c- H. q( i/ T writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
' ^& i: r6 m. |, ^$ s7 @ temp = readl(IO_ADDRESS(SRGR_ADDR));
9 B$ k+ B3 v% r printk("temp=%x\n",temp);# `0 ^2 I6 C, D
//RCR. p1 ^* t1 i5 `: F* G p% N. K
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,- [. i2 \0 q2 G, J" m& N/ _
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 u4 V: A# o( I. o, i# r% `. G! ]
temp = 0x00440040;
2 e3 i' e! k- G% q0 s5 t8 Y8 {7 M writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
0 Y5 B2 @3 _' ~% S# J temp = readl(IO_ADDRESS(RCR_ADDR));
) p0 H' _7 E& H printk("temp=%x\n",temp); E" i+ \, k* k+ j
//XCR
- q- R, R- H; @( B; B; y //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& v7 G, a% d! P( P1 E( h1 A6 e //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
; Q1 e% x, Y+ J% U! u8 G temp = 0x00440040;
$ r- x6 y4 ^0 R/ q writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
! w2 c" N- v3 F6 s( K7 c: k temp = readl(IO_ADDRESS(XCR_ADDR));
/ y# _5 }; E# [8 T9 f; |& S2 M$ | printk("temp=%x\n",temp);
& \" a9 s" Z- c0 { udelay(100);' x6 W, Y/ L- X
//SPCR Register
' g7 S% ~3 c, R7 K8 T! L( z //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1( _- B0 X0 w: M
temp = 0x03C10001; //DLB = 0 VS DLB = 1- n1 K. I8 E( ^
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
, v' P/ L4 r7 [* T4 v temp = readl(IO_ADDRESS(SPCR_ADDR));
* A' {& ~$ p( A) ^) R: F2 \; r printk("temp=%x\n",temp);
! q0 f- P) F, G i udelay(100);3 J9 G2 | L0 g- u2 m% T
$ g" R: ?6 ^5 w8 q) e4 I* y( b. y
//set GPIO direction( i$ Q+ Z" e% D; R" H
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- f& p5 _7 `( `, B& w; J8 w: e: U
temp = temp | 0x00000100;//EPR----input
- b5 k8 l% S2 x' A" i, E temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output% x1 T) I1 o/ W+ Y3 i) h" B
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ( Q9 G. W6 Q2 ]" R) G! p+ h& G
; ?6 K8 v- L8 A r/ r
return 0;
* m7 Z E4 J$ A+ t* O}
4 G0 S0 u9 ]; l# a3 J' p& {static void __exit MCBSP_exit(void): ` v5 _( G! x
{
- ^, E7 c% Q% s0 l k ]! t printk("mcbsp chrdev exit!\n");
" Z; w0 j3 W! X! l7 K- t7 w0 h" u cdev_del(mcbsp_cdev);' T5 D* F$ z9 Z/ k
unregister_chrdev_region(mcbsp_dev,count);
) {0 E* _* a I/ T T/ t/ N device_destroy(mcbsp_class,mcbsp_dev);5 w4 m# W" I7 B C2 _/ @4 A
class_destroy(mcbsp_class);- M. x u" w/ E3 k T/ k- v
}5 g. T1 M J$ t9 k
module_init(MCBSP_init);- Q' i S5 X1 A k
module_exit(MCBSP_exit);5 ^; v. F8 {% l; M& i4 e0 d5 L6 j; o
/ C* z* Q1 e, t
MODULE_LICENSE("GPL");0 k) y4 ~* x; i, X: ?
$ ]; O# [; x I: d) P
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" Q' R/ p- w8 N我的应用层的测试程序如下
* p+ o. S+ x& V#include <stdio.h>
: q7 y' |2 @# }& A#include <string.h>
# h; ? H2 A8 M7 B* O2 D#include <fcntl.h>
1 q0 ~9 B0 Y5 C4 K: N/ o y#include <unistd.h>
& g6 k* Y/ Y$ _8 C#include <signal.h>
/ y9 U7 A+ C" O( I% E S: {$ D6 ^/ Q% [#include <pthread.h> //线程+ L* H$ b& ?7 l% q% _6 D( \/ S8 ?! v
#include <stdlib.h>1 h8 r! \% F; d
#include <pcap.h> //捕获网口数据% {) J& x6 U; ]+ r: _2 H1 A
#include <semaphore.h> //信号% S8 R1 H. |- w5 p* i
#include <sys/types.h> //消息对列3 V$ Y) p! x: G z
#include <sys/ipc.h> //消息队列
* }5 X3 ^- a4 J% ]8 b7 w% v9 z#include <sys/msg.h> //消息队列
( c! E: S: ]9 V- J#include <sys/select.h>
7 C0 ~. r7 ^0 }" ?# _2 F+ O' ~#include <sys/syscall.h>; d6 U" J" N- @. l" p* |
#include <sys/stat.h>
. L$ K. [( d [- k; Y# r7 C#include <sys/mman.h>
( u. A$ J( ~- R" E6 Y' E2 l1 T0 X#define msleep(x) usleep(1000*x)
" { |: `+ l, Q/ C- g2 X9 g2 `! O5 S% I X, L
int main()2 A& A& w7 B$ L5 H6 K
{
' P4 c9 X2 N3 y* N0 D //MCBSP,ARM与AMBE2000交互设备- ~5 w3 Q; d' [
int fd;
" ?& Y5 Y) |% m7 ?" T5 a L1 G unsigned short data_write = 0x5555;
l! ?( f# H- y; D8 L* Z: X4 T" m1 Q0 ~ unsigned short data_read = 0x00;
: J7 x2 U6 Y' {" N fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 A) F: H% D3 ]6 o5 G8 f/ ? // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);# z4 k( A, M4 k4 n. Z" {
+ ^# j/ V3 I4 B; | if(fd < 0)
) M4 k/ }6 I' ^9 o* K3 a# ~6 s {
, N+ Q5 Z7 B! q+ b0 _ perror("open failed\n"); n+ h3 ]) I; P7 u" G6 N
return -1;2 t, q4 N5 s5 f- L3 S- A4 U3 W
}+ a1 j2 E7 _7 c( A4 l2 k& R
; x* F% w" w9 b! t9 C4 \ while(1): O% l+ x$ f/ [" w/ Z' b
{9 ^" J `/ O8 ?. ]: b- J3 r
8 N: l. x7 ~ R( _* Y) }6 X //AMBE2000每次读写是24个字为一帧
" r( c5 s; N( T, Q //写数据时将数据在底层存储起来,等到中断的时候再发送5 ~( |8 m1 ~+ r1 G
//AMBE2000输入数据是以0x13EC开头的
2 T6 H5 {( N% \ write(fd,&data_write,sizeof(unsigned short));4 o, t! O. x+ ?9 U8 d# s7 T1 ]
( b! b) e B1 H2 U5 U: N //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
' ]( m+ Q6 u6 k: D9 \ read(fd,&data_read,sizeof(unsigned short));9 a, ]# `) r# u9 u7 r8 k
" _$ H1 i% p5 a7 B# Z! l c
if(data_read == 0x13Ec)( R' ]! V# K% ?" E# r/ ~
{2 H+ U: R8 A' l Y# |% J
0 G$ P+ W! w8 E% U- l
printf("data_read = %x\n",data_read);' t. r: I4 k; g2 I% r5 N2 }' N
}
7 K3 z" Z! g$ a1 K 0 |% G2 y# a% _- l: }
msleep(10);
8 Q3 K4 O2 L) C' Q7 m
@, c- ]- Y' u4 G! ?$ H6 x) R /*: p( G& V* J$ j* h: W* F
ioctl(fd,1);
& G, Y7 ?1 a, \6 Q5 |/ l ] sleep(1);5 M8 K% A4 _4 Y# ~1 @8 D' {- s
ioctl(fd,0);
) r9 v4 B9 u4 R' N$ k$ a* a9 ?3 U! ? sleep(1);
- J! @$ H$ \" X1 V* w4 @ */
( V( m k/ [9 H2 \# q' E$ @ }
, t- I) N- K: W8 c) }# l return 0;" m% j) F$ b" e3 ]# N6 L
' k( x) r) C3 t6 q) L, t( `}6 V( W: Z% `0 t$ s+ k, k/ d5 Y
' D9 N0 I3 N* ~$ j& \+ g, u
多谢各位指教,谢谢! 急
5 I* ]) M, S1 J* m
) Y; S2 o" w' C' F# O4 a; u2 m& g
6 H4 f& Y$ T V( {2 n2 h: d+ l6 T( l1 Z6 V
3 Q6 |# g( I! T8 e& H6 |
* X. r& ?; w6 @( i# m/ [
|
|