|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
" b: J$ ^, \2 `: V$ ?6 K; Q/*
( W3 ?" |, h0 R* D * Copyright (C) 2009 Texas Instruments Inc& {8 f& |/ T* U
*" Z6 s) V: y( ?$ J3 m! i0 @0 D. N
* This program is free software; you can redistribute it and/or modify
$ s3 N8 J5 T4 T% A4 q+ K * it under the terms of the GNU General Public License as published by* B$ G6 E8 b! a: P+ f' s( \
* the Free Software Foundation; either version 2 of the License, or# ], m3 W! g4 v0 _ [ }3 G
* (at your option)any later version.
$ D1 P0 ~5 L Y0 N, | *
6 D' W3 p9 @6 w" R) Z- g- [% K( o! B8 ? * This program is distributed in the hope that it will be useful,: S9 h$ v, ~$ U# W$ w
* but WITHOUT ANY WARRANTY; without even the implied warranty of
# u; }& A1 l; J1 Z7 K0 c$ Z$ u- j * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 K8 w8 D! `# U7 O3 I& d * GNU General Public License for more details.
. p9 J6 S6 l- I: t *
& ^" h1 [; E$ m/ {& E$ G; e' t% d * You should have received a copy of the GNU General Public License
Y' ~8 M( `; z& _) T# m+ W; N * along with this program; if not, write to the Free Software
( |' m$ ~0 A0 i! B1 I$ s* A; e * Foundati
; q: T, ^3 P% v$ O*/# Y0 Z1 D9 K+ O
#include <linux/module.h>
1 b/ D% v+ F. l#include <linux/init.h>
8 g: A6 \9 M' w- R/ P& t+ r% S#include <linux/errno.h>
; q7 Q2 K3 ^+ E# i* W#include <linux/types.h>
K0 r) Y/ a7 ^& ^, g; W# J# u" v#include <linux/interrupt.h> u$ }, m( b3 d* j
#include <linux/io.h>
- f; d; ~" |2 t#include <linux/sysctl.h>8 H" o/ ^; q7 e
#include <linux/mm.h>2 l q2 b a! n; Z3 K1 y
#include <linux/delay.h>
) O' \- Q, a3 q |6 H, Y#include<linux/kernel.h>2 p3 B n9 Y, w6 _ \, Y
#include<linux/fs.h>5 r0 p4 C9 U0 ]7 h; S3 t' w- V# ?
#include<linux/ioctl.h>7 a$ B) I" v- ], {2 L
#include<linux/cdev.h>
5 u3 L& b6 D7 U9 i; ?" `4 f7 ~#include<linux/kdev_t.h>7 S) X0 f9 V9 O+ C+ p! r
#include<linux/gpio.h>! O) b6 S; N/ Z- `+ z6 T$ j
#include <mach/hardware.h>
- @; {7 L* q& o6 G) o: D4 v: y2 a#include <mach/irqs.h>* z! ~, ]+ P8 V; Z. a$ ~' z! |
2 y. K0 z% ^4 B, a9 U) ^" i
#include <asm/mach-types.h>
% m& [% L* q7 w* L#include <asm/mach/arch.h>
0 Z" N, W2 K7 d( s1 v& p) D#include <mach/da8xx.h>
5 c; E) B) h7 ?( b# n3 s. E" e#define SYSCFG_BASE 0x01c14000
3 X7 u7 z" g. O F#define PINMUX1_OFFSET 0x124 # E" y. m% [3 J" A# m, B8 r- h
#define PINMUX18_OFFSET 0x168 " {2 J5 r9 E: U& o4 [
#define PINMUX19_OFFSET 0x16c
) p% d$ b) m9 @4 m' f1 z* m#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR: S: N4 | d$ L
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR- z( Y6 ]8 }0 ~* _ K
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR8 H$ r h2 L8 v* I- y
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
8 O U* P$ o% g- G, M2 @3 y) [#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
3 o, l' {. \) J* a" j( { 0 N% A+ k. k6 g& j. y, t
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
* g/ u) }9 B6 _9 g#define DRR_ADDR 0x01D11000 //MCBSP1_DRR/ D! U9 h7 w6 s _
//PSC
' @* z! N. s5 n* {6 Y3 `% Y#define PTCMD_ADDR 0x01E27120 % [5 K& B3 y8 ~9 C9 K" z6 _% ]4 }
#define MDCTL15_ADDR 0x01E27A3C" h7 i/ C6 X2 k6 ?
#define PDCTL1_ADDR 0x01E27304% ?; ` F9 T# c8 o' ~; H
//GPIO8 direction
v8 D) |4 }1 i% b# P4 }#define GPIO8_DIRECT 0x01E260B0/ O( a4 X! C( ^" C
#define GPIO8_OUT 0x01E260B4
2 V" @$ o; t/ }#define GPIO8_IN 0x01E260C02 n! L- K: H7 D5 f" q, p+ Y
) X' f. k+ ], ~5 N
//#define MCBSP1_RINT 99
9 `' W) N: p8 r( ?, x1 O2 u; P//#define MCBSP1_XINT 100 * d# O S$ v: C% e8 w6 k
static int MCBSP_MAJOR=239;
" I8 C9 U, w% y" Ustatic int MCBSP_MINOR=0;
" }% @0 V) x5 i# l1 ~* \8 ^static int count =1;
1 x9 J2 f8 E s; `4 {& F- p7 x1 S" g' q1 w! O2 X
#define MCBSP_NAME "MCBSP-device"
J7 W# S: O8 e; v9 Z5 m* U8 O
) J/ B5 t! H0 g2 M( ]) tstatic struct cdev *mcbsp_cdev;: q* L: V. Y+ Z* r2 m) e& V; X
static struct class *mcbsp_class;$ }9 m; n( c/ @( c' ?# b; ~; r
static dev_t mcbsp_dev;9 A. A# R( e( k5 f5 [7 G
unsigned int DRR_data;& g- c; i; _4 x# V- i& n- i) w/ N# \: h4 s8 C
unsigned int DXR_data;4 G1 \, u& |- r1 u
static int mcbsp_open(struct inode *inode,struct file *file)
( z! J( H3 S" ?! `; v: \4 w{' g) y& j' F) [, ]
: ]2 z9 p; l: R
//interrupt enable,initialized
4 [) {# e0 t( e1 {& P! t unsigned int temp;
4 E. v" }1 ~. P: J% O" D! u //SLEEP_EN(GPIO8[10])---0% i+ w8 w5 u# L+ ]7 r
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 n1 L ?* V% n" A- f7 F
temp=temp&(~0x00000400);
( O" A/ Z" c- L8 X __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, u% t. p0 q4 W3 k" ` //RESETn(GPIO8[8])----0----1
* \* M$ x5 `6 L) C6 k temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: j( [5 n- W+ A: s1 ~! W temp=temp&(~0x00000100);
, u2 ~7 M& i1 w+ {/ X __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
2 q2 W* N# h) @7 {) t/ f U udelay(100);" [) N9 ]9 A: g, Y3 G
temp=temp| 0x00000100;
! m% x/ L8 M, o/ _ E! ]7 Q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
6 b! A3 d' \- T udelay(100);
2 _$ l& l! e: Z. P+ X! W* q. T( x printk("open success!\n");! e2 d5 y$ @3 V) g
return 0;
$ o3 S) c' |- }* R2 @, j2 T6 ]( H4 T- h}
9 r3 ^) I# G% P2 X, h# z5 ?4 B
* ^6 y. s; {0 _: tstatic int mcbsp_release(struct inode *inode,struct file *file)- [1 y0 C* y+ M, N6 d$ o( J( i1 I
{
( B; i! q: }' y1 v$ B6 w) Y. H9 L printk("release success!\n");
' {5 E2 ]: `* q. u; F2 C" [" k& |. ~8 s return 0;
! }5 m' g6 U P f}0 Y& u- u0 j# b" O
L$ b' E0 t. m$ N9 ^( wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' K: _7 D$ Y# M' U1 _; a
{4 k6 ]. ~& m: S# G0 i, V
copy_from_user(&DXR_data,buf,len);
/ X' K& W p. D9 m. M7 a9 r iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
8 g# Q9 V2 Y4 t' o" T* p" y return 0;( X, B, R8 v" ^* J& L
$ p- a# @: w5 `8 U8 T' c4 T} N4 w# K- I$ r4 z7 Q! d* ^8 I
' v/ B9 I6 G) I# x+ Hstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' i) P) X6 F: E# B7 e{
5 B2 C" \, @3 w1 ]1 ~- U4 n DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
% i f+ ^# M( T) J0 }; J& p copy_to_user(buf,&DRR_data,len); 3 ~- M0 G. a; r g6 A
return 0;; p D4 b7 O4 `% o
}
* d2 ]+ C+ ~" U7 P4 l e
" K" z! h' R B" n; Q/ Y; Y
/ G( S9 p5 ^* `% T( _% w. V" _static struct file_operations mcbsp_fops=
' j& p6 \5 i$ g& I/ @) l{
. f5 o1 a* B! }1 d% p9 {* K3 Q9 x .owner=THIS_MODULE,
0 G+ X: K* I8 X0 e" c .open=mcbsp_open,3 {+ }6 g7 U+ [8 Y7 o8 n
.release=mcbsp_release,5 n3 O1 ?" L" T e, t
.write=mcbsp_write,
# v3 @* y- T* f* K W .read=mcbsp_read,5 H3 Z8 |. \7 G' Z8 z" m! w2 }9 I
};
4 _) V) p% y1 A* n/ W% pstatic int __init MCBSP_init(void)/ U0 I/ `3 c7 a" g/ H
{
: x3 j- L, W9 N1 C# N! L7 v4 s0 k) G+ { int ret;
! {0 M1 ^/ ^2 O9 j$ N9 [0 Q; i unsigned int PINMUX1_REG_old;
5 j: S p; X2 n+ t% d% K$ l unsigned int PINMUX18_REG_old;% @7 K4 w% y! p) N
unsigned int PINMUX19_REG_old;# g# o& U" E5 d8 w4 ^- t
unsigned int temp;
' p- q w, C* S" O8 Q if(MCBSP_MAJOR)1 f4 W, o: g3 t' E: G
{
, k% P, t7 N( x$ O) z+ f8 O6 m mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- X- _+ [* W5 d* @& r3 K
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);: |7 Y% L4 g. j$ P1 k4 O& V
}
1 ^: W: S9 J# d* j' _ else
/ r+ T4 Y. k/ c, p' M {8 Y3 w5 u; t/ P, Q- ?9 R A& S' o. q
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 a- r% s% z: h5 W- W4 C; M MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 N$ N4 Q9 E# x, M) ~ }
4 a& z/ ]( l$ z8 h7 |& `& f3 p ( C4 O! w$ \6 u+ P% |! v
if(ret<0)
2 M4 B9 G& S C1 h+ J& V, m {
7 ]& ~: a3 I! r; _' u printk(KERN_ERR "register chrdev fail!");- R: s/ [$ y( D( b1 W
return -1;( P' w% @2 V& V) l
}
/ B; Y+ f$ r I3 s y+ Y8 j. A( g
; |$ K$ _0 Y. t2 F- }$ [ mcbsp_cdev=cdev_alloc();7 K4 p. c2 f8 X& l
3 Q. u/ u9 P2 [5 t9 D q8 E9 v
if(mcbsp_cdev!=NULL)
6 g8 s# K# i; P2 T) X4 @ {
! e, @1 |$ S) G' W, | cdev_init(mcbsp_cdev,&mcbsp_fops);% B0 @1 f5 b* H- k& x2 w5 N
mcbsp_cdev->ops=&mcbsp_fops;
2 s3 e7 f3 r) Z0 E- Y mcbsp_cdev->owner=THIS_MODULE;- j9 \3 G; N3 N! y$ w3 X
$ U3 l1 S. x* J
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
9 L+ X: K: ]' N! ^ printk(KERN_ERR "register cdev fail!");" A6 A/ e; e4 \8 T" c6 v# E9 h% ?
else% R- K9 R+ m! s# D- N
printk(KERN_ERR "register success!\n");
1 L. b, B' ]2 g9 ]) U }
/ N {) k0 v* u8 x6 Z else
' Q7 z: C& K( R0 c) U5 ~; P {5 T6 i6 A( G9 \ u; \- G0 i3 R5 m: L
printk(KERN_ERR "register cdev err!");
" d3 Y6 c8 Y4 y! W$ k! c2 y return -1;. V" p( d7 t) g. A$ N0 ]
}, h4 [+ b# Y' G
O8 X3 F7 G7 L( ^5 d2 ^: F
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);. @4 y5 q3 U1 F4 X
if(IS_ERR(mcbsp_class))# n: E8 \- Z& L/ n9 |+ L
{
+ L; Y: c! l8 G: v h; R, V printk(KERN_ERR "register class err!");
5 K, }; g6 Z6 M) c- \& h( ` return -1;0 I3 K: C% ?* H3 d$ `
}
0 ?$ [$ t7 |( }& s, N+ P; Q device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
$ d! h; J$ n7 Z6 a1 {! L h# }/ |+ I' e. T; B6 I' b1 a
//PSC
. L% J4 z" t( Y3 t //add Enable MCBSP
8 U; z" \) Y" a+ A9 o //test& @, ]7 J0 A# y+ g. T0 ^: R3 T6 o( G
temp = 0x80000003;
0 C1 z4 J9 J- @% l9 C5 _ writel(temp, IO_ADDRESS(MDCTL15_ADDR));
7 l& b1 b- R' O4 I- X2 } temp = 0x00000003;
$ }* @( B7 B+ I writel(temp, IO_ADDRESS(PTCMD_ADDR));3 ?0 r% a% N8 W
W" v3 A) V. S+ L' n+ V( ?8 [9 X
temp = 0x001FF201;$ k$ G9 j) {9 l: G% ^
writel(temp, IO_ADDRESS(PDCTL1_ADDR));( k* G) V( s7 f5 u C
3 ]1 L% v# k5 f4 z0 ?" i //PINMUX " s5 k P* R5 s `! p, m0 B4 t
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" k; t# m' D) L. S PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; h& X% T! F9 Z7 [/ p PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
5 z) K- G* S% T! E7 f- V writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);4 B! z5 P$ H- U
' Q& \2 e" {" F* {7 C1 Z //SLEEP_EN,EPR,L138_SHK1,L138_RC
) f0 {9 V) @+ [5 R4 F8 H5 s PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 1 C) L4 x7 v' e5 }: ]
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; & W, a2 V& K* y% X. `8 P- z
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 @; ]3 e+ Q/ J2 I3 Y& [
0 ^* E. j' [' i: m% o //RESETn,L138_SHK2
+ W+ U( O* p' I" R PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
5 X3 v A3 ?5 [$ S& S PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
% h% g6 p7 L! \' w3 q writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);& B5 j; _8 V: C( d- w
# p; k# V' Y4 d3 K - D) h+ \6 A, v/ n6 g
//SPCR Register
5 `0 t6 [ O0 z; `* I" f9 t //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset3 q' y* {* |8 T8 j
temp = 0x03000000;//(DLB=0)8 M4 l+ @! j+ J4 Y; i
// temp = 0x03008000;//(DLB=1). c. p$ L; \" I$ {) E5 L4 c
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
, i9 L- S) n x temp = readl(IO_ADDRESS(SPCR_ADDR));
/ A. g- r: z; M printk("temp=%x\n",temp);
/ T( _, Z9 U! w' x2 M. D( E' ? 0 n3 z: ?) h2 {
//PCR Register
0 L' x4 I7 ^& a! B //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0( r: ]+ c% B) v; ?
// temp = 0x00000F0F;
Y* ?5 I. X' |: ~' \" a S temp = 0x00000B0F;
R/ {/ R# h- l! o+ O V) y writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
% Y5 ?" ]& \% M# [6 Q+ f1 [ temp = readl(IO_ADDRESS(PCR_ADDR));
( A/ s0 w+ v3 ~/ }1 ~; W6 S0 o printk("temp=%x\n",temp); 8 m$ N+ w, m( b, g. x' s+ N3 r
//SRGR Register; G7 }3 U; n# \( T
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==118 V2 |9 O4 z5 R; z) F
//temp = 0x301F000B;8 y2 u% M9 `+ ]5 k) Y
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized * L' H$ g+ y, @& {0 a- r) |
temp = readl(IO_ADDRESS(SRGR_ADDR));1 F& C! k) n4 ~3 O3 @( }, C
printk("temp=%x\n",temp);
8 N ~/ }' ~5 w6 [( j8 Q& W1 L1 R+ } //RCR. k8 W* M) J* ~" K2 U
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,& a! F; B4 p2 e; G. m7 G
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
0 K9 Y0 ~- m: j temp = 0x00440040;. v: t" E8 Z: ~* O
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized " e$ ]" k. W! @3 Y* N/ y* e7 t
temp = readl(IO_ADDRESS(RCR_ADDR));) ]3 y3 x+ w/ v/ ~" j
printk("temp=%x\n",temp);; `, j n' c3 r: C
//XCR& v2 `( D, v4 l& b2 m! J; S3 _, d6 e
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
" {5 k' I6 k' ~+ i/ H3 _: X1 b //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
& S3 i) M$ a# m- B, D" x temp = 0x00440040;
' y4 [5 [2 e/ u. f writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
4 W' f8 `! X2 O& v4 { temp = readl(IO_ADDRESS(XCR_ADDR));) q& m: j/ T! I2 _+ C ~% K# x
printk("temp=%x\n",temp);
! d% S$ D7 p/ s udelay(100);
+ j- g/ \ C0 _" v' S //SPCR Register
, R0 L. Q9 O9 A! O6 P //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
$ |+ y. W& G- F! K5 F temp = 0x03C10001; //DLB = 0 VS DLB = 1
" [% c3 v( o; z `* o- s writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled" C# D+ j. r8 e: p( z5 [
temp = readl(IO_ADDRESS(SPCR_ADDR));
, \4 T; ?& _0 E7 b# ^3 L8 X/ U printk("temp=%x\n",temp);' O! O4 L: h0 Y" m1 `) u
udelay(100);. F/ ^' |4 b6 l1 ^2 O! x j6 C
6 Z$ M* U5 E' @+ V0 X- U! f
//set GPIO direction" a1 f, T8 j$ h) t$ C
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
: y6 G' ]! Q' x$ F temp = temp | 0x00000100;//EPR----input( q7 r8 v0 v- m* a
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output. d6 i" z/ p' ^: _
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . c$ q, ~" U7 a2 n. c/ `3 k
" \0 w5 o) p9 d. |/ v$ P2 Z return 0;( }+ n6 Z/ L: Q, h! L1 F
}
- T" U; O* u, b! X# ostatic void __exit MCBSP_exit(void)7 D9 H, T( c \0 a% |" s! y
{
" ^6 I1 l2 e. B3 S: n printk("mcbsp chrdev exit!\n");2 O2 o# o3 {" v, F
cdev_del(mcbsp_cdev);& _3 W+ j8 S3 a* O8 T$ v
unregister_chrdev_region(mcbsp_dev,count);
1 ^+ M1 ?5 k+ W- g! N: _ X5 Y device_destroy(mcbsp_class,mcbsp_dev);
/ X! D" v. o9 j, R( w class_destroy(mcbsp_class);) v4 c4 F4 d; b- o- Z2 \
}. Z9 @( d* `8 J5 t, Y( E! G3 t7 R! P
module_init(MCBSP_init);
* P: b+ x2 W7 cmodule_exit(MCBSP_exit);. n3 S0 E3 R. H0 P' M) E
3 @) B- y' p! s+ e! V
MODULE_LICENSE("GPL");
8 D# L2 H( v! m9 ]) a7 ~
- q- n" f# P0 b/ j我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。; Y0 }% z- g% A% E; C& i; A' k
我的应用层的测试程序如下
2 t! j8 k/ @1 V2 t$ n#include <stdio.h>
M8 a; N+ B, `#include <string.h># G* I7 L: h y2 v. ?% o
#include <fcntl.h>
0 y+ V c9 ?1 M$ e: H#include <unistd.h>
' Y- S: b$ v# ]. r* ^# S#include <signal.h>
8 B7 e0 _- G- b. I9 {#include <pthread.h> //线程
9 R3 l- t6 F. d9 r+ Q1 D/ D#include <stdlib.h>+ d9 q& p4 @6 ~9 K& e L3 h+ l
#include <pcap.h> //捕获网口数据2 m4 j& r4 f3 } K1 J' j
#include <semaphore.h> //信号
+ s! G. z o# o; c: D/ }: D#include <sys/types.h> //消息对列" S) R- A6 |: w# T9 v% y
#include <sys/ipc.h> //消息队列
$ l* k$ E4 N; m) q9 H#include <sys/msg.h> //消息队列
6 U- a& I1 E. n7 z8 H#include <sys/select.h>7 g* K, i9 Z; v. u3 J# a6 A d
#include <sys/syscall.h>
9 P9 A: Z, f4 p4 B% R#include <sys/stat.h>
: M: _* \9 T: C m7 @3 H#include <sys/mman.h>- a8 U9 e! f! M j
#define msleep(x) usleep(1000*x)! Q9 I" c) f' ]* g3 u3 ~8 }+ ~
# ~' \ U5 L- @/ ^$ K" d! `
int main()
1 J& V9 V6 s6 o" c1 t# C U [{
* [ m8 P" Y- j i) e; D7 E //MCBSP,ARM与AMBE2000交互设备
, Z Q, A. z' k. O% _7 V. c' R6 K+ G# j+ S int fd;+ W( t* c/ Q2 U0 `, Q4 @
unsigned short data_write = 0x5555;- z+ k7 z+ r" z! @6 m+ k2 G7 C
unsigned short data_read = 0x00;
/ J& A" h* \' I$ a; i4 L3 u' D fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
* v& b6 Y! M! j* c" Z. W" J: q // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);, ?5 w8 |7 N3 F4 Y* O5 L/ i/ x4 e+ Z
; u' m, D1 k! e9 f+ m% E, w
if(fd < 0)+ F# X. C/ L7 h% \9 F0 B3 Z
{. y+ g. f, a5 {
perror("open failed\n"); p* ?; d0 p; O4 r
return -1;
) A! T4 d/ s6 i7 |$ ~, g1 v }) g* S V( D' K* w9 Y0 I3 j4 K( v
" M8 t9 A& [ n% I u
while(1): K7 K; _, R) A0 B
{9 v# O7 A" e0 |9 E- v
k8 v) B' W! c //AMBE2000每次读写是24个字为一帧% t$ p2 v4 m& @4 J4 d/ r
//写数据时将数据在底层存储起来,等到中断的时候再发送* K2 \0 ? F! r7 F/ `1 A9 m5 u6 p
//AMBE2000输入数据是以0x13EC开头的3 ~' r3 e+ W4 R4 y8 v7 L6 n3 a
write(fd,&data_write,sizeof(unsigned short));
5 f- f9 j+ ]2 k5 h; A3 f 3 r7 o% @+ {3 g% W- D
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 & c5 t2 S* S1 V/ y+ ] K, _
read(fd,&data_read,sizeof(unsigned short));
5 t* r' e9 h0 ^8 E" O
' S M, m. L7 @& S; z; ~4 } if(data_read == 0x13Ec)5 W' k( u$ f# ?9 l
{' H, _) X3 U5 C8 G% d$ n
/ E. y/ l9 ~% M% |* ~, r
printf("data_read = %x\n",data_read);! t0 [! Q+ w3 f2 v
}
3 G" E# C0 n5 r" D; D ( _" a2 a$ ?" u5 Q. }2 T' k U
msleep(10);
* e! W- w* z& w
, r9 }5 b' \4 t /*) t) Y" q4 j2 {$ c- U$ z! I% V- Y
ioctl(fd,1);
2 o% q- k6 f' r2 s' B) P sleep(1);
# [$ F9 H* U4 d- G5 s# A ioctl(fd,0);
) E5 O2 b, y7 I sleep(1);
5 K- e. N* i: I) ? */ 7 G0 `1 \2 h" c1 v/ C
} 4 X8 o% V i. m9 a ~# W9 ^$ _
return 0;
* K8 ?1 P4 d* L* ^ {: ^: O6 V9 k4 r; _
8 N% j' w- m$ k' p0 `7 @}) r$ { Z! X3 m. a& |
; L; }- I7 R6 F) x9 N$ ?! N" t多谢各位指教,谢谢! 急9 J C1 ?. `$ h
D9 }5 T8 K7 l6 A8 d+ Q
6 L }) P* z. x( l' |8 W
U% ?% B5 G/ s6 A2 E8 |
- p# j( _. n2 u; G6 W6 a& y$ ^ o* f) c1 g3 {
|
|