|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 F/ p! f3 u, Z3 o& k0 Q5 U
/* O% _; w% x d( D4 n
* Copyright (C) 2009 Texas Instruments Inc
- U& C2 M0 u$ x) o6 c *
9 a$ A) z$ D3 E7 S3 U * This program is free software; you can redistribute it and/or modify
& `- R$ P% n7 W) d+ E& p: a * it under the terms of the GNU General Public License as published by
5 `* w0 h; H6 X/ |% L * the Free Software Foundation; either version 2 of the License, or
* H& S* E% \( w# Y) _; H * (at your option)any later version.% e) c9 R# f% V5 j
*- }1 V( s! z" s ~
* This program is distributed in the hope that it will be useful,
9 a! z7 f0 B U; ^% P5 D * but WITHOUT ANY WARRANTY; without even the implied warranty of
; k# I' b7 n8 m/ O/ s * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the( V- z8 D# U( ?! Q0 b4 s$ A
* GNU General Public License for more details.
& o% w. ?3 L9 w! y' V *
6 N3 v# m1 |$ B: f6 l9 _ * You should have received a copy of the GNU General Public License4 w: L7 j7 V; A, D( w4 z: }- Z+ ?
* along with this program; if not, write to the Free Software
/ I7 G* N0 v( u9 Z3 J * Foundati- e4 i1 U% \- F, q Y; p1 R" M0 @
*/1 |% e& i7 s& T/ ?% \) ?3 A* B
#include <linux/module.h>5 P. J" _* e# x
#include <linux/init.h>" t2 ]7 R) ^1 k, g& ]
#include <linux/errno.h>) E1 k* _" c# K2 R9 `7 A3 v! y
#include <linux/types.h>& ]+ O y4 S0 }5 s& K1 k* ?4 ?
#include <linux/interrupt.h>
3 P. K4 F6 d# ?#include <linux/io.h>( P( v) Q: ]+ w' I9 V5 P
#include <linux/sysctl.h>, R( C( U, i9 Y" o: N2 U# Y
#include <linux/mm.h>
6 j/ S3 Y6 I8 Z3 x#include <linux/delay.h>
. h) A8 E- c) @( l#include<linux/kernel.h>
+ K: _/ V, x w6 F8 I& S: ^#include<linux/fs.h>- x2 L4 Q6 ?. l+ d+ ]
#include<linux/ioctl.h>
6 x4 Z. i) f* \4 ?" [0 h#include<linux/cdev.h>/ R* I$ c( H2 j! {
#include<linux/kdev_t.h>- W' H! D7 X( a u0 |% H' B
#include<linux/gpio.h>
: ~" k0 L* B, x+ E4 D0 {9 k#include <mach/hardware.h>
7 ]8 `& Y) i6 k$ P% @9 t#include <mach/irqs.h>0 j2 z8 u8 x* x/ A! U) f6 i2 c
$ X) k6 K/ o" N#include <asm/mach-types.h>2 a) D! T) L" o2 ]
#include <asm/mach/arch.h>! t& x7 g3 I5 u
#include <mach/da8xx.h>
5 g9 s8 V* z& t* p6 X# V#define SYSCFG_BASE 0x01c14000' u6 x3 |# T' F" V
#define PINMUX1_OFFSET 0x124 2 L9 Y' b) M2 M. K7 S4 W* J
#define PINMUX18_OFFSET 0x168
! }" y7 o7 }8 e#define PINMUX19_OFFSET 0x16c
3 W! P) G$ D4 X7 u( W. N#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR; I$ T) D% h/ Z) ^1 o1 t F+ J& Q4 u
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
D+ s- ]9 R$ z/ q#define XCR_ADDR 0x01D11010 //MCBSP1_XCR7 h! V0 h- p9 k) z
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
8 j& |2 |/ r% J7 F" F1 K5 h#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
8 Q$ j- b9 l) j- l* p
! A% F( p. e9 c! S A; Q6 i# T#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
8 C& t; k: a% V0 N0 ~% f' T, |#define DRR_ADDR 0x01D11000 //MCBSP1_DRR7 e' H- E7 b/ q' z
//PSC
* S/ K$ T9 K ?1 {: l3 H#define PTCMD_ADDR 0x01E27120
0 J: k- \% L7 H5 @4 X7 d N$ I5 h0 p#define MDCTL15_ADDR 0x01E27A3C: V* Z; T# G$ J5 C) _2 W
#define PDCTL1_ADDR 0x01E273040 [" o8 P, S9 Z' c6 N
//GPIO8 direction
5 D2 s- H9 L; j3 g R#define GPIO8_DIRECT 0x01E260B0
" t3 J1 b* j+ V7 j I( N#define GPIO8_OUT 0x01E260B47 h8 a0 S" d2 _3 B, |
#define GPIO8_IN 0x01E260C0 p# M5 M3 A3 f* E
4 y2 x. _$ z: [6 N8 ?
//#define MCBSP1_RINT 99
0 G$ K* W, ]1 Z f//#define MCBSP1_XINT 100
) C! t+ H7 y0 D9 l3 h& t' W8 Lstatic int MCBSP_MAJOR=239;
- k' r. [1 Q! e" h) Istatic int MCBSP_MINOR=0;+ C7 [% `: C! O; h
static int count =1;
/ X8 ~+ @% L, \; s I1 s( n0 F. @. O* r0 c) G# |
#define MCBSP_NAME "MCBSP-device"
0 r" c7 M2 N; [/ d4 \6 }9 M2 H. M: }1 O
+ Y; \/ u5 K9 L3 bstatic struct cdev *mcbsp_cdev;
( L) F8 U* e* |3 gstatic struct class *mcbsp_class;
9 o# A+ i/ J" O, a) @static dev_t mcbsp_dev;
. v8 ]" S$ f, g2 _# R& d! eunsigned int DRR_data;6 z9 R& {, k" v0 V8 C8 g; z
unsigned int DXR_data;
+ p1 K: v# n4 Bstatic int mcbsp_open(struct inode *inode,struct file *file)" U7 s$ T1 d: J+ N+ e Q
{
; S2 ^4 r+ W, _: H' j, W* L0 x! v . `2 G3 m4 N0 o' F& K3 p
//interrupt enable,initialized8 c% v, m0 b# v3 X& h+ o0 i1 e
unsigned int temp;
; \& E4 K" j9 Z: o //SLEEP_EN(GPIO8[10])---0
3 u: w' B' t4 x3 I `4 N1 n( f4 w temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ e' ]9 I7 s0 F: J temp=temp&(~0x00000400);, d+ w# Z9 Q! }- l% {0 B- {
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' B7 _& l+ T; A0 U: G+ \. q: w; ?8 ^; J
//RESETn(GPIO8[8])----0----1
+ M( t2 }, n0 w- D* o temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 m* ]6 L2 N6 A8 l temp=temp&(~0x00000100);$ H3 v* s; m; y3 n9 m! J' A+ x2 `9 g: W
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
+ p6 E. H A! P5 {" }3 `( d udelay(100);
+ U# ]" P2 @2 C7 F5 }) y temp=temp| 0x00000100;- z& j+ |8 r, W/ B0 U8 r# u
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
0 m6 s8 ?" N6 S, O# h( {, T, F k udelay(100);7 N) v' d/ `1 v1 x$ y) q4 J
printk("open success!\n");
* q% z4 S& Y* x- Z* \ return 0;
; O( E" i. k$ E/ U4 N3 ^- _}) u) l, @: z6 B6 ]+ x* ?( G2 ~2 X
2 h. _* w' g3 g- d6 `static int mcbsp_release(struct inode *inode,struct file *file)9 r# `8 F/ B1 p: m: U7 j. X
{
- K+ g3 v- S7 t [+ R6 X printk("release success!\n");! z9 X# W! n# [4 c$ g" ^" v
return 0;
0 M) P; a: D& B1 ]5 S}
; W" p( x- A, M6 X0 M V2 K" r+ n* U' O: L# x
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
# H$ @2 S5 ?( F+ e4 V# }{& T7 @8 ?1 m8 ?* g: Z) s! ^9 o' K. E
copy_from_user(&DXR_data,buf,len);( W* c7 N+ f* w2 ]$ \, h
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 7 \# f1 [3 t$ h9 }! A' ?! T
return 0;
6 }4 @# ~5 h' D1 r% _9 T/ Z8 M) c 7 C9 ?/ E$ E0 i% K5 y! W1 D" B9 L
}
/ o4 U' H) e) \% B
0 P: v8 ~: u5 J1 o9 E. M* E3 Jstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
: p" x4 R5 |: c! {{
( G9 L+ @9 S( Z! A6 z/ r6 b6 Y% l DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));3 c. D7 x! L; n/ q
copy_to_user(buf,&DRR_data,len); ; ^3 F5 l" }) `9 I; H+ H4 p
return 0;! A3 S; L4 v# _5 t6 y
}
% r1 y* _* L- P6 v8 K$ D$ m
6 t p, N# ^ e3 A! `0 L$ D! M/ |0 ^0 ]- T! v7 Y
static struct file_operations mcbsp_fops=
/ x/ h4 p; _# Q; D8 Y( h" T{1 [: @ }, a' n
.owner=THIS_MODULE,
& C: @3 M& h% h6 I2 e .open=mcbsp_open,% k- O, A3 g9 D6 w# \8 i
.release=mcbsp_release,
. N% E @3 o' B( k* I! ^5 i .write=mcbsp_write,
/ Y& |; J3 m1 N" R+ c( {0 ` .read=mcbsp_read,$ d l- i! `2 D% ]! T5 _
};* O5 s- M4 s& F& q( p
static int __init MCBSP_init(void). A7 X9 N1 j q6 _
{
5 J. f& S! c5 k0 j int ret;
3 l3 Q2 N( _: N1 E& @3 F6 K unsigned int PINMUX1_REG_old;( L- I' n" ]1 S9 ~# F' c
unsigned int PINMUX18_REG_old;
, m5 R6 Z5 E; y0 t unsigned int PINMUX19_REG_old;
4 d0 T; }/ I6 U: h5 ? unsigned int temp;
$ w8 c, l5 g0 C if(MCBSP_MAJOR)
3 C" s( T/ W$ y: n8 I {
9 c: @; b( C# {8 v+ O mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);, F* U0 P/ F1 {! k8 ~! K
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
4 h$ V; H% }6 E }
0 C5 x, X; D' P, m' l else! D. T+ p" {, }, B: s9 `, P
{
% c4 S, T. |/ Z1 k: p# N6 V ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);2 [. v' n) X2 m' G" _! Y
MCBSP_MAJOR=MAJOR(mcbsp_dev);
H* G% @# J$ U4 z: { }8 W1 e* r/ c: B$ n* I
6 f9 _8 N% a6 l3 _- }6 \) {9 }# v3 @! h if(ret<0) v; p/ Y9 {1 s+ N" Q
{8 g& A: J$ x! B' G/ [1 Z: P; D N& F# U
printk(KERN_ERR "register chrdev fail!");
9 O, n; @9 \( @1 k return -1;8 i6 k6 G) o: t- W W/ h
}
5 G* {5 r% F" O+ _% G9 e4 x& K" { 3 W& }! [, o* h8 H$ T: B
mcbsp_cdev=cdev_alloc();
+ X$ B4 c/ P, } / g% P, g' t; t
if(mcbsp_cdev!=NULL)
2 U( \) h$ A) p" x9 e) K2 W {
U) d* z3 n+ o; Y- V% G2 V. a0 }& w cdev_init(mcbsp_cdev,&mcbsp_fops);
3 `) }# }: J2 ]& ?' E9 o% M* x mcbsp_cdev->ops=&mcbsp_fops;$ {" ^( _, c0 S o8 Z$ ?
mcbsp_cdev->owner=THIS_MODULE;! T C2 k% w j ~6 d
0 G1 M# |1 z9 J$ b; S5 _ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# n A E( G! B8 y' K% y
printk(KERN_ERR "register cdev fail!");# B1 Q* t0 _4 @1 @) o! l+ O
else
1 B0 t6 @6 b N/ a. M* Z2 M$ h5 ^ printk(KERN_ERR "register success!\n");
# k9 H0 X5 y$ v9 z8 u7 x }
! {% _! s& T* H% \, ~0 b7 u+ ~ else
' _7 j1 x8 `+ S* W {4 @" F+ P ^( `
printk(KERN_ERR "register cdev err!");) ^9 a+ w6 F. M" _+ Z9 j. V! G
return -1;; u+ f0 ]1 z( f
}/ u, v) t1 z2 i8 R5 S
) G D: |8 E+ [% z L3 c
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);( f- A$ W6 J5 i% S* S3 `) v
if(IS_ERR(mcbsp_class))* g* M) P, \$ d0 ^
{
4 O& c' L* S- D, |+ C4 \" _( C% a printk(KERN_ERR "register class err!");
7 K V& [: i# F return -1;
# c U0 ~' I" v& [5 Y6 F2 ~' j } _ H; k9 C' p* ~9 W6 O
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- Z+ a, M7 R! `) }2 |4 N" S5 `, L, \4 L0 X2 j: d' g
//PSC% T% l6 d4 W a8 p* W: @" z" ~
//add Enable MCBSP
* _! S9 w1 L& _6 ~' t5 | //test5 ?- Y1 g- B9 ]; @
temp = 0x80000003;
$ w; A& H3 T" }* m$ F, a8 g writel(temp, IO_ADDRESS(MDCTL15_ADDR));) i/ s$ w& C% G! B1 a. W% k$ ?" _
temp = 0x00000003;1 Q1 O! z( ~' r6 V! Y* G
writel(temp, IO_ADDRESS(PTCMD_ADDR));
6 L4 k5 s( v% w, J: U
U* S! D4 q" M4 J- h9 I# ^ temp = 0x001FF201;
0 s* N5 C# [" e$ H3 @ writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ w {) I: \( y- T& w1 H
+ _! `* a/ O9 g0 {( \6 y" i U //PINMUX 3 d1 {; D' L) l* |7 C9 k% q
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: l: ]. w) R, _& y- l3 k6 |
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); - f: i2 f' b" w. w3 Z4 C: o8 a
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
$ y1 y0 B M& p2 D2 D6 X2 E( L writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); P9 U. Q! f$ M) s! I' E' u5 i5 @
) z) l% H' _9 w, n# j" b
//SLEEP_EN,EPR,L138_SHK1,L138_RC0 W9 ?1 _: _/ f4 b
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); / a7 g4 V5 F5 p) G
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
$ Q* ^4 l1 W; T& N, o" n writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
5 E1 d/ h2 u3 c" |2 J3 w6 p* O ( _. k% h2 i4 z; K0 z
//RESETn,L138_SHK23 B6 G% X9 z2 ^2 i/ T
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 \* f/ V) A- s! c; y0 I PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; N+ ]9 b( j: _3 {. ?& p! M! N
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);, F- ?, I! ^) A
/ J' S& o8 Z$ @. G8 j1 ]! k4 M$ Y; S) h
/ v" r/ Y" C1 t5 p //SPCR Register
+ A) R' p1 s3 j/ o/ S //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
) G. ]3 ?4 o7 H. k; y: ^ temp = 0x03000000;//(DLB=0)) p* \; w% L# X3 L$ a5 X
// temp = 0x03008000;//(DLB=1)
7 i' o) W7 K- l. W, F; J writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
0 _ e4 `* Q, ]7 Y: ]0 Y& l- u temp = readl(IO_ADDRESS(SPCR_ADDR));
3 j/ E6 i5 s+ V$ W# _0 f* O" s printk("temp=%x\n",temp);
6 Y% A2 ^4 j3 Q5 n* T$ P1 K( y + P4 `( X) o* |; ?9 F
//PCR Register+ a C6 H2 D: D! a# v
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) ]$ r# K, b }/ u- f9 Y4 \ E // temp = 0x00000F0F;
- ]! D1 u, T$ b( D! Q0 Y# b, T temp = 0x00000B0F;6 e; p f1 j5 S" m
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 4 h: I2 b3 u& X8 Z# E
temp = readl(IO_ADDRESS(PCR_ADDR));
0 b6 O7 l) _" L; R- Y" J# w printk("temp=%x\n",temp); ) @$ C& N' ^5 B/ |% z) \! |5 L
//SRGR Register
6 C0 {: b0 T0 n9 }* ^' D7 @% m //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- E }- V6 o8 i; b% n
//temp = 0x301F000B;
$ m" a; p) V3 s6 M% i, L8 J writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized V2 w. L" P: V
temp = readl(IO_ADDRESS(SRGR_ADDR));
* X3 A9 q$ W0 m printk("temp=%x\n",temp);' O9 n. h1 \* t7 G4 j" O
//RCR
( e3 H* X \; [% q6 ] //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,, j2 b2 P% f3 C+ K
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0% X5 r/ H2 E; q# W4 t; c! y- |2 w
temp = 0x00440040;
4 G% }( I# ~5 S' I writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
% Z( [0 c( \7 K! C2 z* n+ G/ R. n temp = readl(IO_ADDRESS(RCR_ADDR));5 n! Y- G" E P7 w! O- L9 d# R+ f8 @
printk("temp=%x\n",temp);
8 y$ Y# z; m, v! [5 p" u( ~ //XCR- W/ M6 O5 i8 T
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 A$ S0 O& L) _+ p( g0 {7 D; k& L* _
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0/ ~7 m# _6 @4 |) V \ i
temp = 0x00440040;$ f* F# K5 c. P" x" `: K
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
- [, U- O. a, a& ?7 U, k! B temp = readl(IO_ADDRESS(XCR_ADDR));
- U( k; x N, W! j2 F2 X printk("temp=%x\n",temp);
( b9 f4 O' f2 {; ?3 @ udelay(100);/ X1 ^$ x# y) E# h
//SPCR Register. h# R/ o. r/ Q9 u9 C) w
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
4 e' z3 {" O) S9 B( U2 f5 h/ d+ K temp = 0x03C10001; //DLB = 0 VS DLB = 1( n( |4 ^% a7 N Y$ U5 g
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled7 f( _1 q) k/ l d) A
temp = readl(IO_ADDRESS(SPCR_ADDR));
5 C& [ y9 N8 C' y8 [$ ` printk("temp=%x\n",temp);$ a7 A5 f$ K# ?; i* x1 s+ L
udelay(100);+ Z9 X! U2 i" R/ w/ ~; T
( q0 w/ D( ^! n; ], a" `, x5 O
//set GPIO direction+ w2 u( D* r" O4 r8 ^
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
" r/ ]/ g4 a4 b temp = temp | 0x00000100;//EPR----input
1 i" g5 \ r8 U2 D! N0 C' {1 `( l3 ^ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
! m5 S1 P( U2 Y1 x" S) r __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 Z' [1 m# b$ u1 a/ ?$ x) e
9 B4 o' \! X8 {; d+ \# P4 L
return 0;5 j; C. Z1 t) b, ~) s1 V
}; f% @% q( X/ `
static void __exit MCBSP_exit(void)6 `/ D. O- P, ]6 x1 w( X, K
{6 T) K T3 b# j- z* ?& Q% _: E
printk("mcbsp chrdev exit!\n");, ?+ h3 M3 t* \: f9 Z
cdev_del(mcbsp_cdev); l& b: f3 z4 @0 D2 E! J4 f0 b5 a7 p- N
unregister_chrdev_region(mcbsp_dev,count);
) c7 }5 J2 _9 w( ?# M device_destroy(mcbsp_class,mcbsp_dev);/ ?" S6 M: A" C) d2 t: G
class_destroy(mcbsp_class);! Z: F5 _8 p2 O) s
}" e% @1 X0 x% L* b$ a# B/ l0 U
module_init(MCBSP_init);- ?$ ^0 M$ ]4 [) k$ G
module_exit(MCBSP_exit);
5 }0 \6 U8 \4 c# L2 X- B
. h7 W1 B9 `/ O8 r4 l5 LMODULE_LICENSE("GPL");
* ~; P7 O9 { `9 M- @8 A
/ s2 S. A/ |" h- N$ r" k+ b. T- }我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 j7 J# p7 {$ P6 |+ f% Q$ {9 j3 g
我的应用层的测试程序如下3 X: l/ \5 r9 {$ E- Y) d
#include <stdio.h>9 m) C1 v6 h( s1 a6 B
#include <string.h>9 \$ M6 L: h$ U/ I
#include <fcntl.h>
' R$ d$ k6 @! G }7 N. K9 v#include <unistd.h>
% N3 e- U% ?1 w- ?( i#include <signal.h>' q# F4 i9 b5 T! p( s6 }7 O
#include <pthread.h> //线程
; x2 I( K$ [5 {9 `#include <stdlib.h>2 Q( R% |; y6 G' }! u9 M) _
#include <pcap.h> //捕获网口数据
0 ^, q* q$ P v$ _#include <semaphore.h> //信号+ _6 [$ ^0 f9 f6 A' M, Z& L
#include <sys/types.h> //消息对列0 t4 D& |8 s$ R( Q3 F/ {% T% J
#include <sys/ipc.h> //消息队列8 {8 K {- a: ~/ s- K
#include <sys/msg.h> //消息队列+ w- d- h0 Z) @
#include <sys/select.h>! E& j7 }% w+ v
#include <sys/syscall.h>. I& p' u/ x9 q& d, u
#include <sys/stat.h>
- j) f, I$ t! ^$ l3 L t e#include <sys/mman.h>
t! @# u8 ^6 z$ b$ w$ G/ {#define msleep(x) usleep(1000*x)
& I" N4 y+ e0 r3 y/ f. i6 }! q8 l" T }3 m, Z
int main(). J7 y5 S { |+ F* e
{
' U$ i% A& d u6 Q1 t5 `( R //MCBSP,ARM与AMBE2000交互设备
' c, M! y+ ^0 w' { int fd;
% X$ B; X/ s# q7 f$ E2 C unsigned short data_write = 0x5555;; p) r3 L& N' b; R
unsigned short data_read = 0x00;( @& _" e0 }% V4 b/ V
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( n3 H, O- r0 M' y+ }
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
$ ?( P; T& O, U3 l 2 l" E/ D" I6 N, o
if(fd < 0)& x+ i. R z+ C! s* ]/ X
{! B) c, O' a' z8 J% z4 u" O
perror("open failed\n");/ |1 x8 E$ q4 C& f% H/ y8 S
return -1;9 I9 l- D) X" s: k/ m5 ?$ B7 M( q
}
$ ?6 `3 P( t e# Y* ^/ m * O0 z5 s8 V! b3 J( F
while(1)# x( q+ u/ ], L; j7 x/ ^ C
{/ w. \1 w+ O8 Q9 W6 i6 ?1 K- ?
+ _/ R. }$ [% O' @/ X
//AMBE2000每次读写是24个字为一帧% Q+ N5 y ^ J3 Y a9 G
//写数据时将数据在底层存储起来,等到中断的时候再发送- A, G; _7 v" g3 J
//AMBE2000输入数据是以0x13EC开头的% x. Q" K! z5 a: `
write(fd,&data_write,sizeof(unsigned short));- \$ }+ J. ?3 ]8 N; X
; X# c- m, f6 R* @( a( G1 c
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
2 p L: q6 Z; w read(fd,&data_read,sizeof(unsigned short));/ b( r2 _* N4 v% c/ e! X
2 }6 \- ~4 Z; o, q" G
if(data_read == 0x13Ec)* ~2 U" Z- R& c* d+ Z' K
{
5 e& ^/ C; ^/ h. C3 _" C 4 Z$ u4 X3 t" J
printf("data_read = %x\n",data_read);
" C- z' [7 }8 h/ v$ y }8 [* e s f8 H. O9 F8 N9 ]- o( G3 L
" X/ }9 ^' V4 ?6 O$ a& T( q msleep(10);
9 d! S, a% [1 P) |% i! X) q 8 ?8 Y+ L( n4 l' S5 z% D2 S- K
/*6 ? { Q. Y2 Y9 p% N1 o: k( t
ioctl(fd,1); 6 E( ^7 X% r5 Y7 Z* ?- s* w
sleep(1);( S# @$ ~& N: H- {- b: @$ g
ioctl(fd,0);
% L& S* c2 W6 A& y! n. P' x sleep(1);
: G6 P4 ~" Q% h: q+ Z" ? */ + k5 G" P( j) ~* b) S
}
, q( i e/ m& I" [% i% Q return 0;) {4 I$ I+ U' F' A
3 S a; i3 ^! r, @ u- {% o. T
}- n/ A; c3 V+ A5 i) U- g: Q5 u; Z s
" l3 S! _/ ~. |) Z多谢各位指教,谢谢! 急9 @0 Q) v( o2 _4 i. [4 J
5 K! }4 {7 d: w
K) z$ k$ v- N1 o4 H# a4 C
9 I( X3 B0 \2 w- u- c* Z- x' P0 X
6 }/ O) g% c% Y
7 P1 ~+ N, w) p |
|