|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
& @) s0 n. b9 e0 q/*
0 y2 o, ?5 J! x * Copyright (C) 2009 Texas Instruments Inc
% q* z2 p8 M! z *
% v$ \3 g! G/ e9 J, t * This program is free software; you can redistribute it and/or modify
! V% ~! {( q( f2 q e( I; a4 h9 C4 L * it under the terms of the GNU General Public License as published by& {9 } f4 R% |( I1 d
* the Free Software Foundation; either version 2 of the License, or! k1 ~: v2 }8 B/ W% Z' A& i
* (at your option)any later version.* u' j: Y! y. I, S/ m ^
*
, B5 w' { D! C; z& }/ y) W6 f+ { p * This program is distributed in the hope that it will be useful,
d5 R( {* M6 k2 o+ o# q * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ d& [& G% ]/ o# s# _+ j * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
7 `. r0 b) |9 h+ u+ x8 P * GNU General Public License for more details.3 a$ W' M, ]# n. |
*% \1 }% g% m P' G* }
* You should have received a copy of the GNU General Public License# w1 `5 ?+ _# D; c* o* V. n
* along with this program; if not, write to the Free Software
+ s* r* Q" H4 O/ m1 p * Foundati1 O5 N1 |; T* X, Y9 ~
*/
7 f/ Z n( L; h2 x7 o! L! H+ n: w#include <linux/module.h>1 O B5 A7 t2 x% u7 Z8 z' a
#include <linux/init.h>
& |) ~" b/ b/ A2 W. Y8 C#include <linux/errno.h>
: b% Z$ p) F- | D \( H#include <linux/types.h>: x: B$ x2 B6 q* t* H' i
#include <linux/interrupt.h>
# d+ n$ O2 K# ~! W#include <linux/io.h>8 ]1 P* F4 w3 G) M0 C( m
#include <linux/sysctl.h>' p5 m4 b: ?+ p% ~
#include <linux/mm.h>5 a, f( c; E% ?
#include <linux/delay.h>1 U+ G/ U% A& C1 W& A
#include<linux/kernel.h>" o8 B- P7 s1 Y
#include<linux/fs.h>7 h5 B8 l8 G1 o, C T! E
#include<linux/ioctl.h>
2 d, V5 e/ S8 n2 Z& d* W: w#include<linux/cdev.h>
+ H) }* u! z; N" ~$ s% p7 ?#include<linux/kdev_t.h>, q; f7 K: V6 B: ]4 K4 J
#include<linux/gpio.h>
$ q+ i' a# Z" x5 C#include <mach/hardware.h>
/ B1 E m+ N5 ?- M- V# Q1 s) M' a#include <mach/irqs.h>7 y8 G9 R/ p# }
/ k3 e/ a9 ]' W t; y' u9 [
#include <asm/mach-types.h>/ [2 C% n% G# R* s/ P$ G" U
#include <asm/mach/arch.h>
) {/ [& t) ]" p! w#include <mach/da8xx.h>; w& O" j! K1 ^3 Y, l
#define SYSCFG_BASE 0x01c14000% v Z7 h S3 O& J2 {
#define PINMUX1_OFFSET 0x124
# y6 _7 `5 a, k8 C* z# ]#define PINMUX18_OFFSET 0x168 6 W5 O. ^1 u0 M
#define PINMUX19_OFFSET 0x16c2 V* D: N9 \: N: }& r
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR5 j+ D" k# \8 ]9 ~; h" U
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR2 b6 i4 p( c6 B1 H& [" a
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
6 f" C. T+ H# p5 O#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
1 F. y1 x- ^# p9 X, j6 q; q8 h#define PCR_ADDR 0x01D11024 //MCBSP1_PCR5 u, ?; |: K. [1 A0 p7 N' U0 ^
9 c: Y) c, Z8 Y8 P" P3 _; C7 J
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
: t% w, B* U: e2 F$ q, y% f" A+ |3 i#define DRR_ADDR 0x01D11000 //MCBSP1_DRR# _1 B2 K( ]1 e' E/ K
//PSC& \$ ^/ f2 S+ N9 S5 M
#define PTCMD_ADDR 0x01E27120
/ C1 H+ \! z. ?) n j w% q% ^#define MDCTL15_ADDR 0x01E27A3C
$ |. ?* t; t; S) ~# Y#define PDCTL1_ADDR 0x01E27304
4 N- D9 z5 d3 m" ^* N$ G0 C//GPIO8 direction
" _2 C9 }$ [+ F p; Z; Q4 h( i#define GPIO8_DIRECT 0x01E260B0
, o, d. ]( z) b! \0 o9 _9 @+ ?#define GPIO8_OUT 0x01E260B4
8 I; D- B) X# S+ H" M7 C9 N#define GPIO8_IN 0x01E260C0
! _# y) U; D" a9 k2 ^( o& ^
9 t' m# L! s+ T1 {9 ^//#define MCBSP1_RINT 99 # C' o+ b% E' ?3 Y) O* m2 y
//#define MCBSP1_XINT 100
% W9 U7 _) z% q" vstatic int MCBSP_MAJOR=239;% K, Z( s" w' ^* D: A: d
static int MCBSP_MINOR=0;+ T t( t9 Y9 j9 n
static int count =1;
; d w, z& K8 @& ~" B: m2 f& E' o
2 p: ]% w2 H! J7 ^$ \$ T#define MCBSP_NAME "MCBSP-device"/ q1 Q) V8 z N3 l( M1 V' b- D
6 a, ]/ ~+ B, G
static struct cdev *mcbsp_cdev;
8 a2 X. x# f$ F5 R, ^' l0 l; qstatic struct class *mcbsp_class;) S" G- S Z9 ^. t
static dev_t mcbsp_dev;
8 u6 R9 V2 Q) @* y! Q! v1 Cunsigned int DRR_data;1 ~! F: [) c% z6 I, F
unsigned int DXR_data;
( X( b9 {) m4 m- Q2 Wstatic int mcbsp_open(struct inode *inode,struct file *file)$ O# C8 v( c5 p$ G7 k1 J+ o
{5 X! M1 @& y* m& P- t
& k c8 Y; W- g1 z4 b. ~7 E+ g" v
//interrupt enable,initialized5 Z' q2 I* G7 Y* L, U( g( }
unsigned int temp;
& ^' d0 b, y+ _6 |& \0 b% W. m //SLEEP_EN(GPIO8[10])---08 j! I ^3 I: u
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 a: q+ m1 R: N& y* D# T3 |" ?+ w temp=temp&(~0x00000400);
: O; O# P( j9 `- _ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
1 S/ n5 |* X/ U; T9 \ //RESETn(GPIO8[8])----0----1
' F2 k4 @% w v2 ^* D9 R7 B) x temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));& F A. Q3 z8 P8 Z& e$ R9 ^. a
temp=temp&(~0x00000100);
' x( E( \5 Q( L# C9 l+ f: q: K __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0% ]8 B0 H7 v6 @0 u% S& B' e
udelay(100);
% u2 O' s: O& j6 m6 p9 N temp=temp| 0x00000100;4 e/ f! d }- D5 i
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
G5 i4 p6 |% v# j udelay(100);
, G0 T0 }1 p7 W$ r6 Y$ p. J4 W9 g printk("open success!\n");
4 {; R4 j& s% p* q N1 C* M return 0;
P7 q. |5 o4 V1 D y; ^6 ?}
H0 U! u/ Y R* x" K U
7 A6 b% e# U, W& F. i" ~" [static int mcbsp_release(struct inode *inode,struct file *file)
% p6 k- Q" L7 F{
) z$ `# ]4 l( s2 A( x4 n$ c printk("release success!\n");7 q' j4 x$ b' n6 S! _6 @; j* I
return 0;
) \* v* o" ~" s1 Q# w6 B}
( J" }% S2 y* d
+ T$ L9 Q' c% _: Z3 }0 l2 H; nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off) Z% ?% G7 J8 f' w! F
{
5 I$ a0 k8 _- T) X/ J; y2 b' N8 H copy_from_user(&DXR_data,buf,len); |, x F: P4 L4 M/ b8 e
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
0 g C7 a/ v; I* ?0 `" Q return 0;: J6 u6 U; F1 }( o4 R9 f' Z2 \8 b% D
) w- D. U' ]. w, B$ p6 |} ~7 ^# n m5 D0 I+ B) t
7 F! c/ K/ G0 a" c# v1 E- t2 C
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ H1 h4 K- n1 k% L) a{ 0 u; j; s2 y7 b- L' y: A% R
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));5 K& n8 Y3 J) n5 z
copy_to_user(buf,&DRR_data,len); 6 J7 ?1 s. @" q+ A" E9 j
return 0;6 o& A( G% G+ \$ k
}' v0 H3 r5 _3 I( i
! @2 V1 t; S2 Y" g& i4 P, O$ |+ z8 Q7 s$ d4 s# F7 `' [$ C
static struct file_operations mcbsp_fops=9 w( E6 K% m3 P' p
{0 K* |/ S8 s6 n" `5 H
.owner=THIS_MODULE,
- w9 }# e3 y; z0 ?6 `) x, h: i .open=mcbsp_open,
( d$ K' P4 U: k8 M7 D .release=mcbsp_release,) g( g# O7 [8 \: f; u$ h
.write=mcbsp_write,
8 c, @ T/ y, @- r .read=mcbsp_read,* j5 C) {* _& G. M" ?
};
3 g* G, _- z1 ?, V! u6 _static int __init MCBSP_init(void)
; C- |8 c- y- l G{) Z: e3 I8 o- l" ~2 L! U, k
int ret;
( a; }: O7 b% o9 ?! a R- t unsigned int PINMUX1_REG_old;
$ o+ a- p+ z z! e& W unsigned int PINMUX18_REG_old;
" R; \/ e1 z k# ^2 p( v unsigned int PINMUX19_REG_old;$ l6 Z; |. S; J- |# ?3 u
unsigned int temp;
: F4 \$ s$ K; U if(MCBSP_MAJOR)% z9 k' I9 S+ T- g2 [# _
{
/ n8 _3 T1 L+ o# m mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);. N( y0 Q9 Z+ C% @* l4 {
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);; T2 Y# g- H$ ^- ~
}8 k0 A0 x5 n& K7 [' ] g/ v
else
5 e ~7 ]$ t8 {( y }0 V { ]) r, G2 d* ^6 k$ u. P
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME); \7 M" h( Y( c% [
MCBSP_MAJOR=MAJOR(mcbsp_dev);
+ M+ h5 @0 |5 ] }9 a& g) n4 G9 M' E
: r# W G: @: t
if(ret<0)- o) [, X: ^8 L! R# R {( y
{6 e! o4 @7 ~; U3 |- A+ J6 N6 J- ?! @
printk(KERN_ERR "register chrdev fail!");! m5 u# p W3 I* F: q7 N
return -1;
, H" p5 |9 e" F# B }
9 X- l! p* C" g, Q + Y2 C2 m+ Q& P, a1 w
mcbsp_cdev=cdev_alloc();
' e; U' u+ W Z3 Y, } 3 A3 ~- \# q7 B) c4 e( \) @0 O
if(mcbsp_cdev!=NULL)2 ?% j# p6 Y0 d/ V0 w; }1 L
{$ p* O3 ~" x J
cdev_init(mcbsp_cdev,&mcbsp_fops);
, m9 B- {: X% m! @! o& q& E mcbsp_cdev->ops=&mcbsp_fops;+ J" s7 ^& ]7 v$ ?
mcbsp_cdev->owner=THIS_MODULE;
% U$ g* Z. c) T8 e6 H* [, U * p' M3 s* R* H6 w0 T% H( e! G& K
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) ~0 S% S" i4 R+ z8 r4 y0 H printk(KERN_ERR "register cdev fail!");$ _* T/ T' m" K8 E' o8 ?
else
7 j4 v) g4 k5 @0 ~+ Z2 v/ N printk(KERN_ERR "register success!\n");. e4 C# ?9 n. j1 m% e9 ?& c
}% b3 A7 N5 a. H* X- r) e
else
1 [$ f4 i$ b3 n1 {+ Z# l {
0 u' L0 x1 o `5 [( \ printk(KERN_ERR "register cdev err!");1 O9 a4 w% d+ L; E6 ]$ ]( E
return -1;9 s9 T7 M6 L2 h+ W' g# I' w
}
5 y7 ?' K! {5 t7 Y: y1 m8 n + o3 J: V4 [3 ?% U5 |
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);% Q! j( g) I' I
if(IS_ERR(mcbsp_class))
0 ~0 S. ^2 ~$ S E4 F {# C$ E- L. o. |
printk(KERN_ERR "register class err!");3 H* D0 _2 _/ w' l( u- z
return -1;0 d: P: z( t2 {! P. N# H
}
: d( V8 r# _ I/ b& K device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);+ I1 G- {3 ?/ D# i
" P& Q7 D. `. L' Q, _: n' ?0 m) ^* P //PSC
3 F: W/ t4 [8 n5 g8 S //add Enable MCBSP
( O A( t% q% v1 a0 M //test2 D, b1 ^' G7 b Q: G* P/ K
temp = 0x80000003;/ Q# p# ?$ w3 u; v6 f" A
writel(temp, IO_ADDRESS(MDCTL15_ADDR));4 I3 K: \+ `" v
temp = 0x00000003;
6 M3 {- `5 R/ Z writel(temp, IO_ADDRESS(PTCMD_ADDR));4 C! [ v9 m" }% L$ O/ X1 Q) ~
. q: X- }: T9 j1 S1 R$ S4 y( D
temp = 0x001FF201;# q t/ e J9 }2 @1 \( @' ]% @ o
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
. E( `0 i( d4 F: Z ?0 Z* h5 w
9 ?, |# ~9 J- Q# e; \/ h6 M //PINMUX 6 F) J H$ n# g; b) O# [
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" R _4 I/ s, o0 x" F0 L1 o p PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
+ ~+ L- Q# D! T2 E4 \9 A( U PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
0 w* E; A( v9 M# x; [& T z writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);" D# W& P' w. e: Y; ?5 D
: K% M, V5 w: M4 I1 d4 j //SLEEP_EN,EPR,L138_SHK1,L138_RC
+ O0 ^# G# M! m: j) _1 a( j PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); M$ H3 k5 v! J6 v
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 9 e( L6 }6 x7 H# `7 l) T* @
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
& R8 {( E3 p" d. R1 K / O6 w7 L% e4 Q% z: {0 B7 G
//RESETn,L138_SHK2
/ g& r9 i, g3 @# U' J s PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 7 ]& T, C' D. _. o: n5 t! Q, g- e
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
5 R/ e5 r. J F# u/ [: u# h writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 q: y- {, f, I+ i6 q9 V& i- _5 M
3 m( p- v' K! r; N. d
: K) Y! L. i" _. h //SPCR Register: C; I8 E0 d$ K( S3 j% o" b
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. {7 T1 B1 n- w5 ]
temp = 0x03000000;//(DLB=0)1 X p* w j) i- @) J8 } P* S% @8 Z
// temp = 0x03008000;//(DLB=1)& c% |6 \" P X. |
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset9 E7 y% Y8 @: n( r
temp = readl(IO_ADDRESS(SPCR_ADDR));9 v0 Q8 L% i- Z- o1 b$ X: M& [' L2 T
printk("temp=%x\n",temp);9 Y {9 C) p. M2 e2 T& D3 V
5 K0 U' I5 C: L. A" K //PCR Register
" g/ J) B) L9 j+ M //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 k9 m+ a3 I8 s7 n
// temp = 0x00000F0F;
0 b4 S6 |8 U' j4 u! _ temp = 0x00000B0F;* x# T4 _) @+ p6 m% k
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
5 k- |$ z% P. i5 W8 d2 C) y/ F temp = readl(IO_ADDRESS(PCR_ADDR));
3 G8 e$ U$ T& f& F! ^4 |" s1 q printk("temp=%x\n",temp);
5 j6 K5 B) n1 Z9 A //SRGR Register
3 \9 X1 u5 d: e+ d) z' ` //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 s5 i; H, ?7 b; i1 ?0 I
//temp = 0x301F000B;9 E! Y5 M$ ?- H7 k- N
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
0 V: ~ g7 Z5 f! [, E% i; g7 c% W temp = readl(IO_ADDRESS(SRGR_ADDR));& T* d: ~$ t) b0 e6 L9 W
printk("temp=%x\n",temp); W# a* V- v7 _+ z8 M4 R6 M
//RCR
8 a# @* X F3 F7 h" Y" b //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
. [1 d+ F& |3 @0 X! u6 \% p //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
1 Y8 x& \2 \3 m1 P temp = 0x00440040;" Z8 ~$ T( L9 g% ?
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ! S, W2 g# R$ B3 S! `1 [9 ~
temp = readl(IO_ADDRESS(RCR_ADDR));
' Z. V" ?0 t, p) Q( C/ N: v/ { printk("temp=%x\n",temp);
$ ?8 _( u0 {: c. E& n y9 h //XCR
1 I; ]/ h+ I( c, J //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 _+ V/ Z0 A) b- T2 t
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
% C0 J8 P, \& V temp = 0x00440040;
8 E! E; U: k6 v: @- m writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
& B2 u7 a) i2 A$ A) k+ e9 C# H; h temp = readl(IO_ADDRESS(XCR_ADDR));
: }+ S. X/ a: n6 I printk("temp=%x\n",temp);% c8 f( C$ [2 [# b
udelay(100);5 N/ _+ _! p" M+ ?7 B* Z3 K) f
//SPCR Register" n+ o' r$ N E
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 C+ Q9 i, Q) s+ t% f+ E
temp = 0x03C10001; //DLB = 0 VS DLB = 1
) E; H" k8 |' l/ D9 b+ V writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled- s" @3 W; M) E
temp = readl(IO_ADDRESS(SPCR_ADDR));
u# \0 g- X1 _2 |! \! k printk("temp=%x\n",temp);
, w7 o- a6 G$ F: X udelay(100);
9 y9 Q. }! s' D1 V
9 \3 G2 L+ t$ O+ W0 u //set GPIO direction
% T: L, A/ [7 E D+ T4 z8 S1 ]* F/ `$ o, ^ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 F& Y6 j. p& o/ n) i0 t temp = temp | 0x00000100;//EPR----input5 M, }6 q4 M, \
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 R" W8 L# }6 ^ s
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
' |% _* w, K7 B" F
" s/ O; B+ _& _4 u6 T. M4 S4 h return 0;8 C- [; U. q8 v+ B
}% ^% w% S: r8 q/ T; |
static void __exit MCBSP_exit(void): r) x; P) j& M% F, W
{
, q+ O' ?# P; ]4 f4 l4 e8 X, P- B printk("mcbsp chrdev exit!\n");& k7 V! |3 b; o2 C
cdev_del(mcbsp_cdev);3 Z @3 k. m9 s. @7 Z
unregister_chrdev_region(mcbsp_dev,count);1 r" Y2 D0 p# Q# u' N
device_destroy(mcbsp_class,mcbsp_dev);- s) N& d8 a2 n0 N. X; }
class_destroy(mcbsp_class);
3 L4 ~- Z; [: [4 W3 y}; G0 b$ h0 b. N8 U/ ?3 W8 |! N: o1 i5 x
module_init(MCBSP_init);1 e' p: U. Z1 A& W3 O
module_exit(MCBSP_exit);; a4 H. n9 c& r1 x/ f k
: Z* y2 ?1 P7 `. |$ h2 C4 m
MODULE_LICENSE("GPL");
' X: k4 j& e7 x' P/ y' |6 }
P0 f6 P; z7 m我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* k5 o5 F( A X9 {
我的应用层的测试程序如下3 Q% \* `5 z: @- }& Z1 W4 W
#include <stdio.h>7 W# c4 ]0 e! [
#include <string.h>
1 v( ^+ d% d9 T$ \3 R#include <fcntl.h>
+ s7 \" o$ s1 U. Q) u$ O#include <unistd.h>8 C. m# X5 c9 x& S0 d+ C
#include <signal.h>
2 ~( y* h6 ^3 V; `7 Z: v#include <pthread.h> //线程
' E% l4 ?. H6 @! _5 \#include <stdlib.h>
: ~6 u' [8 {- c7 f#include <pcap.h> //捕获网口数据
) |& C! j/ a0 h" o#include <semaphore.h> //信号 o. Z1 @8 O, Y4 ]. W! E/ q. }; W
#include <sys/types.h> //消息对列
5 a. M5 y! ~/ L8 U J! O& q w7 c#include <sys/ipc.h> //消息队列& W+ \4 E$ o/ i& i% {+ B1 E
#include <sys/msg.h> //消息队列
7 V( V0 l/ E9 _& ~#include <sys/select.h>/ y: x0 w# e# C0 I: M. ^, U; l& J
#include <sys/syscall.h>
/ v9 Z! [9 p% X7 a6 D4 J: |# C3 M D' l#include <sys/stat.h>- I3 i! M( a+ j0 T. g
#include <sys/mman.h>
4 k# j% \ h+ m1 U5 C) ~#define msleep(x) usleep(1000*x)
3 ]2 L1 s( T: Y8 p: t: S4 P; {+ F# ^1 N9 H. |/ Y5 {
int main()/ d2 y. b2 b& P0 m' H. ?4 K; p% s
{ & E9 o1 C2 W# V7 O+ `' e2 \" z: A" Z
//MCBSP,ARM与AMBE2000交互设备
+ L$ X; D' T6 ?8 v0 M; Y int fd;1 B; r1 F- f7 M$ B4 D( f' Z3 T
unsigned short data_write = 0x5555;4 M# a8 i f8 t7 s4 ~+ F: U
unsigned short data_read = 0x00;
1 n! ~- E8 o" Q e fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);* L3 _( P) ?; ~: E: |
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC); W' J" _% m8 h& |
; p w- r/ {' W5 p9 K# u: P if(fd < 0)
l+ C: H/ n$ E7 v2 S+ { {8 h2 V% Q8 l$ ~0 E4 s# M* H
perror("open failed\n"); x/ N6 R6 x5 t
return -1;
1 P- _1 ?7 Z. m" M( h2 o4 p( w) } } s9 K/ p* D$ `$ t; V) f7 J
0 x2 ^* b x9 I8 |4 L& n' ~ while(1)
8 V: I3 l) l5 \% X {8 m/ b, c' _% n/ H0 h k
* }7 g6 A0 K. o A' h* j //AMBE2000每次读写是24个字为一帧
0 ^/ k. r& U* n5 P; e" I1 n- K7 q- v1 ` //写数据时将数据在底层存储起来,等到中断的时候再发送9 e7 k; n/ ~7 |* w8 n
//AMBE2000输入数据是以0x13EC开头的
2 a6 h2 x; Q/ X# q \ write(fd,&data_write,sizeof(unsigned short));2 l0 }7 j1 {9 y% o z. c+ q/ u# Y
" V( M1 y. U/ {1 C, w$ s6 C9 D
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ) G0 f9 j& h: Z6 D3 E, X3 c
read(fd,&data_read,sizeof(unsigned short));
% J' S) t6 r J% w $ Q z: T! L R: N& Q! M
if(data_read == 0x13Ec)# z( Y; F& o( G. L: V5 L3 ?
{
2 X* ?% I/ A) P+ F. T5 u \; C + S7 O/ h% u c! P4 A
printf("data_read = %x\n",data_read);
# o) f- D& N9 @) F' C4 \ }
( v7 q: k: a X; ]2 U% v$ i5 h" Q6 a
* e5 f6 f1 {8 a* V! B msleep(10);) Y6 G ]; S; c% X2 _1 h
6 }/ D' G/ ~0 v8 W& `* o: ^ /*
* b4 ?- d, N5 i: P6 u5 j ioctl(fd,1); : q: A9 N, U; P8 q& {" ~$ ~
sleep(1);) r1 Z. D7 Y% W% c+ k8 q% m8 P
ioctl(fd,0);
4 J% K$ k R' [+ }# m- f sleep(1);2 E# m6 K, B8 N: I, |! W
*/ 5 R. _5 _: ]7 N! ?# a
} ! k9 E& s, i) X- y E
return 0;
$ ~2 g5 J* ~1 t
) P3 j' n/ R3 |2 `/ q}
/ u" Y# s2 L g
9 W; X/ n4 _* ?4 S% l1 o多谢各位指教,谢谢! 急$ G/ d9 r p; D3 M( \0 ~
# v( c% H5 q* w- n
+ H* \4 K+ O; T2 z. t# k a+ F! n; ], \9 q" t2 ?
0 ^) {9 k) R1 X' \, u2 ^
& `. P/ Y E8 I |
|