|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ' z$ r% x) o. r+ k5 N+ v
/*
+ K# N! N3 f8 _- j' ` * Copyright (C) 2009 Texas Instruments Inc8 B8 A/ n7 \+ a9 `
*
: e" l! ]/ B* y' a3 j' { * This program is free software; you can redistribute it and/or modify9 R8 c# R8 v/ T9 i5 ~
* it under the terms of the GNU General Public License as published by# t' k( r" e: h: P
* the Free Software Foundation; either version 2 of the License, or s# g+ I0 O) {4 w1 U
* (at your option)any later version.
m& Q8 D' I( z *3 G" l& L% I* d, O! v4 D, e- \9 ^
* This program is distributed in the hope that it will be useful,9 H# M, M2 q; D( z% x9 N, P
* but WITHOUT ANY WARRANTY; without even the implied warranty of6 L, H7 ` i K7 }% }8 A( @6 M
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* P# O) o9 p+ B$ ]+ @
* GNU General Public License for more details.
$ O7 ^0 X% _2 p6 B/ N' v* Q *
1 z* ?/ q% v7 A1 d! B * You should have received a copy of the GNU General Public License
) K0 ^+ V7 K( ~' p* V * along with this program; if not, write to the Free Software& Z6 V3 g; o+ A h
* Foundati) l1 X" h+ I% w7 Y2 \& v) k% i
*/
( P; G3 U+ F) I \, `/ D0 a5 c#include <linux/module.h>
O4 a' f, B# [- ^#include <linux/init.h>' |0 B3 `+ g$ z4 C% G' h
#include <linux/errno.h>+ L/ |# T/ Q6 k0 Z& ~4 j9 r
#include <linux/types.h> `7 C1 d! ^# b4 J& n
#include <linux/interrupt.h>7 {& s5 ?, `9 `9 Q$ Y. F# ]
#include <linux/io.h>1 q t) i% d2 ?$ @: z4 ?) p& p
#include <linux/sysctl.h>6 s5 Z2 v9 n6 V2 B9 q Z2 R2 X$ }
#include <linux/mm.h>
. G6 X8 B0 W$ H3 z: m8 F8 |: t9 ^#include <linux/delay.h>1 x2 g. k0 C5 I' l Y
#include<linux/kernel.h>
/ j( c. _. I1 g2 f) ~/ u7 [#include<linux/fs.h>
& J/ |% K, F7 U, `8 {, _#include<linux/ioctl.h>
5 h P5 {; b6 y( }* q5 N#include<linux/cdev.h> \: Z: E% J" N: h
#include<linux/kdev_t.h>
3 w* t' Z; a6 w2 k; M#include<linux/gpio.h>2 [7 w- x- w) _6 z( K6 y; n: \& |
#include <mach/hardware.h>
! L/ c( k$ `3 a6 v0 {2 t#include <mach/irqs.h>
6 ]7 [) i" b5 C$ f8 R0 V
9 S) X6 _& Y* F3 ]/ }, N t#include <asm/mach-types.h>
8 `2 z8 p$ D" y' I( j#include <asm/mach/arch.h> [! I2 v- o, S
#include <mach/da8xx.h>
3 H! U& Y& e8 w/ Y/ e- G#define SYSCFG_BASE 0x01c14000; [. F l. P. k2 i
#define PINMUX1_OFFSET 0x124 3 {) i1 {. Q5 J# [
#define PINMUX18_OFFSET 0x168
4 S% L$ x* S: C6 S% D#define PINMUX19_OFFSET 0x16c
# H3 u( W4 ^. ~ v#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
4 [! M1 I" q9 e& v+ }1 ^#define RCR_ADDR 0x01D1100C //MCBSP1_RCR$ R. s4 A$ R5 Q" t1 D
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR% B3 N2 Z: {1 ]
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR2 |0 U3 Q6 w+ W; d1 V% n- ^
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR, W, X/ T5 R7 K& ]; s0 C$ y
4 t$ z* E1 \, p" A#define DXR_ADDR 0x01D11004 //MCBSP1_DXR5 ]# }7 v! E/ x5 |
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
8 @- _: |$ w6 L. K. O//PSC
$ n2 B2 S8 K# ^& x$ l#define PTCMD_ADDR 0x01E27120 5 {9 q3 V/ B7 D; D# W! H
#define MDCTL15_ADDR 0x01E27A3C
" c( b: ]! g/ G#define PDCTL1_ADDR 0x01E27304
3 j1 e8 [1 z% |5 [' Y6 ?0 @: F//GPIO8 direction
/ b7 a1 Z- ?0 B# D" c! k#define GPIO8_DIRECT 0x01E260B0
- ?& Z" x2 I1 `! s5 y#define GPIO8_OUT 0x01E260B4' m4 z7 R/ @4 s5 I6 W
#define GPIO8_IN 0x01E260C0
4 G0 F9 I: j4 W |& ?+ Z \8 ~5 F0 j y) S
//#define MCBSP1_RINT 99 ! h1 {. k8 _ T, [2 K
//#define MCBSP1_XINT 100
) s! m3 K& l" C$ _% s, rstatic int MCBSP_MAJOR=239;/ j4 s( y) c$ |. F7 k0 {$ Y/ U
static int MCBSP_MINOR=0;1 ] K% }# J+ y$ y
static int count =1;
4 G: A! \3 ?3 P- c% A& n: w3 B1 P9 s- ^4 Y2 \
#define MCBSP_NAME "MCBSP-device"
, H) A8 k' n* q6 D! ^! d. x( k4 H- m
0 Q$ k, m. R, J/ r& H. jstatic struct cdev *mcbsp_cdev;( X1 G0 W8 \' T# t3 ?8 `" H+ U
static struct class *mcbsp_class;
! a: _ H5 X( l( ]1 mstatic dev_t mcbsp_dev;
, a* M' `' K2 l' |7 I# Z. Junsigned int DRR_data;
# Z" w, w h) H0 |unsigned int DXR_data;
7 V B. F# I2 x, kstatic int mcbsp_open(struct inode *inode,struct file *file)
0 _+ I5 f6 J# _( ^0 G% k2 p/ y, s{+ C y& H4 c+ ?
4 D( ~7 t4 _( k+ r$ s" V. l3 \
//interrupt enable,initialized- t% J8 Y( h: s9 p3 S5 `! P& W. p) N
unsigned int temp;
4 ~- ~' ?; m8 I' h" N$ E6 O //SLEEP_EN(GPIO8[10])---0
6 U: u& b- u) T temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! z, z) Q3 a; Q
temp=temp&(~0x00000400);
, ~7 W, E* V, y. @5 v! l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]0 m, I# \/ x+ W- c
//RESETn(GPIO8[8])----0----17 O: F) N2 o7 Z( [* K3 h
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. L9 g- _1 E7 G8 J6 Q/ W
temp=temp&(~0x00000100);
9 @: r+ w; a! t) `- Z2 G __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0( _7 |9 t+ Q) H w& S/ {4 R
udelay(100);0 ]# N. k7 i$ N8 D% j [1 F2 r3 J1 p
temp=temp| 0x00000100;
% u& T5 E9 A; ~; ]1 m; T" W- O __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
! I! p+ P4 F" l5 U4 P/ `. {& d' J udelay(100);
) J2 j, \& ~* h4 f printk("open success!\n");7 m5 |6 e8 R1 y, h& c [ f
return 0;6 |1 D5 c) {* R9 b
}
i- O/ I- @2 T. s9 e% Y. u& n7 b4 w. i M, ]
static int mcbsp_release(struct inode *inode,struct file *file)
6 v& Q6 u# ~# Q6 s* w' ? _( }{9 [5 W! \6 K+ X9 D1 E* f
printk("release success!\n");
- ~5 s2 p/ W/ Y: Z2 S return 0;+ K8 Y# k- T7 O# Q
}9 ?4 N+ y; Q! O4 d; G9 D9 B
* W# s# I# }1 w+ {- k3 Vstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; E0 b6 N$ a: Q+ {# H' T{6 s; n* W8 ? m6 }) \
copy_from_user(&DXR_data,buf,len);
1 S9 `7 d' Q! n% {: J: C0 | iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ' n) t; C; t9 T# X
return 0;; n1 E. S+ V, C5 @% a% W
+ R4 z3 ^. l& t# g1 Z8 ]}
, P1 `# u) z% j& p9 P- z: y- v$ N# n5 l' K8 Y' w: t+ `' Q
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 F; d$ W! v8 H/ d4 E5 }{
R3 J) D) B6 l# j1 s+ X8 e: R DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));, C, R, O0 K' E9 y3 |! f' `
copy_to_user(buf,&DRR_data,len); 3 r4 @9 i% B# O$ ?* D
return 0;& y- [% N$ f6 J0 o$ U3 i
}% f1 J8 ^" q) N% r, ?+ i
7 l! }+ q2 I7 K: h
2 j: ~, W) L% rstatic struct file_operations mcbsp_fops=' Q) H' v' w0 L q# F; W
{
0 X M. o, C9 o$ o6 r- V$ l .owner=THIS_MODULE,% V/ }/ R/ U( s: e$ `7 R
.open=mcbsp_open,# V" k* v4 T5 }- _5 Y5 e6 B7 z
.release=mcbsp_release,
* K- D i% ]: Q5 T9 \* j1 V .write=mcbsp_write,- m' t5 M- z# c0 u
.read=mcbsp_read,
% L, y0 W, t. `4 P7 Y};
* A7 E* U: C7 E3 {6 Mstatic int __init MCBSP_init(void)
( k* N! g- W7 Y, L5 j( U, k }{
$ z( n- m! M$ \2 ~, H, K( E int ret;) W( S6 _# e( b# O+ N
unsigned int PINMUX1_REG_old;5 P7 D' b6 T% d$ y: [. a( v
unsigned int PINMUX18_REG_old;
: L5 ]2 [- ^& Y5 G unsigned int PINMUX19_REG_old;
+ ^; }) p$ W2 D( p2 I. ^ unsigned int temp;
$ Z* A2 T* ?- _ if(MCBSP_MAJOR)
) x7 [ |, v$ [0 h( |, Y* n {
' ?/ ?: r0 N" }" D/ N/ C mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
P, y7 D* J/ M/ p3 J' l% u ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);" Z3 E8 ~( N; g" p' _
}0 Q5 P' y$ ~/ Y8 ^8 w5 {* r9 z
else! G3 g( [0 s/ z) h& L
{
' |) `/ D+ w, V9 S U ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);3 Y' \) |, M" w2 Z
MCBSP_MAJOR=MAJOR(mcbsp_dev);' k m/ L2 A: P7 R
}+ l* x* N2 c5 R
9 o% w, w d! @2 v0 q' m
if(ret<0)
5 v3 r* f& A3 u- ?" B" x$ |" @ { X3 i1 c' o- ^4 i8 A" q
printk(KERN_ERR "register chrdev fail!");0 g! M; l1 k# U, h c1 J$ k
return -1;
* A9 L9 \) B' D& ^1 U7 u) i; U1 a }8 S% k' J. h8 I1 R2 n. {
9 l. D' N- H. u* Y( r' f
mcbsp_cdev=cdev_alloc();2 _! |+ \- `% s0 s
: D$ C& e; J A& j( x
if(mcbsp_cdev!=NULL)
& c/ d; x8 [: \9 Q {
7 Z7 Z, L: \" h/ Y cdev_init(mcbsp_cdev,&mcbsp_fops);+ [6 G+ a$ N& d8 O0 F' b% B' C) T2 U# H
mcbsp_cdev->ops=&mcbsp_fops;
8 K( k8 R) n5 g& r mcbsp_cdev->owner=THIS_MODULE;1 ~2 f, D. r/ N4 o% e0 q
6 m, h$ C9 X k) }( |2 H if(cdev_add(mcbsp_cdev,mcbsp_dev,count))9 c3 m/ w' P4 }5 T9 F! s
printk(KERN_ERR "register cdev fail!");4 e9 Q: O* m7 I9 `8 X# B" I5 A0 X4 y
else
P, D0 T7 a0 _0 W printk(KERN_ERR "register success!\n");
( I! |9 }% B1 q% z1 r6 d }
1 n$ Y7 j% } n* P8 Y3 q/ k# | else2 V% ], m% h" F& k# `4 V
{
4 h: Z7 F: N5 _ B( N printk(KERN_ERR "register cdev err!");
/ E2 e$ \( P) _% F- x: x+ t5 U4 H- e return -1;+ o7 r: W* y4 g9 o( |2 ~2 ]$ S. f# y
}
?0 z$ l9 j6 Q1 r3 j0 o
% t K$ P. @! W4 U mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! l. p4 n1 u& K8 w! J
if(IS_ERR(mcbsp_class)) O! V9 [% H- U
{
: R9 \$ j: ?1 G4 ~% a printk(KERN_ERR "register class err!");
! [; x; m0 `) H" Y return -1;
/ S. L6 h" |4 Z" ~1 O }
7 N. b& m2 @# x: w, b7 X device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; ]/ X' B/ M: O( ?; c" R
4 @0 g1 j; u% h7 Q$ k //PSC
5 v* Q4 _4 u8 G) [/ U //add Enable MCBSP1 R# G3 L( ]; L% x' ^1 ^
//test
4 z' n- A7 {& g2 D6 p# v temp = 0x80000003;
( b/ X' j& N3 D writel(temp, IO_ADDRESS(MDCTL15_ADDR));
p( |1 G1 @3 Z7 P9 k temp = 0x00000003;5 q* M5 X7 d/ V8 s
writel(temp, IO_ADDRESS(PTCMD_ADDR));* ]1 z- t. l0 f* @, y3 l* J
3 H" h$ Q0 R$ F( U5 U8 N' C
temp = 0x001FF201;5 O4 n$ L0 u8 L7 G$ l$ q
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
! h" G* {* k0 ] ! V p5 i. N' |& I
//PINMUX
# z' _' c/ @2 }& m: D/ {. Y //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& ?/ k5 X1 U# l y7 c) Q% C
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); , n T3 D. Y6 v$ x
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
' [2 J: G: T# b0 h7 f writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);( i: j0 W' G: q5 m
* D1 p+ U8 U- q% b! e
//SLEEP_EN,EPR,L138_SHK1,L138_RC7 U8 M* s7 J. m. j: {/ U
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ) L6 Q+ |/ B; k1 W
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
; W1 h6 ~4 b4 g) G* U writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
3 W, I" ~" ?5 e" q
, N9 i* d2 G3 z //RESETn,L138_SHK2
% K* O* [0 F$ ^4 \/ F/ b# X PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); + R" ~' P" |0 A5 d2 @. X, [
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
& V& J9 f5 s7 w: W, K% Z+ m# N) h writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
" r- R- Q% F- X
( p$ I: f# j6 E3 l, | + B: n; e, m; p2 `/ o
//SPCR Register2 B! e4 s7 e1 Y8 u0 s( }. @, C$ i
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
/ u! A: V. i2 } temp = 0x03000000;//(DLB=0)
6 ^: A6 n/ F A8 @; {. n# V // temp = 0x03008000;//(DLB=1)% a0 O# ]4 r* ]: p/ T
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
/ e& U" D @; s x: m& u temp = readl(IO_ADDRESS(SPCR_ADDR));9 J9 w$ }& i, @' B0 L6 H5 c
printk("temp=%x\n",temp);. b6 u5 C* O0 q9 A, Q
8 G3 [5 X0 T$ Z% g# v
//PCR Register1 F/ x% i# h0 t0 Z
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
. u/ ?2 z4 v. V+ \$ o! W. o9 U // temp = 0x00000F0F;( _/ k4 x$ |) N1 J
temp = 0x00000B0F;
! Q! B4 F0 @5 q7 D writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
% ?) C7 y! l4 P1 A" v4 g H% Q temp = readl(IO_ADDRESS(PCR_ADDR));
0 w. m9 d" e3 K printk("temp=%x\n",temp);
0 r4 D/ J! v8 n. L, A; @2 c8 G //SRGR Register( w& y w O1 O8 E) N
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 R1 O2 F( I4 S" a1 I //temp = 0x301F000B;
# L- D# T6 ~) p9 A& U0 z2 w writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
- ~ H8 ?% N" K; x: e temp = readl(IO_ADDRESS(SRGR_ADDR));: m- t' T8 Z0 L4 J: \
printk("temp=%x\n",temp);
% w+ L, B; ]& \9 y' _9 ~$ f7 T. }& h //RCR
: y% Q( J$ a/ ~# ~# N1 s( I //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,: l$ Y3 {- E5 @4 U6 Y6 k" \+ H
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0$ q2 N, S& P) T& e/ X, M
temp = 0x00440040; i9 U+ \1 X. ?6 y6 k
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ; i( r* K5 d6 I3 V1 I% u& L
temp = readl(IO_ADDRESS(RCR_ADDR));
& ^9 V! B% r; _4 n% Z printk("temp=%x\n",temp);- h [% t. H% C/ I5 Q* S
//XCR
( s1 t" P* Y8 R7 d, _9 _! ]/ G* B0 S //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
' f5 j& | _2 n$ @' h. q4 T //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; j' Y' v! |1 I- B1 `
temp = 0x00440040;" V# m; o8 N+ z8 ?: c: r" {& f
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
7 e$ Q/ g$ ?+ d( p5 ?# a( F% E# g temp = readl(IO_ADDRESS(XCR_ADDR));
* P1 }/ k0 z. X1 b5 ]7 G2 | r printk("temp=%x\n",temp);5 c8 i% i5 f# N3 [
udelay(100);
! }* F- P: M- o2 I5 d4 g //SPCR Register
% j% g/ W3 w2 G- j7 T1 K" ]7 E //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
! g6 m( c; @( {8 U$ p' X temp = 0x03C10001; //DLB = 0 VS DLB = 1
/ z* M# E1 U7 j" z; p writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled$ Q. z: U* p/ G+ O/ {7 R. f; W) p
temp = readl(IO_ADDRESS(SPCR_ADDR));
7 h2 w. v% _! l% Z# k V6 E printk("temp=%x\n",temp);
& U$ L, O7 m4 L4 I udelay(100);
" n' k2 y4 i0 T8 f1 i( x9 b7 Y2 J p% R$ l, Y
//set GPIO direction( [1 ?- F; a) N7 o# A# J, L- T
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
& `" j" V9 z8 {5 u/ u/ w* c temp = temp | 0x00000100;//EPR----input% f2 v- ~3 p/ L. p8 s0 _
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
2 a. C9 _* q! Z! d __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . M. k8 n2 c. ?) d: L* M
6 G! J3 H E! O, [5 Y/ n return 0;/ |, R- u5 d# M' v; e
}0 v+ `0 ?4 Y& p4 Y }" u {5 @
static void __exit MCBSP_exit(void). F- I: ^# \; W
{6 f" Q! N1 n8 @; \( x9 J7 `4 c' p
printk("mcbsp chrdev exit!\n");; U' k/ M: z5 C) M5 }. k) x* ]3 R
cdev_del(mcbsp_cdev);
3 g3 ~8 _, u$ I0 ^2 k unregister_chrdev_region(mcbsp_dev,count);( T+ Y) Y8 r v$ V) @1 A
device_destroy(mcbsp_class,mcbsp_dev);
& M0 O/ s1 |6 @8 Y) D; ]5 [ class_destroy(mcbsp_class);
8 W: v9 i3 g' t( }& n+ _; Y}
& m9 ?- O2 E$ f- h: r6 j6 {9 s+ wmodule_init(MCBSP_init);: Y& N7 m& T- @- W
module_exit(MCBSP_exit);
' U4 Y- |- L4 v( s% K5 \3 E
5 L7 N/ H( p0 [4 cMODULE_LICENSE("GPL");
( m9 E4 c2 w; r
2 B; S( j7 ?4 o我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
& _3 Z5 a/ u! h* y4 u我的应用层的测试程序如下
# m! i* z/ Q8 Y. ?1 O" L#include <stdio.h>
0 h: L) G9 t+ Z' E/ R, U; Y& c#include <string.h>
3 ^# w0 k8 y* c; u/ [5 `! a#include <fcntl.h>% N/ s% D I( e2 L2 i/ [
#include <unistd.h>
9 M" b* n& @% Q- X; o/ l#include <signal.h>
, p- F, u2 c2 T5 ]: I#include <pthread.h> //线程7 a5 v# v g! Q9 F
#include <stdlib.h>
( F7 k2 p, M% ~% O+ A#include <pcap.h> //捕获网口数据- ]! U% V7 @& p6 B1 K2 v$ @
#include <semaphore.h> //信号0 b) w- ~! R; R" ^
#include <sys/types.h> //消息对列. D& N( k D# V
#include <sys/ipc.h> //消息队列
6 g* D/ m3 |* q- o/ l/ f1 N y#include <sys/msg.h> //消息队列
2 J+ n+ X7 J) c! E% I6 a- B! L#include <sys/select.h>
* J: T& u0 l. O5 k* t, l8 l#include <sys/syscall.h>5 E6 v$ Y* l# y
#include <sys/stat.h>
1 \2 c. _- ~5 j5 Z, `$ P#include <sys/mman.h>! M; t/ N& U9 g" p/ G/ G: a
#define msleep(x) usleep(1000*x)
# i( z) x& g4 x& t+ ^: s1 L0 J0 z; U9 n- L" k
int main()1 a! V; ~ h# }' V, B
{
/ R; x- [. F3 M+ a //MCBSP,ARM与AMBE2000交互设备
/ j" v. T8 t' }7 J! w8 n; u. h int fd;- `; o- I6 e; i8 K7 M
unsigned short data_write = 0x5555;2 C: b" G9 S6 k9 F% ~4 r
unsigned short data_read = 0x00;
/ K( E9 J) U, E! O" l5 L1 R4 D fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);# \' I: a9 E4 k' D+ Z
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
: h$ E- F0 N. O+ d5 z" a- J a2 w" g' c+ n4 x
if(fd < 0)) F7 C' R4 F4 v+ L
{
* Z. k/ P8 T" v! n4 O. C- {- v perror("open failed\n");
, S: ^& g0 X3 j3 J0 \ return -1;5 e- X& N2 U( r" t- I" B0 t
}
/ [, @. Y4 M/ ~& h% E \
9 y$ G+ u4 {% M: T: B* ] while(1)
. ]5 P7 J* \/ W {
- ^: v& _) o) b6 M' k: }
* b0 K3 \- Q* x8 S7 | //AMBE2000每次读写是24个字为一帧
. u$ x/ a2 a9 g$ A" @2 t( z //写数据时将数据在底层存储起来,等到中断的时候再发送
& }( { F6 @1 f) L) X7 X //AMBE2000输入数据是以0x13EC开头的/ ]& x: Y# }# W7 I' ]7 X( G
write(fd,&data_write,sizeof(unsigned short));7 R* q S k/ K* l
! l" k3 @8 q, H5 H //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
9 U$ j! f1 y9 Q* y* m, z$ \ read(fd,&data_read,sizeof(unsigned short));
% s K# C* J; T2 ?$ d. K 0 w# Q& ~5 N' ]' D1 I; ]
if(data_read == 0x13Ec)) x; q* `% y7 j8 i, }5 F
{
5 c" P1 V$ @1 t; Y 9 _5 D$ ?7 _% ^* T! p9 i. c9 q$ Y% V. Z
printf("data_read = %x\n",data_read);
: V. @& v4 G( P7 Q) r/ Y* J }
8 q* {% ~* m( Z' W" z
6 y" O4 ]( t$ T msleep(10);) H) z) v% S( l; o2 o( f3 o
0 W z. G/ r4 ~
/*
$ D. f7 @' ^6 X$ _' J7 p ioctl(fd,1);
2 [( J" k0 y4 }6 j$ f( N sleep(1);: z: P- J& n4 |
ioctl(fd,0);) q8 K# i+ ]2 ^( `2 D' I
sleep(1);
6 `$ _, \) c! \ */ ' |& ?- c2 l2 F; u
} ! e V$ n) K r4 `. s/ `1 T1 {, |0 B
return 0; t0 y4 s. }! C' M8 j
. B% o/ o+ _( o8 x3 t$ L/ }
}# u4 Y% \1 T8 _' Q# a
. O; w* n3 v8 T1 b% {/ c* s+ ^
多谢各位指教,谢谢! 急
- I _" _3 r K' [: k9 G0 m, m# M4 G$ v/ E8 N
' L$ E4 | q2 k' p
/ J' z+ s0 j: `, ]; ~
' L7 p7 X/ d% @2 k' v8 J, o( R4 h+ O+ C; f! ~
|
|