|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ( G8 k& X, i5 H3 e/ {. \
/*
# \, S' l' y& ]" b6 F * Copyright (C) 2009 Texas Instruments Inc
1 w- d, Q8 a. d- N6 u+ \ z, A6 h+ }0 u *
) y: B! \) x0 D# t2 F: @1 g' _) M * This program is free software; you can redistribute it and/or modify5 y" `* M; N8 R: J) ?$ O4 K
* it under the terms of the GNU General Public License as published by
: f! ]/ B5 P" `2 j+ G+ S" d: ^; ^ * the Free Software Foundation; either version 2 of the License, or$ `5 |% N9 T4 R/ x; ?) u
* (at your option)any later version.
8 L) a. L3 |% S" W *; z! L$ Y) g/ } B; P! V" z
* This program is distributed in the hope that it will be useful,; b A" N$ s4 R; l
* but WITHOUT ANY WARRANTY; without even the implied warranty of
2 c4 i2 [ X. O; f! F0 ]% ~ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: ?/ C/ r1 I' m% q2 q0 l2 ~2 ~
* GNU General Public License for more details.; }. [# a0 c9 q3 K
*1 Y- Z6 F7 w8 G+ b: O8 ?
* You should have received a copy of the GNU General Public License
( t M) x( q2 X * along with this program; if not, write to the Free Software' y- s% b( q6 U( J/ r0 c
* Foundati7 f5 `# w: M- u) |9 Y1 C7 G
*/
: |! B, S8 [3 D4 `; ^. q. Q#include <linux/module.h>
1 t' t; S- R$ [7 ?, V, F! T8 [#include <linux/init.h>) I6 r6 A+ `3 H# A7 Q
#include <linux/errno.h>9 |$ r7 j7 p0 ? g3 R! V3 t
#include <linux/types.h>. g7 v6 |* t1 ^1 \
#include <linux/interrupt.h>6 H# c) E$ F7 {# G4 m1 }2 r; k
#include <linux/io.h>
0 q: @% ], W/ }3 Y! j#include <linux/sysctl.h>' W `- L8 K: P* q: ]. c% h H
#include <linux/mm.h>
' y6 P3 z) Y/ ]" q4 r#include <linux/delay.h>
3 ?3 U& y+ B7 f% [! i#include<linux/kernel.h>* }: Y1 \ q: a6 j4 [% e
#include<linux/fs.h>
' F6 u0 k+ Z1 \: ]% d. Q0 L' f#include<linux/ioctl.h>
a2 p- G2 c5 g4 L0 P2 k A1 i#include<linux/cdev.h>
# ]6 l1 k" f! e' v% \! P# t#include<linux/kdev_t.h>
5 Z# ^6 U$ L8 E( A* T# e O' W#include<linux/gpio.h>" T: I$ t$ ]: p! s' r9 w9 C k1 D
#include <mach/hardware.h>0 o3 y, a& }7 n; j+ q
#include <mach/irqs.h>& B M$ w1 s" B6 u; S1 y, q; J
/ b( D( l! o' |#include <asm/mach-types.h>/ Z- p' p1 s- j
#include <asm/mach/arch.h>
. O+ @* N! I7 T#include <mach/da8xx.h>" y a9 }# W0 S
#define SYSCFG_BASE 0x01c14000
' W. c( v* e4 g- a5 v#define PINMUX1_OFFSET 0x124
0 i$ Q5 r/ G; ~5 ?6 f9 K#define PINMUX18_OFFSET 0x168
5 k! k0 o$ h- S" J#define PINMUX19_OFFSET 0x16c
5 x+ a6 D! ^+ `, Y, K5 M#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
+ t6 D1 p( E$ [ E( S#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
7 h" A: V& f; R7 U#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
0 |6 R% g3 ^$ B' K7 O' e- Q' C#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR$ }0 N' J5 w. ^
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
; Y/ l! E( G ? R1 g& c# _- F: ~ 5 X' X( b1 T8 |" E( D
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR8 g6 Q+ l* `. Z- U- P' K
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR8 U' r0 a: P6 O9 v' @( u( s
//PSC1 G1 t- y7 T& H0 {7 v+ t* w3 X
#define PTCMD_ADDR 0x01E27120 9 m# B7 i% [% y. `* S! a
#define MDCTL15_ADDR 0x01E27A3C
) s1 ~8 J( v- u: D1 j+ p3 z#define PDCTL1_ADDR 0x01E27304
* Y4 i1 x7 N8 r1 c7 _; I L//GPIO8 direction
2 z3 d! H/ m* G: O#define GPIO8_DIRECT 0x01E260B0
2 y) l( I# n1 t/ B- s7 b5 ^& C#define GPIO8_OUT 0x01E260B48 C9 b$ Z# A' C, w/ t
#define GPIO8_IN 0x01E260C0
J7 F. f# v5 E1 ~( W. u# C6 C; ^4 J) e t
//#define MCBSP1_RINT 99
0 }$ q( V) S/ ]; `+ ]//#define MCBSP1_XINT 100
/ u. A( h! a: |static int MCBSP_MAJOR=239;
z3 x: F0 Q% C! Jstatic int MCBSP_MINOR=0;; ~" G5 h4 |0 G# k" g, F0 g& P
static int count =1;
' l# N8 P" i v. {4 {- _
, _7 ^& ~* T6 U( n2 y: h2 ? [& T#define MCBSP_NAME "MCBSP-device"- {4 W: m0 }4 j3 E1 R2 w$ l7 ~1 q; K
' ~+ P) U4 m" f
static struct cdev *mcbsp_cdev;* U) V# d! B! R1 i( s
static struct class *mcbsp_class;' N& `* L# O$ {3 p% R9 s
static dev_t mcbsp_dev;* U3 g, H9 B' K4 B5 V( e+ b" |9 E# |/ V
unsigned int DRR_data;
; @, Z; i: y2 X6 M) Z, x' u. junsigned int DXR_data;/ p# z, I: m1 ]- p0 Q6 r# r% t, g
static int mcbsp_open(struct inode *inode,struct file *file)3 p% K7 d0 n1 W( B7 n# o# M* y; s
{
: y% j3 O1 Y+ w! ]* e" m" ?3 _
. s$ Y4 k2 X; ?" W* ?; F //interrupt enable,initialized! n G0 P! |8 I
unsigned int temp;4 m/ S9 O1 v9 b. K# u G
//SLEEP_EN(GPIO8[10])---0, a' f# [4 [- c% z
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 Z7 T* R' w( Y l: o+ A1 d! P' |
temp=temp&(~0x00000400);$ M0 _/ L R# s5 {$ R! U& L4 }
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10], Q1 v0 `0 \% Z- Q+ W% W
//RESETn(GPIO8[8])----0----1
/ m5 T& V2 z, w( r6 l- N# i6 _ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- p- @$ p: R, i% v, R
temp=temp&(~0x00000100);
3 D& M+ _9 ~4 A, Y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 x$ u1 ]4 A5 s3 u# ~" g
udelay(100);* Q9 s f7 j9 C1 [0 a
temp=temp| 0x00000100;& f; Z/ w! v5 g! J6 H8 a2 ^4 s
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
8 @9 L# O0 s& O5 w5 |* w udelay(100);/ g6 d! W" z i' z: q9 o
printk("open success!\n");
1 J7 S& u0 n) N7 @" q% i2 o( { return 0;: U% @, v5 U9 F! v8 j
}9 \/ u% `! s# B! f
& K6 \5 P% Y1 U, Ystatic int mcbsp_release(struct inode *inode,struct file *file)
1 X' {* y% Z4 w/ l/ F5 ~{
& j; s0 |2 j1 x2 J: X; N1 S" \8 r printk("release success!\n");8 W. y, R2 U! _! R
return 0;
) |0 L" h& r7 L% n) D% N}3 z/ i: Q% I; n
! V- Y' @% ^1 N) K
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* N8 ^4 a( ?/ s# e( Y8 m5 z6 w
{4 _% w) p4 e5 n( g
copy_from_user(&DXR_data,buf,len);
# `2 o! \2 W T! z iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
$ [7 T* I4 ~5 [- j6 B: N return 0;
$ T/ z) k" d9 X4 |+ i4 f& U - T9 Y6 b; }* Q% x
}) m1 h) W& V% B" u5 [1 S
. j/ x( ?1 b+ Z) U# T
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off); ~, n% F' m1 P- j4 h
{
& R* ]' ?: a! R# k9 ]& c+ e" X DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
1 [( c% M0 J; r; Q0 Z6 G( F copy_to_user(buf,&DRR_data,len); ' D% _0 Z1 ?; g2 h. Z# R) [
return 0;
: C' N5 | b" I$ Q0 H" k}
* a; l4 E0 V7 q- v! ^" F9 {! i' v F; u4 ~$ e4 s A" L# U: Y" [9 h
% X& l2 s9 b) C* L5 z; Y+ d9 \2 C6 Istatic struct file_operations mcbsp_fops=
, L. m/ y5 p: ]{6 p2 L) u+ d* o( `; U" N7 a+ x
.owner=THIS_MODULE,7 G4 A. K4 {1 ^, Q" d
.open=mcbsp_open,) I# e) E/ ]; ~/ t" o) A0 [$ b! R9 D
.release=mcbsp_release,
( l' W: d( |$ q .write=mcbsp_write,2 Q4 T. Q; x: A5 o
.read=mcbsp_read,4 z( P+ A9 Y4 g* t, r3 b, v& }1 l- X
};
9 Q+ N! k0 A w# Fstatic int __init MCBSP_init(void)
/ o6 a# A( V3 J{
+ r- G1 _# R1 k" w int ret;2 `3 x# n# N1 o) t
unsigned int PINMUX1_REG_old;
: f9 F+ h7 [4 m9 O( F9 f unsigned int PINMUX18_REG_old;
( K8 n2 h- L F' @0 ?( s" J: v W! k unsigned int PINMUX19_REG_old;. X' m- {8 ^ t
unsigned int temp;
9 f/ ]( E: s* I if(MCBSP_MAJOR)+ v1 N0 ~# @; w5 S: D$ A
{5 l Y! w3 I; H% o/ g9 @' f
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);/ z- t. w6 ~+ c- ?, ` i* m
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% [$ p: }& W0 v6 q f }4 y9 R2 p' A) E0 C0 c) {5 G
else# I/ |0 t; d& b T" g& I H% O
{
! }) E+ X6 L: q) y ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);3 T% |4 n! j k; H) ~
MCBSP_MAJOR=MAJOR(mcbsp_dev);
# | s# H( P4 S! m7 L }
- }7 X" t2 O; `" s5 y. z9 ^ 0 K, d% S7 w( _# e
if(ret<0)
8 X5 d. K$ u9 F8 X {" [& Q0 y( |/ P' x
printk(KERN_ERR "register chrdev fail!");
8 S7 m' }5 l' ^9 T: O8 Y return -1;
8 v2 F+ _# K8 |, ^9 F! @ } y& D/ g6 [: e( w5 @
% D6 c1 H- \! z mcbsp_cdev=cdev_alloc();4 e8 e- I5 Y ? U9 p) W( L
; T5 P" ?7 F4 ] if(mcbsp_cdev!=NULL)3 O' c& z* x2 p/ K4 X( a% ?
{; _8 s( T' w4 }3 g T) t# K
cdev_init(mcbsp_cdev,&mcbsp_fops);/ n. t5 _0 G. [1 Q# z4 j
mcbsp_cdev->ops=&mcbsp_fops;
' i6 k( I5 v" b! p; w mcbsp_cdev->owner=THIS_MODULE;: F; V4 w) d( u' t" c5 _
7 m V9 k4 V3 ]& ^
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
0 l3 \/ E; w& r5 ~/ b printk(KERN_ERR "register cdev fail!");; X& C- B. P6 Z/ |6 ?, N; e5 s
else
? j1 e" w9 m0 J/ S5 g' }$ o4 Z printk(KERN_ERR "register success!\n");* I5 B8 _$ z4 q3 ^. B8 {$ F
}
q: F" {% P- Y2 v else
! N- g8 s. L- l: l* q4 o6 ]8 W3 } {
1 E5 b, l9 ?0 P+ k printk(KERN_ERR "register cdev err!");7 _* v4 O# k6 F/ x8 s- `
return -1;
2 e7 i7 u& b" g% S! g4 w( g! @% Z }% ?; }4 e9 f, J( R/ G- y# ^
) q. ?: ~) U: ?, P, M mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);% Q2 C6 E1 u4 B1 c6 P- z/ B m1 ]
if(IS_ERR(mcbsp_class))+ B+ ?, j9 ~ e% {
{
- F, w6 @7 H. h6 G( U. Q printk(KERN_ERR "register class err!");) H6 x! }" D1 R9 J& _
return -1;
: S" [' l7 k- Y4 k8 P0 w% Y }
L3 ?+ ]3 i4 S* b! E. K device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);( Y# J, g$ r3 N2 d6 c/ v* ]6 {
9 u* }* L: P9 H$ [& X$ Z
//PSC
) g7 i; O1 l% t$ _) p, r //add Enable MCBSP, E" X5 t+ B6 v) ?" B
//test
( w" Y& m- `8 o% o* u3 ^ temp = 0x80000003;
5 B2 H } ^: W) k writel(temp, IO_ADDRESS(MDCTL15_ADDR));) K& n% \; C: s/ p1 V0 R
temp = 0x00000003;
* t0 g% T" {1 N u' x% Q' Z7 Y8 p writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 s/ E/ z8 V* X0 P+ Z, N ( {) e. e J. ]* z) t
temp = 0x001FF201;
5 u& `8 W; v+ O writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: e. ~+ `; b- a$ @ & `, e; t. j {" a" b" E
//PINMUX % ?. X2 N6 F1 n+ `0 L9 R" i
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
2 M: V, P4 P& Y {6 [; C/ ^ PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); # V( L/ s# }5 {% r9 `* Y2 A
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
; j H3 ^/ Z$ ]& |9 A8 I& m0 L writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 H' S" l7 S& |. `5 |6 Y/ E
: `- ?# w( Y+ F5 ]2 g //SLEEP_EN,EPR,L138_SHK1,L138_RC0 J5 ?' a! r0 S& e- N8 r0 k
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, O: n; k8 j1 M4 m% N8 C PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
! W( }# Q6 Z: q6 E7 z, q( c writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: p& s: X5 d" s" h4 {# f7 P3 e+ O 1 V1 |0 z- \/ s8 X' [
//RESETn,L138_SHK2
" X9 v9 t$ s4 u PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
( Z$ r+ s* m' M& S PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ! ?; Q& M1 h+ y
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
: h. j4 L0 `# p6 J5 i) R( {: g8 Z
7 b) }1 }$ y; m0 y [
" n: N7 @+ @4 B+ b: I4 h //SPCR Register6 m9 e8 h1 X+ J
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset6 h; W5 z( L; R% x' G/ P/ g
temp = 0x03000000;//(DLB=0)
2 G" |) T- s+ L. e // temp = 0x03008000;//(DLB=1)- H2 s! s* p9 ^ c: l/ Q3 _
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
* q# U) _ {; o temp = readl(IO_ADDRESS(SPCR_ADDR));" z! l, J* w5 [8 d4 H
printk("temp=%x\n",temp);" T" r' m4 k' @2 M0 f6 w
, [% u$ ~8 O6 h# Q( f0 _5 P! g
//PCR Register ~: `8 [5 | ?# Q
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ R7 J. L+ q, n
// temp = 0x00000F0F;6 W2 n$ V. i5 `
temp = 0x00000B0F;
- y) A1 h! D+ f" j! \1 ]9 L writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized + `* N* B! R; L- D$ v
temp = readl(IO_ADDRESS(PCR_ADDR));( J* `- G* i0 d+ N- y
printk("temp=%x\n",temp);
& d3 ?7 _3 _8 `$ S //SRGR Register
. l; W6 b4 ^& L' H u& t2 g //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11* A7 K' j' B! \- `! k
//temp = 0x301F000B;) r: c9 q# T) \8 Y1 r
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized " \2 u" i4 u- p# M* e7 m6 k5 w
temp = readl(IO_ADDRESS(SRGR_ADDR));
w& F! J, D- N) p- Q printk("temp=%x\n",temp);4 d3 ]' D3 D5 H9 P) M
//RCR$ B: H6 h0 I) `/ A2 ` e3 X
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
, {* G* j) q3 j$ c$ _# }7 I: o //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
) `( H) V' t; A% f9 A+ [ temp = 0x00440040;2 z9 f3 _( j! F6 v
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
, |- s9 s( X; Z2 \ temp = readl(IO_ADDRESS(RCR_ADDR));
6 q6 p! D/ @# D- _7 ] printk("temp=%x\n",temp);
; h* @( t8 Z& ?# G$ y( i s' Z //XCR
+ g1 t9 U/ M$ x1 N' H //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
8 S2 B7 A- H1 `* ?! Y) R //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
: E& z/ E+ l1 Y4 S$ d# a" A9 q( v temp = 0x00440040;
9 |# A- y5 j7 u7 D& A) d+ K+ J5 o writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized - E9 p, y2 e" u" W7 b/ N
temp = readl(IO_ADDRESS(XCR_ADDR));
/ Z/ |9 X, T, l+ ` printk("temp=%x\n",temp);) `9 V' O- [3 d) F
udelay(100);2 \6 M: z v: I% S3 ~* E7 U
//SPCR Register
# c* i- O) c( V- J! W8 b) S //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1' l" D' T; [- N# I
temp = 0x03C10001; //DLB = 0 VS DLB = 1
s8 O1 q! L/ v. ^, V6 n8 F$ O+ M writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled/ k; ]( i3 v1 `, _" k8 n7 i1 F
temp = readl(IO_ADDRESS(SPCR_ADDR));
3 g9 K2 N5 U) C# N8 E/ W printk("temp=%x\n",temp);8 }5 X! `( t- ^( Y+ @
udelay(100);
3 ^. I3 X$ _/ |7 b# G
# M1 n( _. ]7 _ //set GPIO direction
+ W' R; i7 b# d' n" b temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 b) t0 S( e1 ^. C4 c
temp = temp | 0x00000100;//EPR----input
+ G) I4 a1 j u% n/ @; u1 Y temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
* L; h p z( Z. a8 t( s4 K$ D __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 K4 G9 O, [1 j
: R0 h1 h6 e& }' o return 0;
( z3 n8 ]6 d& c2 Q. @}
7 H" d% C% q2 e f; N& F5 O( nstatic void __exit MCBSP_exit(void)/ |: j$ _+ S; x% P0 k$ g: q. F
{
) ]5 O: _3 g0 R$ t+ B printk("mcbsp chrdev exit!\n");6 Q" V. n( [6 M3 L" m8 l! A' x& ~
cdev_del(mcbsp_cdev);
# ~, w& u# k: r& i7 \' B. Q9 c unregister_chrdev_region(mcbsp_dev,count);
* [. M$ Q! J+ c* D device_destroy(mcbsp_class,mcbsp_dev);! A5 G; R6 N7 R$ U4 i% h
class_destroy(mcbsp_class);! o( A1 [8 y% I {; l* @& i- F
}2 I; G4 s- F4 ]1 C
module_init(MCBSP_init);
]( O( s5 I' e pmodule_exit(MCBSP_exit);+ R3 A C/ E/ n# ~5 e& q
0 H4 [+ I% {: A9 R1 l- M6 K2 SMODULE_LICENSE("GPL");
2 c0 [ H9 j0 F+ o) L5 P
8 K9 b: O! f" w) T我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ J) n' D) D& O) p. q我的应用层的测试程序如下7 i" q; \3 R0 _# X% K- ?% t
#include <stdio.h>& k% i- y# M9 c" J7 Y7 S
#include <string.h>" x7 [& m$ K& a- `. ]* w
#include <fcntl.h>
$ e. C8 {& M4 G! V3 t#include <unistd.h># v1 H" l2 \5 l& v( E
#include <signal.h>
4 ~. y% k/ d+ g3 O5 @#include <pthread.h> //线程
; H7 S. h" v0 K1 _7 ?#include <stdlib.h>; U* K) k. w0 n; B$ O2 ^6 n1 z
#include <pcap.h> //捕获网口数据
v3 ?+ B, x/ b, a- W# O#include <semaphore.h> //信号
8 u! e! V% O5 H3 ^, e3 Q6 J#include <sys/types.h> //消息对列7 O6 [. M' j: J. |. v& @
#include <sys/ipc.h> //消息队列, h+ J2 Z+ v2 d9 k! P) V5 F/ i
#include <sys/msg.h> //消息队列
5 X9 j4 Y; G: C+ z' Z* r3 T#include <sys/select.h>
; w* r" b5 R; F& n#include <sys/syscall.h>
7 Z4 R" l- C2 g#include <sys/stat.h>7 g2 b6 P7 X, b A) y; @, R7 V" V4 B
#include <sys/mman.h>
1 J( K* v6 o0 k#define msleep(x) usleep(1000*x)
5 U9 J3 X! D$ p2 C# v
0 s i+ |; Z7 P* a+ L) lint main()
7 a+ ]) E* @% r1 B{ ( N" @6 R: r0 L; u
//MCBSP,ARM与AMBE2000交互设备- S) }/ Y. ^5 R( k
int fd;4 `& X# @# k* Y7 I
unsigned short data_write = 0x5555;
2 j' G1 \( ?) q# ~6 P' L. b* K unsigned short data_read = 0x00;% z5 R. }2 k& l6 H
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
. }3 G4 n4 e5 h. Y9 s // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 M. g4 z; T! n2 g0 \
6 a) M, a9 g1 ~& X if(fd < 0)
/ T& U# m1 y) K- z% Q) L {" t) X5 r/ e1 F: R3 ^# c
perror("open failed\n");
0 b5 c5 v3 P+ d, L% _. E* z/ s" P9 V return -1;3 |0 y6 ~- w4 s M1 S1 B, T
}
& F" k$ M0 O+ p9 b' ~7 Y- ` 4 B4 t& G- P! y+ P' d
while(1)8 T* k8 h+ M" _$ A) l5 w3 f
{
' a! _# W' ~5 X& ^0 t7 _; `0 C
+ X3 d5 F% V7 g4 P$ h0 @- }! | //AMBE2000每次读写是24个字为一帧
2 V S% N7 m6 E' x# {/ H4 z5 E: d //写数据时将数据在底层存储起来,等到中断的时候再发送( {% y. H. D( W; ^! j
//AMBE2000输入数据是以0x13EC开头的* u8 d) l! K% c4 _: G. s
write(fd,&data_write,sizeof(unsigned short));
2 Z3 ]% ~% t1 q5 Y5 c 2 J* j; F2 r& {8 p2 ~
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 6 {, @; _( W: I
read(fd,&data_read,sizeof(unsigned short));
1 A% T: O! Q; r4 {8 P
2 R1 R3 }- C4 i: ~/ h if(data_read == 0x13Ec)
; }6 e0 X8 G0 M; _9 h7 q/ W' ]- f {
! i5 M) L) c; ^' D" V
0 a. h* A$ e2 g( v7 ?8 w: I4 o r6 J: p printf("data_read = %x\n",data_read);
7 m- t. d+ u9 y }
: c( _' O5 `! s5 T& `' s7 T 9 q/ v" ^1 E! a5 y
msleep(10);
% S, o9 _4 k$ L" @. _. \
) D) o- S) N' B9 o' I /*
! w) X9 J6 _1 O/ `+ C' Y ioctl(fd,1); # @) C* r( W& r5 E, |
sleep(1);
1 A$ @" M- G, ~ N% ^4 l( w) q ioctl(fd,0);8 T" U! D' F' K" A
sleep(1);/ x1 k# ~# C5 P6 ?8 G
*/
( \* d& H" a; Z" I } & O* O; d3 E- m0 t+ R
return 0;
2 x1 `: j, O! Z% T / _9 O" a- `! [3 [* b8 K
}0 z( d3 o$ H* N: T4 ]9 c' {
% B) N- _* o4 A; b多谢各位指教,谢谢! 急' y3 ?& K7 Z' U% h( t1 R
; b& _2 P3 i' _# B' `( E
7 X3 a- }6 T( S, h3 E' _7 B* Y/ K5 F9 e" I+ p
& o% ^3 [$ {& D/ V
( N/ e1 W' v- O( a6 v5 D0 E) o2 u |
|