|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 6 [ t( j" R8 F6 G% s' J
/*
0 m; J1 r I, v. _9 ~+ I. \ * Copyright (C) 2009 Texas Instruments Inc
5 `" c u3 R p1 V5 @$ i *
7 T# C4 i, w. T/ r1 P * This program is free software; you can redistribute it and/or modify
; c& j7 t+ n4 [* T * it under the terms of the GNU General Public License as published by! A+ [3 v; }" C" o
* the Free Software Foundation; either version 2 of the License, or
2 l$ L; s# d: ?* U6 `0 | * (at your option)any later version.
; k$ r8 R/ y7 F L! N1 K/ u$ \: D *
! f, K- G) E) r * This program is distributed in the hope that it will be useful,8 u* x! X/ N% _/ _: J; ^
* but WITHOUT ANY WARRANTY; without even the implied warranty of% n* j! X& W# L9 y% o; \1 W
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 V' q5 s3 o6 e& C! g; k
* GNU General Public License for more details.& G/ S9 Z( }- P% N+ q5 H
*
4 b6 A( D; @ c% H+ M6 j3 Z4 \+ S! d * You should have received a copy of the GNU General Public License) r- l8 @' f' @; C0 s/ D, H
* along with this program; if not, write to the Free Software
4 C2 p E r3 }7 Q) r# e * Foundati
! N: i' E+ p, ?- F*/
0 t7 k9 ]. ?% x" N, _& H#include <linux/module.h>
4 T5 z- O7 G% H h#include <linux/init.h>
8 Q- X, k+ w% i! T! g3 ~#include <linux/errno.h>
, z; o$ w. k) o4 k3 L9 ^3 g. o. f1 D#include <linux/types.h>4 C5 j2 b9 e7 e, Y' K( k
#include <linux/interrupt.h>
; u( e3 E" K5 k% s6 R7 E#include <linux/io.h>0 Y& X4 k" r- ]' i8 A9 \
#include <linux/sysctl.h>) C- K; ]" \+ X6 |/ l/ v& u+ h, u4 r6 l
#include <linux/mm.h>" a2 [# ^, s3 z! C: G9 y4 z
#include <linux/delay.h>; V7 i0 Q. Q1 v+ g) i
#include<linux/kernel.h>% L" _8 ^! ?1 s+ _1 G8 Y' `
#include<linux/fs.h>- ^! \1 G: c1 Z' W3 Z K% U+ u* D
#include<linux/ioctl.h>
! _' l. y- k' @1 g#include<linux/cdev.h>/ a4 ?- X7 p* x8 n
#include<linux/kdev_t.h>- g$ G# @' u* N# `7 b
#include<linux/gpio.h># X1 X1 Q! D: W0 `; A
#include <mach/hardware.h>2 `& n) k4 r6 T1 m3 @7 _6 u
#include <mach/irqs.h>2 Y& \6 F! X( j0 x2 p' d: f
4 c3 `$ \& [& B5 A8 ]" s! l& ~9 D#include <asm/mach-types.h>! {4 Z' }) B; ~* \0 l
#include <asm/mach/arch.h>
7 ^/ j" N0 J7 ~#include <mach/da8xx.h>
# b4 @5 f4 s, E; e6 J( e#define SYSCFG_BASE 0x01c14000
+ G* i0 }3 g# ]; _#define PINMUX1_OFFSET 0x124 4 \) h8 P: C" k! c& U8 s8 U
#define PINMUX18_OFFSET 0x168 / B" I2 @3 S1 ^
#define PINMUX19_OFFSET 0x16c
% z; x8 P; r8 f+ }. n( C+ ?' @#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR# J$ P' m; k4 ^; Q& w, q* E
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR! Z- X0 e0 B8 o: a: j. D
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR" k2 F, A( Y, b/ ` O
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
& F. z9 ?7 ?/ x#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
; u4 A3 u& N9 F. K! d4 e
% |- k$ ?2 e9 ]2 i+ m#define DXR_ADDR 0x01D11004 //MCBSP1_DXR- s8 h/ _3 ]' [9 B# K d% m9 V
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR2 v( ^; p, k# ]# j7 P
//PSC
0 k) i8 S9 R& T4 g; I6 ?8 S8 A9 B#define PTCMD_ADDR 0x01E27120 ! k2 X! V7 l) T; d
#define MDCTL15_ADDR 0x01E27A3C
' A4 A2 F- [" l, |* |1 X/ F' V#define PDCTL1_ADDR 0x01E27304) }# _: Y7 D, I+ ^2 M
//GPIO8 direction8 U# p" H" ]+ U, t
#define GPIO8_DIRECT 0x01E260B0( O3 j0 f- \/ X; T6 K M
#define GPIO8_OUT 0x01E260B46 q0 t, W+ s9 ?3 ^( S/ O
#define GPIO8_IN 0x01E260C0
. {9 G! ~' o R$ b4 d" u3 x% P1 c2 C
//#define MCBSP1_RINT 99 - q q8 X- G' h6 \
//#define MCBSP1_XINT 100
' U% W* d# i) P9 b) ~static int MCBSP_MAJOR=239;
1 @7 _1 O6 C! C" ]0 ystatic int MCBSP_MINOR=0;
( s& b0 |# O- C6 i5 J& L' b/ Ustatic int count =1;
, n" W( e8 t2 j& i/ \: Z/ o9 s% o" g K* d5 P+ U8 R0 U& T$ d
#define MCBSP_NAME "MCBSP-device"4 v7 |+ u5 J* i& s, |3 W
) o p6 l$ r' j* O. b
static struct cdev *mcbsp_cdev;+ R. t: l7 H/ W1 q: Q
static struct class *mcbsp_class;; J& [- m$ l, |* S) Z Q% }) d; m
static dev_t mcbsp_dev;$ s$ C/ Z6 }0 T" ` B* _
unsigned int DRR_data;8 m+ U8 \3 g' {& h$ b
unsigned int DXR_data;
" E) ?# O$ Q7 E: I; sstatic int mcbsp_open(struct inode *inode,struct file *file)' P! x4 L/ @! V# P3 F
{
: C, }- E; h0 k* X0 z/ Q 6 Q' \% E3 N9 }- I
//interrupt enable,initialized5 ?& E) I5 A1 m/ u
unsigned int temp;5 p* T. s/ H9 P6 ^% A! {
//SLEEP_EN(GPIO8[10])---0
! L6 v4 j; l. ^! V: t temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% N4 t7 b5 o3 b; @" { temp=temp&(~0x00000400);
3 m9 d, \# g& V7 q1 k1 p x __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
# W+ i E$ ~ |5 x4 ^8 V' l //RESETn(GPIO8[8])----0----1$ S, h6 e; q) R r
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, J$ s7 D2 l) A# ~9 o9 g- B
temp=temp&(~0x00000100); l% u* B+ A+ M1 h9 U9 j" l! u1 s& M
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
; s+ G- h+ r. Z C c X+ y udelay(100); y# _2 o# \2 c$ O; K
temp=temp| 0x00000100;% v* I3 \# k. }6 Y7 {3 V# U% b/ n
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
' l, P$ V+ y, `8 {7 g udelay(100);6 u$ K8 Q* g" W0 W( e
printk("open success!\n");- _6 I0 F. h2 ]) W4 f) G
return 0;
* C3 a0 {5 [) Y5 X) E0 @8 A}( d) m+ i$ p9 A `
~% Z: D: [" o+ z& j4 s
static int mcbsp_release(struct inode *inode,struct file *file)2 c7 v$ O% ]" l, d# H
{
5 @, q4 o' G7 P+ g* z2 Y# p printk("release success!\n");
5 o# ^7 ], G2 e7 E9 i: ` return 0;
2 f5 p+ d0 m s' R- r3 h) _9 @9 g}% u9 P( i9 X+ V) e2 D5 t6 c9 ~
5 b8 @8 N0 W1 D" v$ Q, `( I% a% wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' x" g, ^6 @# S' v7 Z
{
8 y5 e l& o: F8 C* _ copy_from_user(&DXR_data,buf,len);; A! j$ q6 @5 T( P
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 2 w/ S2 K& G# }0 V- Z: A
return 0;- F# B# L e3 P0 P. X
2 w. N7 l3 r O( ]+ ?}
# d% p! f0 y. y( d) G" O0 ]0 |5 t
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 r, |' N9 X, I! [5 K) L' w- |' a! o{
; q4 f" L9 q3 b e! C DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));) l# ~0 K2 k" S- ~0 H
copy_to_user(buf,&DRR_data,len);
/ s/ p. z. D0 C3 F2 s return 0;
% y/ R' y9 G+ u" b}; D" ` D& D2 n* i
& d' M9 T `/ l8 R# X0 B
0 b8 f: z6 b. Jstatic struct file_operations mcbsp_fops=& f* G2 A- W ^, }
{8 }" {( }- i% E# e5 o
.owner=THIS_MODULE,& p, d0 f' {+ s/ o7 H+ i% e$ _
.open=mcbsp_open,
9 I5 I! E+ N% P; A' E* ?4 Q6 O .release=mcbsp_release,; T8 {% O' k4 s8 @ p+ @- Y
.write=mcbsp_write,
/ n% V, F0 t& G4 F6 o% S, q6 M .read=mcbsp_read, m% i( d; ]5 I1 @/ ]5 @
};
: W$ a3 x0 x/ x5 K' j3 ?static int __init MCBSP_init(void). w% d$ p0 x1 o, ?
{( v6 x4 }9 K6 \3 a u9 X
int ret; i$ D! O* t3 @ I. Q, R) G& w& F# S
unsigned int PINMUX1_REG_old;
: H5 J3 _. M5 u2 R1 K unsigned int PINMUX18_REG_old;
* X0 }. i* j+ D- C3 C unsigned int PINMUX19_REG_old;
$ h: B! Q5 S" M8 k! H unsigned int temp; . @9 U# f8 N1 @8 I# y" n
if(MCBSP_MAJOR)
6 ?' p3 {% M3 L' r* E# ^; n {( K9 t, t7 W4 j9 o5 h
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
- S; p( E- F! N9 @; M ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);" K3 l2 h$ \4 R8 ^
}* P6 i2 y2 E4 O) F$ `2 [
else
- {. V4 m. ?# q9 k( W {5 M- R; ?$ @- J5 \
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);, N- L+ _: k# L+ @, A* F: j6 C
MCBSP_MAJOR=MAJOR(mcbsp_dev);
, u. P. B+ d& Q7 Y+ A }% O) V9 V% W% _# C
( R6 K# @! T _4 p6 w/ C if(ret<0)
( p K& M8 N9 }+ T, p {
, h: B7 E+ f' o7 T3 U2 n& y printk(KERN_ERR "register chrdev fail!");* R {( \! S2 E/ a# o, [! x
return -1;- B+ F. c9 E8 w' ^; S9 v; `6 T" j3 C2 R
}
; }* u: j \8 D& N% B }7 L8 E
8 O' h' O0 K8 B- J/ E, O& D& A mcbsp_cdev=cdev_alloc();
" h4 }$ b( }5 M' t4 I" y & E; ~) L4 T8 [
if(mcbsp_cdev!=NULL)5 h3 k7 ^- ~6 n& U
{) O6 f0 Z/ T, W& t5 d
cdev_init(mcbsp_cdev,&mcbsp_fops);8 p1 }' T& ^7 i4 h* E
mcbsp_cdev->ops=&mcbsp_fops;
, k4 Z, x% A0 K/ n5 |8 H mcbsp_cdev->owner=THIS_MODULE;" q: k2 w; W5 _8 Y+ j2 i
" k: j8 J9 I( q! H7 _8 x5 u4 e
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
4 [% r* h# l- F; ^9 j printk(KERN_ERR "register cdev fail!");3 M& C- O2 t5 Q3 B' u/ [0 @( n
else
/ }) i1 v6 J! | printk(KERN_ERR "register success!\n");
& d v" I' V& c- B& {' P+ W }
4 Q0 L1 v0 S# C, [5 z* K; f else
+ H$ E: ?( D, A J* b& V1 m {
: ?5 X: H9 O3 @; }, h( o: [ printk(KERN_ERR "register cdev err!");" A) x% r1 O4 ?# u _
return -1;
) c/ W& E7 ?& N3 g p' P8 ? }
4 ?. R% z3 }8 b% N+ R n1 t
. W3 S" \: }/ B9 i V0 V9 W" b% T! ` mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# k5 D* p' }9 z" `% ?' M ? if(IS_ERR(mcbsp_class))
" m( `( ]. z; s$ Y& H {
( W2 J" V& W0 o: M9 Y printk(KERN_ERR "register class err!");
- r @. [2 m) z return -1;
( q/ b8 O- f3 X }
, c( F, b9 A$ x) k6 t device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);& I) [* |1 }9 T2 j
3 i9 P: T2 j. v; h8 Z& [- _6 h
//PSC
" n1 P( n5 O5 B( a3 ?+ F //add Enable MCBSP7 g3 J( `4 a) t
//test
# A4 h0 S, @" a temp = 0x80000003;. }5 A \) Q5 ?0 ^$ f6 B
writel(temp, IO_ADDRESS(MDCTL15_ADDR));1 P7 w! {; u" g% L% c$ A
temp = 0x00000003;5 V( _/ `( E$ F" S+ E
writel(temp, IO_ADDRESS(PTCMD_ADDR));; T4 S/ h) `. M/ y0 m# j
: z0 ~7 c/ [9 h- _ temp = 0x001FF201;
. w2 I( @ k A& \$ _! a$ H0 Q writel(temp, IO_ADDRESS(PDCTL1_ADDR));6 l4 r# c7 v0 y$ I
, H. X: c" T* f1 V( z& n
//PINMUX $ p) q2 g4 J5 c
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR," }7 z% @+ u: }! T; m2 G9 F# i$ K
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
) Q" a, f# P/ ?- v8 v PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 2 ?# v9 q: p8 D
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; p. F$ M ?5 j, {5 s, { ) N# {$ ?9 g% e" _. B; a
//SLEEP_EN,EPR,L138_SHK1,L138_RC3 q0 V* Z" Y- I5 `! |
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 7 ^& _, B% t% @9 x' C6 G* X8 I- ~* L
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 6 v& f. Z( g* Z ]( w4 {
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: b5 q: h# W, Y8 X
5 R2 K, U7 G& g: B5 y //RESETn,L138_SHK2
* k! S# I4 @3 e; J) M8 @ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ' R/ ?) g5 C( z; W/ e/ b
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
# J6 q2 x) d$ x x) G1 D4 ^) x writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
* w" ]: ?. o. R l& \ : Y7 u( W6 j' H) h6 a$ t9 i( T
& H$ v9 h, B/ v
//SPCR Register
* g# u+ l- v1 _; T4 a //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
3 C9 R( ?; r, B _" D- P* D temp = 0x03000000;//(DLB=0)- q8 ^2 _! r6 K. G
// temp = 0x03008000;//(DLB=1)4 q4 ^) K n7 B& t) A+ _+ p% b
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset0 t/ M4 v7 L( ?# p) C b
temp = readl(IO_ADDRESS(SPCR_ADDR));0 ~; m. {2 v* T& _3 {4 B9 B
printk("temp=%x\n",temp);
$ ?+ C1 p9 M [5 U8 b9 b, ? . `& `/ r/ W3 X3 z& Q3 _
//PCR Register
+ s: N$ d1 |# L9 ]$ X' ~ //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
! ]0 {; J) l {+ M. @ L% X6 | // temp = 0x00000F0F; t: s" L$ K! g5 R1 t: o- m
temp = 0x00000B0F;
; d) e. ^ g1 l writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
7 U; e* n U, u$ O9 \ temp = readl(IO_ADDRESS(PCR_ADDR));3 d1 L9 k" n& V- s4 c7 M9 u
printk("temp=%x\n",temp);
3 J' y; O- F; D: B //SRGR Register$ }6 I& P8 _6 }7 A6 Y
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11# ]) Y/ h/ i0 i' E5 [' Y0 H
//temp = 0x301F000B;
: F. @1 q( V' J5 @2 r) O/ F7 M) n writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
2 D) g" V2 p9 z8 H9 G temp = readl(IO_ADDRESS(SRGR_ADDR));8 x3 C1 ^7 h2 E( k
printk("temp=%x\n",temp);0 u6 Q5 e8 @8 }; |
//RCR
, o/ N. @3 o* |- {4 C, d //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,7 H6 N# H7 I3 r
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0: C+ U/ x2 i4 @ h- ~& M m
temp = 0x00440040;
% L' R. a& A+ |* t5 | writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ( c) [( H/ X D/ r4 x$ J' _
temp = readl(IO_ADDRESS(RCR_ADDR));
: G. \1 a7 I% M- N: W printk("temp=%x\n",temp);
- b$ s1 Y% E( D3 d& j t0 D- ` //XCR
) p$ o* A+ _4 y7 ~2 k3 X //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
# X1 q" ?8 B% r, q //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0: U6 U+ u* _8 T! p- `
temp = 0x00440040;
0 s$ t) P: s s: d4 |0 A/ o3 E" q" u8 | writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 4 v8 `1 H1 R9 z+ \3 Q
temp = readl(IO_ADDRESS(XCR_ADDR));
3 b) c) L2 M- @" | printk("temp=%x\n",temp);
6 X: T1 z [, f, H3 f; _2 G; Q udelay(100);
' t8 Z/ U2 B Q, S4 y" Z1 a5 o //SPCR Register* E3 v5 f* O/ x
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 q* N( M# ]/ O7 m: J temp = 0x03C10001; //DLB = 0 VS DLB = 1
7 x# J2 o2 }% m writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled9 s& `$ |5 G* X5 Y+ V
temp = readl(IO_ADDRESS(SPCR_ADDR));
- d, n9 Y9 w. a& I/ b2 v5 s printk("temp=%x\n",temp);/ ~2 q5 \; U9 {/ F" }0 u
udelay(100);
5 P3 [- ^% m k2 L W4 Y2 r
& B3 e4 Q& L% T5 O$ q' B //set GPIO direction% C/ v q( f7 K& l/ m6 K: D
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));" R/ g. ^7 e. o" V3 I, V! f* P8 Z
temp = temp | 0x00000100;//EPR----input+ t) O' T9 d. @' z0 u" E
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output' s0 n- d% @/ v
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ! L( {! i; R+ H( j0 R/ e- \& ]
! G, a$ G6 Y# {' m% l
return 0;* p) _- \, k& V- c2 I8 V+ f# j
}/ \6 p3 F& W5 E0 d
static void __exit MCBSP_exit(void)5 m* n5 Y, n3 V8 v
{7 R, p# ], M/ W/ J/ J- |
printk("mcbsp chrdev exit!\n");
# Y5 `0 X) Z; d cdev_del(mcbsp_cdev);2 i0 G2 G# x7 Y4 b5 E- T* R- k
unregister_chrdev_region(mcbsp_dev,count);& S& Z! o8 Q# V6 w4 m
device_destroy(mcbsp_class,mcbsp_dev); y& ^* q2 ~+ |# c: @0 e: P
class_destroy(mcbsp_class);# R d/ l* w4 T m
}! B! } U" w( b4 R" ^6 e
module_init(MCBSP_init);
$ F! b3 y: J8 d/ ^# _module_exit(MCBSP_exit);' J2 }4 F9 S& k5 h" W1 K, _' n
9 V) o# N' [0 X/ X7 b! V! j/ J
MODULE_LICENSE("GPL");2 M7 M( S* ]: w, H9 }, N
2 y9 X4 x" |2 i. q
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。! [9 T9 g" `7 ^/ u
我的应用层的测试程序如下
1 f9 l" |2 w( a; X/ E#include <stdio.h>8 k1 p/ u1 g3 {6 Q% B* p
#include <string.h>
* U3 n2 l5 d: R0 K+ G#include <fcntl.h>
" {" ?5 z* F) Z$ m/ @" y3 O+ ]$ \#include <unistd.h>+ |7 E. ]5 k/ T' a3 x9 w A3 q
#include <signal.h>
+ q0 C2 h( x; a# I+ d" U t9 r& ]" [#include <pthread.h> //线程
M$ M: ~, \& G4 z' X5 W#include <stdlib.h>
6 Q% i1 D9 f$ f! q8 G2 ~) i \1 a#include <pcap.h> //捕获网口数据# w! P) i% l T
#include <semaphore.h> //信号- |1 l4 i& D0 \. m3 d Y
#include <sys/types.h> //消息对列9 N- L/ U9 b' o; f
#include <sys/ipc.h> //消息队列
8 `- m' x* A- e#include <sys/msg.h> //消息队列
, f( F+ Z# q& B, g9 s' |, E#include <sys/select.h>" B! O3 H( H: ^6 _9 @( n5 G
#include <sys/syscall.h>$ J' A/ ^: L" l( U9 f" t
#include <sys/stat.h>
( X7 Y2 b+ t7 i; ~#include <sys/mman.h>
k8 t* x! w& Z: D* L: [#define msleep(x) usleep(1000*x)
) ]' L$ O& G- R" H5 `' ~5 M2 Q+ C
int main()
+ N: S2 S0 @; ~- u8 P [1 G{
4 a4 v2 D! P- o2 L8 S //MCBSP,ARM与AMBE2000交互设备+ o5 h* ~! }# y/ [! M
int fd;" f; d; n# G! |5 u
unsigned short data_write = 0x5555;
- v3 f! L( ]/ d% A unsigned short data_read = 0x00;/ ^# g4 V F) N1 B& _
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
( t1 ~0 [3 d, W1 {3 q/ D. \* ] // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);8 m( j7 O. K: P
} L. ^; f, g. U if(fd < 0)
2 N& r. i: R- ]" _: L {9 R' o! O+ q6 q: K; }" o8 q
perror("open failed\n");$ b- j) s7 J9 _1 Z
return -1;2 z7 T$ Y* w$ ~
}% ~$ ^9 Z8 W1 b s: e, G" Y
7 g" u. Q' k& o+ \/ F, R6 u: F1 O: ~; Z# V
while(1)
8 ^+ `6 ]% s5 J$ P1 C: ^ {0 |& q: L9 `. P' G* x4 K; W9 F
, |$ A' {' E) X! t5 V% |6 v1 r //AMBE2000每次读写是24个字为一帧 P2 t/ [! d' n1 B: {6 [+ w
//写数据时将数据在底层存储起来,等到中断的时候再发送
: C- C" ^1 n5 F+ K //AMBE2000输入数据是以0x13EC开头的
& U4 X0 n" S* h3 h$ A write(fd,&data_write,sizeof(unsigned short));- n, A0 O5 q. e4 s6 N6 f' z
( b/ O$ ~$ N) x6 J1 `' n: l. @9 h+ A
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 # @- j9 `% d( y1 i; M5 `7 _
read(fd,&data_read,sizeof(unsigned short));
! g% M1 b# \9 U S$ H
" g" o% N2 j9 H8 a if(data_read == 0x13Ec)
; l' H. ~6 L0 _. C% } N {
3 t/ c) Z: K T( l% l
6 b3 z1 e$ }3 f5 G2 ^ b$ E- z printf("data_read = %x\n",data_read);
* L7 g$ h2 [9 E }
1 N8 k, K. E. J- F% M
& A& ^0 \5 l; N/ A2 l( [ msleep(10);
6 l7 j: z8 w% Y% s* a 5 N, M9 R2 ~3 v8 n' N4 z
/*7 ]% g" [9 D& y: c9 O2 s
ioctl(fd,1);
3 G0 k* |% O2 H" u1 s" x$ y- I sleep(1);
' y. l9 y( b1 \* J+ a ioctl(fd,0);
7 p9 v& o: g2 o* |6 T" A% w sleep(1);
& |5 ?8 ], j; M/ Z */
) O* ? y) r' t8 Y5 R# y }
# A' [2 I+ c5 x; L2 d return 0;
$ e& m& |% ]5 M" t/ X
( H0 O0 r3 q6 D* B}7 w" w0 w- F! Q+ j F: f/ `' c
* K6 |5 N/ t0 q多谢各位指教,谢谢! 急" W5 T1 b( q8 Q' Z9 Z1 t7 d
! P( V/ l9 N& q4 A$ y w4 Y6 u$ Q9 }8 r2 b1 i1 W
$ ^" t% d& O6 d6 R
( S7 N0 g% E' B+ |
4 Z3 Z$ v- f/ ` |
|