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