|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
: o, a) N. m. x3 ?, Y* s: @/*
2 `- @. f* s7 z$ T6 h: L * Copyright (C) 2009 Texas Instruments Inc- N. _/ J0 Q V
*
6 x ~3 _+ Q9 p K# O9 o L; Q! X * This program is free software; you can redistribute it and/or modify. U r0 G; [9 P( M4 i# `
* it under the terms of the GNU General Public License as published by+ Z& I9 q. z! u8 V7 L$ S% T
* the Free Software Foundation; either version 2 of the License, or5 p& w$ }% S4 S1 X+ c
* (at your option)any later version.0 R' Q7 L5 w# t( |+ l1 X
*
5 g& s, V7 U9 H2 l% T7 j * This program is distributed in the hope that it will be useful,) F a0 Z4 `: }7 {
* but WITHOUT ANY WARRANTY; without even the implied warranty of& H6 P9 |' U! e' s
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# U3 h' e, Z, e4 C9 \7 t ] * GNU General Public License for more details.- N$ q' E4 e5 e! M6 |3 n b
*: M# w, L) k% A( d
* You should have received a copy of the GNU General Public License
9 S# G: B. k, ^& h# S; Z * along with this program; if not, write to the Free Software) l3 \! d i0 D- r
* Foundati: T1 y. a* D8 q! N
*/
+ F, _$ J6 _" @2 G: N, ]#include <linux/module.h>
R2 Z3 M7 J( Q2 J* U. x1 L3 T+ T#include <linux/init.h>
s1 m' }2 H, y9 z#include <linux/errno.h>
3 o5 f, x7 J7 ^8 x#include <linux/types.h>/ ?9 ~( y0 K7 R- \6 g5 X& \9 i
#include <linux/interrupt.h>
5 }: k) B0 |) l* |1 i3 m8 H/ x& ?#include <linux/io.h> x* k# e* J" g; T5 j
#include <linux/sysctl.h>
& v9 U$ w6 B _0 r! `3 U9 O# W* Q& }& y1 M#include <linux/mm.h>
. \( @* i9 P* M2 b8 C( }#include <linux/delay.h>5 N) p- n c* Q, u
#include<linux/kernel.h>( s8 E n2 q2 s8 V v
#include<linux/fs.h>5 w! l5 X/ H0 Q( W5 _) G
#include<linux/ioctl.h>! m+ Z4 F1 _' k5 _0 t
#include<linux/cdev.h>
% V- F: s B0 d/ g: h#include<linux/kdev_t.h>8 i" q2 W( ]* m7 c5 W9 r s
#include<linux/gpio.h>
& Y- A8 v/ s8 @: K0 R% W#include <mach/hardware.h>+ A3 o0 l% y5 I" K% a& ]' U
#include <mach/irqs.h>9 l- z( C c/ w2 |% W+ r$ L
$ B, V; c5 E9 `; m2 w#include <asm/mach-types.h>
* x$ r$ Y; i( H( i, Z0 ?: \! q! `#include <asm/mach/arch.h>
$ ^8 g6 y( T: ^" h#include <mach/da8xx.h>
. P8 g: J+ p2 n* y- z#define SYSCFG_BASE 0x01c14000
` P, {$ _9 G* b) `* c, ]+ k% X#define PINMUX1_OFFSET 0x124 ! C( z, L9 t9 w& A
#define PINMUX18_OFFSET 0x168 / f/ q$ V: s$ u3 x4 |" m0 z
#define PINMUX19_OFFSET 0x16c
1 I2 ~( S1 q- R! H# E# S#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR4 x* ?1 j5 R, L7 c) M v' c. W& {
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR! v' y4 V/ R% B& {; m$ A8 r
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR' C1 @# A6 M) W
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
% K4 U) M$ ^- V: u+ b9 N#define PCR_ADDR 0x01D11024 //MCBSP1_PCR( F4 d6 R9 A) B0 {9 A- G1 ?
9 y }" [7 B Q/ {# F$ H. Y; R' t#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
" _4 }; ^8 R3 w% c" {4 B4 D' D#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
- M) f* m# `8 p//PSC
8 l1 |( z- l1 |* G7 E#define PTCMD_ADDR 0x01E27120
2 K7 n, S8 c; ?9 g#define MDCTL15_ADDR 0x01E27A3C! p3 n7 z5 U" s3 Y# L
#define PDCTL1_ADDR 0x01E27304
4 n' d! H3 P2 i* H//GPIO8 direction
, g/ ?# V1 Q- i0 v5 f% P6 o* R* h! u#define GPIO8_DIRECT 0x01E260B0
! G7 u9 f+ v, @& X4 z#define GPIO8_OUT 0x01E260B4
% A% f' m: Z: ]6 a' h+ ^#define GPIO8_IN 0x01E260C0
, b& Z6 Z! J. u# o! r @( e6 X9 i. ^# G D$ D2 W& X9 |& G; ^# [
//#define MCBSP1_RINT 99
' [0 M9 c. G, L* Q) |6 N//#define MCBSP1_XINT 100 , h: Z) Q! j- `! m! ?
static int MCBSP_MAJOR=239;
# O; }* w6 o: p$ nstatic int MCBSP_MINOR=0;) _1 b( C: t! W a8 n- S, G5 ^3 I
static int count =1;
% y& P3 j2 @! K% k8 N. C {
; @% f" Z" ]+ A( a' y& Z4 ~5 `#define MCBSP_NAME "MCBSP-device"
& f! t( W) @, |9 W
9 A$ U# n" B0 ^7 ?static struct cdev *mcbsp_cdev;# S9 ]& o, k# D3 e
static struct class *mcbsp_class;6 j6 r! x5 u* b- L( R- ?
static dev_t mcbsp_dev;
3 _6 _( [% W* }2 [8 [unsigned int DRR_data;* O7 v, T& {( I; P$ e1 f% t6 i; K
unsigned int DXR_data;# V8 o' q' w& A2 Y$ z' y F0 Z
static int mcbsp_open(struct inode *inode,struct file *file)
7 c! Y0 U( U9 u{
9 v8 Y( |1 s; v( l% a6 `! Q
5 o( ~ f h k* }- \" k- Z! ^ //interrupt enable,initialized# w: K/ b9 S! {; h5 {8 |
unsigned int temp;
; P0 G4 k% W( o+ m6 M //SLEEP_EN(GPIO8[10])---0# t. v) n- v& ^$ e2 C6 f; J4 E8 p
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 |2 [( S" W* O' P& p temp=temp&(~0x00000400);: I( |4 u& v1 c6 o7 i
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]% g- c4 E# [$ B3 b% y
//RESETn(GPIO8[8])----0----1
! {3 U1 G; d4 w; o% ` temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 V6 k. U2 z {$ V: ]4 O& N temp=temp&(~0x00000100);& y& X5 s# k- p
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 d' }9 Y0 F- E! b udelay(100);! k8 L6 g1 r, K+ b3 g8 f
temp=temp| 0x00000100;
8 z1 z9 q7 [( b __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1) z8 P! X4 s( h( h* p0 T
udelay(100);
0 s( g/ k6 N3 D printk("open success!\n");
* h' ~* G" }* f5 j8 H8 r return 0;
+ u5 E1 ~5 W. f6 N4 f# {# f}9 I# V( m& c$ H [; a: r, z |
& j: H% x4 b Xstatic int mcbsp_release(struct inode *inode,struct file *file)
6 ~3 t4 V$ o# b7 `! w6 V, w{
. j7 E/ i0 @, R3 J9 r! C printk("release success!\n");5 [7 f' O0 I, K8 H
return 0;
7 X; N! x" V9 ]7 u' G; w0 G1 K}
8 ^8 y, u# w) r
: r6 t. Y1 H4 b3 ?static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)+ o7 d5 L2 `( [0 m, q
{
( \, R0 I3 _. y: t) S copy_from_user(&DXR_data,buf,len);
: q: f- V/ b" Y6 y2 u) K0 M iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
8 _: u8 L7 x/ `1 x7 T1 h: n: c1 } return 0;
( z9 @$ z% Z8 p- g; T( C
" C$ U5 _5 L/ f- ^0 e8 Q}
. ?7 E, }" a$ u j* C- M- Y& @
9 ?6 {8 V0 x% ]4 t# l- v# F! t. Kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)$ {4 l6 l& o0 X7 F6 c2 K4 M% ^% @! q/ S
{ 6 |1 c- Q. w- B8 B( K6 B8 b* y
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
3 ~$ U3 K! X# i, c8 y copy_to_user(buf,&DRR_data,len); / C5 r% F+ H" z! P5 e" u
return 0;% D$ `3 t! z/ J7 @# {7 o' I. r
}
) L |' N% I' `2 q9 ~
# {" s) |" k2 b+ M6 y1 `" P
% b- y6 d) |3 @) rstatic struct file_operations mcbsp_fops=- G8 O# d! D: K6 P! b" B
{) `& M- V$ w0 ]
.owner=THIS_MODULE,9 A' J7 U. F2 Y, T% t3 w5 V$ k
.open=mcbsp_open,
( @" A1 x1 U3 m( K+ F% ^6 f: n6 S3 D .release=mcbsp_release," W P9 H* D1 o" c( S
.write=mcbsp_write,
7 [: |' J- g8 ^& K! ] .read=mcbsp_read,3 X3 P3 ?/ w6 b- Z# Z& Y
};
4 O( n2 K( x0 L3 T' k; v9 Istatic int __init MCBSP_init(void)7 p6 k' W% o- c, j2 D9 h8 _* N
{- S6 I( w2 N( o; |7 C! L
int ret;7 G% R2 f v/ o1 B9 R& Y, l* v. E
unsigned int PINMUX1_REG_old;* p$ N! \/ {( X7 i$ k
unsigned int PINMUX18_REG_old;0 u, ?( d, ]3 n
unsigned int PINMUX19_REG_old;: q! Z/ E& B6 C( o( m
unsigned int temp; 2 R& o! r* d5 {4 O
if(MCBSP_MAJOR)
2 Y! _( J$ U8 z {1 ^, @8 P. ], O: J: ~- `
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
# M9 r# B% z% H$ C# I. g ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);( x; R) `/ P1 \( U* _2 P& C
}7 I3 u; v5 Q& s, M
else
- ?# p7 v( ]7 d* W5 U {5 {: w7 `; q$ H
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);! A, q% o9 A; W6 ^# s- ?( H% v3 D
MCBSP_MAJOR=MAJOR(mcbsp_dev);
$ q8 W( [8 V$ F/ D: z }
' ?' g3 b' E4 Y$ T. R0 U
( [% C7 p! t# S- K/ a% P if(ret<0)
: l6 \8 g7 H$ A$ B1 @ {7 C3 N7 F( i/ @
printk(KERN_ERR "register chrdev fail!");4 F# b1 x: d9 }* f. J
return -1;
I' @. i& P# x/ [; F+ l3 _" ^) T2 D: m }
2 ^( I! L/ w! Y; T* p 4 }, j4 J; ?! |8 n5 N5 i
mcbsp_cdev=cdev_alloc();$ r/ g3 a8 R+ M" C4 A' e
1 J- T/ ~6 V, q
if(mcbsp_cdev!=NULL)- [" c. @8 u/ o' W* r2 ?
{
5 t M% Q- H+ i cdev_init(mcbsp_cdev,&mcbsp_fops);
# M! ?" |1 M) \" V5 N2 J# h G mcbsp_cdev->ops=&mcbsp_fops;. q/ O+ Z4 v! D
mcbsp_cdev->owner=THIS_MODULE;, \, ]# G, a8 i C6 ?: {& V
& A1 D# k. D- Z& @0 R
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
" c' @2 A7 R0 `! k0 t) T printk(KERN_ERR "register cdev fail!");
' Q$ J; Q( r# r y& Y1 g9 s else
6 z, H% L2 ?2 L' d8 p printk(KERN_ERR "register success!\n");
4 S0 ?3 L+ H; J }
o! A/ i; |6 ~ else7 t- a# L# x% F1 e) Y8 \
{
0 P) K1 W4 F0 _2 Q- [( ^1 t, X2 z printk(KERN_ERR "register cdev err!");8 l& F9 I% N5 b3 d
return -1;
5 R6 ]/ |: D3 p. h }0 Q, G: L) |! G7 Q
; H& J: Y9 O. h
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);+ e1 S. B/ C- }0 Z
if(IS_ERR(mcbsp_class))6 |4 O G9 ^8 m( P8 P' L. M
{1 r4 h* {- X) r3 h+ Q6 d: \- ]
printk(KERN_ERR "register class err!");
9 M1 \0 ~5 C% H4 w2 @; u0 m return -1;
& I/ N0 S/ |8 E$ j# a9 j6 ]! ?6 ^ }! B4 r7 [' \$ O
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
% J' v2 q: M- \4 T0 T
+ I6 \. \- L5 R8 ^* A% d3 I7 i //PSC, k9 w: d" E4 Z$ Y& Q |
//add Enable MCBSP
2 ~$ @7 G# i: b2 [' X //test: k4 Z5 f$ c2 S- w# @$ o! @% d
temp = 0x80000003;) q6 L8 E( T3 n& @9 O6 Z- j4 [* b
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
! q( C" G' i5 G temp = 0x00000003;" s9 v, Q2 W3 ~, @1 _6 `- c
writel(temp, IO_ADDRESS(PTCMD_ADDR));' ]- {( `- S6 F3 c
`8 ~" e7 t @
temp = 0x001FF201;
' ~- ~5 G/ n! H! ^* O" u writel(temp, IO_ADDRESS(PDCTL1_ADDR));) A! e6 t1 B9 E2 D A
# h1 q7 j- e# `4 A f
//PINMUX
) Z% Y r5 K3 J //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* w- { e: m9 u) s" ~
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% o) i* Y0 ^7 P$ ? F- D9 O, u- p PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
1 L% R" Z4 O( n$ d; J6 i' W( t0 a writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);: j& k3 R& t9 m" O& p' [
' A% n1 I' w# R$ F
//SLEEP_EN,EPR,L138_SHK1,L138_RC% i% v3 g2 N* l' J
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! B" A& v! ~$ n$ P PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 0 b, T# `5 U; n; E) W6 ?
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ F( A$ n8 B5 @! k- r( v
6 \& P( ~& y# g- {' j9 n4 F //RESETn,L138_SHK2
8 q" [6 u% |* ?2 ^ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- b0 G0 s3 Y4 h' `) j PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; + \- Q/ p! m- Y) x% {9 A
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# T! f) [, F; L4 m3 n
( ?) Q! ~# ], x; O$ V4 v, w
7 h0 y$ t( r; f! x0 c. m //SPCR Register5 K) E0 a8 W0 `9 i" X1 y
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset; Y/ a* M0 w/ I2 v! ~1 q) y
temp = 0x03000000;//(DLB=0)
- z8 `0 q$ ^" _( f. a8 [ // temp = 0x03008000;//(DLB=1)1 E4 ?) n0 t) b7 ]/ A) u
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset5 `8 I. q. j' g0 m. g
temp = readl(IO_ADDRESS(SPCR_ADDR));
* [: u! V- E6 u" k* n" T printk("temp=%x\n",temp);7 p- ?: i+ V6 H* l
- F# ~ H; } i9 k //PCR Register" R: u0 R' v9 o4 [5 s; [
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0' [; R+ ]9 n/ X8 x
// temp = 0x00000F0F;
; ~% O9 v4 J: C9 n9 j! h temp = 0x00000B0F;
6 a% ]. i+ W% G" `. C writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 2 f" }8 ^ g+ h y
temp = readl(IO_ADDRESS(PCR_ADDR));
& z e. i8 w- a, t; G printk("temp=%x\n",temp);
1 ?1 B# i0 o; f, Y" e% C5 r, ? //SRGR Register
+ s$ a6 w! R1 f" R7 B$ S //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11* g$ A4 x/ m: l9 M, y+ }7 m/ a Y
//temp = 0x301F000B;
, T( ^0 i6 e2 z+ @ ^' S+ z( ] writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 4 Z& @# x& J4 c+ `5 O
temp = readl(IO_ADDRESS(SRGR_ADDR)); p3 h1 Y: r; k' b
printk("temp=%x\n",temp);1 M& I! L, \& h: q9 M5 w
//RCR, z& i" e" ?. N8 k1 l1 Q5 m
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ c/ r n8 ~. T; u
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, R( {2 ?1 W' W
temp = 0x00440040;/ G* n& f% q6 c% c. J0 c
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
4 B6 ~. c k8 |0 _! {" z; b* K, ] temp = readl(IO_ADDRESS(RCR_ADDR));
0 `, F. @0 Q+ [ C printk("temp=%x\n",temp);
C& ^/ f. m9 h7 i/ f8 ]$ } //XCR( p: M5 U. Z, u* p6 t7 P
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) F6 f) O- q) P6 d
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
7 P/ V6 u, z! J7 s9 a& c9 ? temp = 0x00440040;
; I0 e. B$ F7 [ D' t writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
) J) p/ F! C3 z6 z temp = readl(IO_ADDRESS(XCR_ADDR));2 E6 S1 F; [) n3 g# q. x
printk("temp=%x\n",temp);) R9 U7 w: B- ~+ B. ]% N. R
udelay(100);6 B. [0 c" q7 n& Y
//SPCR Register- D4 \8 z' |8 x7 a4 r; w/ z
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, P P* C1 q* q4 Z9 B+ b3 F/ b
temp = 0x03C10001; //DLB = 0 VS DLB = 1
S$ F2 J4 Y4 h o- K6 Y writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled+ B/ Z. i" N/ K& ]% n7 [
temp = readl(IO_ADDRESS(SPCR_ADDR));: J2 O: l. I* U/ `) K
printk("temp=%x\n",temp);
/ i8 i( s( c% }, c7 ]$ P udelay(100);
" o9 a3 k; I9 O; P! {9 a* N9 Z
! W' q& f7 S- b+ U //set GPIO direction
* P, P$ f; M" d: c: y# q temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
* M9 t6 w: `" K' R. V& a temp = temp | 0x00000100;//EPR----input! o( @8 o }8 T
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 F* F6 P/ _: V( W- M2 z+ c5 t __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ' P3 G7 L2 T" O. X# F
0 M8 j5 @. p/ ^5 _& q
return 0;
: }% w# U' y+ t" T, X3 y7 M}
' U/ g5 H+ o' Q9 o! b% D' V/ Lstatic void __exit MCBSP_exit(void)
# q6 V% q4 o! S: c3 ^8 q{
3 _* b6 `7 O# V3 i" x printk("mcbsp chrdev exit!\n");" K1 l' N5 b# p. Q
cdev_del(mcbsp_cdev);" g# |9 M, t4 W7 |, Q2 X; P" M; j
unregister_chrdev_region(mcbsp_dev,count);/ {( X- I2 n7 l4 R6 x, W# \
device_destroy(mcbsp_class,mcbsp_dev);6 ?' R7 S: \% K: G; m! F; v# Q# y
class_destroy(mcbsp_class);
8 [) {* d. H2 O) l1 F}
5 k" w7 @' B; r3 x4 p& [module_init(MCBSP_init);
6 J8 A1 I- b6 _7 R4 z8 r+ A$ ]6 l* umodule_exit(MCBSP_exit);# `# s8 L3 w- n. |+ z/ w
% G; |+ S+ y5 r8 uMODULE_LICENSE("GPL");
, F. ]2 E, ^! |' V# f* |/ m" [1 _; t1 w* w$ K, J7 K! Y( u2 f: X% @
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 g ~6 W8 i0 G) K# x/ Y8 {
我的应用层的测试程序如下+ B, V4 m3 L$ }3 }, n
#include <stdio.h>2 J1 e! ^5 F& Y* t. N0 i
#include <string.h>" A: l0 ~+ l! L; x$ w2 g; ^% l
#include <fcntl.h>6 r& @$ U2 _/ g; I
#include <unistd.h>' _& v1 K! X# e- S# l- S
#include <signal.h>- J. A! n& u% w& N( Q
#include <pthread.h> //线程
% ]0 @; ?6 l2 j( S% K#include <stdlib.h>3 m# d1 i+ P+ K/ H0 L. x- q
#include <pcap.h> //捕获网口数据
& M2 R$ i x3 X( c/ E5 _#include <semaphore.h> //信号
, o8 ^# T9 E3 l/ v0 o; u) C3 \! V#include <sys/types.h> //消息对列
s. N8 L; @+ o" M' r7 c" a% R$ V#include <sys/ipc.h> //消息队列
4 j* h0 ^2 D: y4 _4 I- s$ G1 N#include <sys/msg.h> //消息队列* w! V* c% Z( @. x7 M+ p% z
#include <sys/select.h>
( G% |# ?" \( f#include <sys/syscall.h>
" a. a. s1 V5 @#include <sys/stat.h>- D1 K+ \, z9 w: D$ F5 o% m
#include <sys/mman.h>
& u! Y$ h5 K/ g: Q5 L#define msleep(x) usleep(1000*x)! E" ~: @$ r% C& K1 G7 f6 \
' a5 A, Z9 d( ?6 B$ j( s, h$ Xint main()) T% J% D, F. l) Y) V1 ]
{
9 ?) l- R' d' g+ @, g //MCBSP,ARM与AMBE2000交互设备1 j* I) J5 L8 ]
int fd;
# f8 l5 d0 N' f) |8 _7 Y' o unsigned short data_write = 0x5555;+ ]5 E' b9 |1 |8 Y/ W- n
unsigned short data_read = 0x00;7 g+ o4 D3 @* j0 r w, I
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);% V7 t. ^1 f* \0 N' Z$ j& J. B0 O' f
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 W% O9 N% {) G/ t; m! k/ n ; p: L) t5 j2 @& n
if(fd < 0)/ ^4 z/ W% X ?- {+ H7 A$ H( E
{
: u ?3 l# Z5 G# t( ?) S/ y perror("open failed\n");7 Q O( ^3 h3 F/ Y- R( ?
return -1;
# \3 L; a- M6 z$ H1 O( u# x }) l# x* u7 S2 d2 |1 _5 w7 O) U
4 L2 s: b& B1 j0 j! {
while(1)0 i$ [: m L/ T
{
* s! X9 s$ h3 |/ V: {3 _ " U/ A. p! W3 r0 Q+ x1 h! D
//AMBE2000每次读写是24个字为一帧
" Z% _ N/ r+ W7 g4 x* d //写数据时将数据在底层存储起来,等到中断的时候再发送
7 \/ D/ v+ n+ M: z //AMBE2000输入数据是以0x13EC开头的
4 h/ ~) K; {2 I; J write(fd,&data_write,sizeof(unsigned short));
/ h8 n3 b% z" L/ W( L) l 5 W; O0 H6 w& S* }, g* M3 U6 v4 l
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 7 t0 `5 L# V( G3 g
read(fd,&data_read,sizeof(unsigned short));' n+ u% L0 I4 |2 G- L
5 X" ~7 R% l. ?* N+ k! |# y- q
if(data_read == 0x13Ec), [' H1 p/ O; x4 \. H
{
# v8 l* }; t# @$ H ; k6 |: Z( A7 B {4 x
printf("data_read = %x\n",data_read);
& }9 N9 _" O3 X, m7 L& l }9 O `2 c9 W. Z2 x1 U
1 r& @0 h: g) P8 G$ n5 k7 y0 J$ z
msleep(10);7 i4 V; t8 k: J
& U Y& p4 W/ k4 z+ g1 X" H
/*
9 ^5 Z5 W1 Q+ K ioctl(fd,1); 6 q$ H- P( T" y% [1 E
sleep(1);
$ C8 J" B+ m# P( O7 I5 W ioctl(fd,0);
, m$ k: j+ Z8 t4 ~1 j sleep(1);6 Z* O$ N% m5 m
*/ 8 V) z- l1 p3 i1 J
} * U+ \( G7 G, Y2 h r: h* C. o* M. J
return 0;
4 A3 R' j) i3 w( o& y7 w1 z+ e. ^
! O5 d7 g9 ]/ v! X; @' L ~}
X: F1 {% v) O$ J% Z( H |/ D/ ]( K5 H6 P
多谢各位指教,谢谢! 急
+ x' z! w2 N$ Q2 f* ?3 b
8 ~. `# \$ G8 m H7 H
L3 |6 G' F! z# M5 v! M7 y1 N4 N- c P6 A5 ^
- ^9 L" R; M1 `2 q, {' m3 E# K$ R9 l$ Y/ @9 K0 f- y3 e. |
|
|