|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; Z; O' q. Y2 Y: r( [0 E
/*8 f5 P \- z3 v* `$ y* R
* Copyright (C) 2009 Texas Instruments Inc
& w- T6 Y1 A& a: L- x: K *7 k) J1 u# G6 p4 x9 w8 f: m
* This program is free software; you can redistribute it and/or modify
- P) `/ [. S3 }" q4 T' V5 X+ S% } * it under the terms of the GNU General Public License as published by
! ~# `3 p+ X0 q9 _ * the Free Software Foundation; either version 2 of the License, or1 ~7 N/ H- L( R
* (at your option)any later version.
5 N" \3 G/ R5 z8 |1 N$ d *4 N2 ?" P2 p) k( |) T- M. o
* This program is distributed in the hope that it will be useful,
) B+ J- G4 \" a! u% p * but WITHOUT ANY WARRANTY; without even the implied warranty of7 g1 O1 d, a1 K5 w; T7 ]5 t0 K
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( h- Y' V) j5 ]$ h0 _: ?% F. `0 ] * GNU General Public License for more details.0 T$ [7 m) f' s' X; b
*& x$ E3 r* n2 F, e4 u j( X
* You should have received a copy of the GNU General Public License
4 x1 u6 I+ t3 E- v- K' g * along with this program; if not, write to the Free Software9 T- H/ E1 T5 i g: E/ h, E4 D
* Foundati/ u$ X! W( t! P3 g9 ^8 o- r
*/. u+ B X9 O: W- }6 }: X) A
#include <linux/module.h>' Y$ b6 O: J; Z* v" `6 H: N
#include <linux/init.h>! c* C' E" M6 \/ H
#include <linux/errno.h>5 A/ m' V% Y" C. p+ X7 g
#include <linux/types.h>
0 O8 d! p( { k. o2 t#include <linux/interrupt.h>
8 X& i) ]; J# _$ F, R; |#include <linux/io.h>5 u' q: k6 f( O; T% P& H
#include <linux/sysctl.h>
1 \# F m- z6 I) C#include <linux/mm.h>) Q$ Y! Y* C8 l9 f
#include <linux/delay.h>; a6 [0 w M/ ?9 e
#include<linux/kernel.h>+ }6 ^, D C/ |4 R) W' ?% Q/ M
#include<linux/fs.h>
8 P4 Z1 G( O1 Y9 [4 V#include<linux/ioctl.h>+ T& H# f) B8 w. H
#include<linux/cdev.h># k `, c: f" `
#include<linux/kdev_t.h>3 R8 k+ j6 G# I
#include<linux/gpio.h>4 e' l8 `* a1 I0 |* v9 f
#include <mach/hardware.h>
0 q4 v$ I5 l( A. l% e#include <mach/irqs.h>2 E0 I) [2 H, W: W
* R) E* s2 o; K
#include <asm/mach-types.h>6 G1 n; ?6 z6 v3 d$ J
#include <asm/mach/arch.h>
/ S) V& s( L2 o# u- D#include <mach/da8xx.h>" M0 J% H( \- a. h+ h0 `
#define SYSCFG_BASE 0x01c14000
1 Z% L9 P, ^5 n- b& H#define PINMUX1_OFFSET 0x124
* e, G7 B2 {8 l( x) J' m( X) |#define PINMUX18_OFFSET 0x168
- Y+ E$ J3 ?: P3 G4 \% @% f ^#define PINMUX19_OFFSET 0x16c- z( F( B) t8 I7 j" @" y5 c: Q
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
- ?* t' b6 s/ p* Q/ V B#define RCR_ADDR 0x01D1100C //MCBSP1_RCR. d3 p7 \ U! J5 @5 e T
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
: C& Q# n" Y' D z#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
8 [$ V! ^6 E7 g" j! d0 ~; S$ |6 S#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
# c# \+ k7 J& ?$ y2 w1 q, B* c0 ^2 N
% t4 G6 F& ?/ T& i1 L9 K" J) V#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
& g+ h+ b F# H* y) y# ?' h#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
" @$ K/ v' X3 N3 [% _//PSC
: G# G8 L4 L: d4 M: `. i2 _#define PTCMD_ADDR 0x01E27120
8 E; M* X) v$ t7 a; n+ C% Q% A' s#define MDCTL15_ADDR 0x01E27A3C3 r% x( t0 R1 _
#define PDCTL1_ADDR 0x01E27304! {6 M5 T& a$ {, F( q* F3 ?
//GPIO8 direction% [6 v1 {% a* D8 G) ^2 a, O
#define GPIO8_DIRECT 0x01E260B0
+ m2 l) ^8 ]. f3 I; D1 o#define GPIO8_OUT 0x01E260B4
' F6 e9 J# Y/ {( e* w& T#define GPIO8_IN 0x01E260C09 Z7 }8 I4 H8 s2 h2 a
/ n: E V. [8 t, Y* _' _
//#define MCBSP1_RINT 99 " T9 O+ N6 K& t+ h
//#define MCBSP1_XINT 100
5 T# |! G! H8 m! G7 Astatic int MCBSP_MAJOR=239;
' C7 v7 o* B* h" R% y* M( W2 jstatic int MCBSP_MINOR=0;0 O, S4 E; E8 P% m/ l- B$ D0 x p2 q
static int count =1;* t7 ~; i/ R8 e* Z9 K6 i
8 y+ Q" F3 n' f
#define MCBSP_NAME "MCBSP-device"
* [3 j* f. a6 V4 h+ Y, |) q# K2 S7 q
) O. N* X" r3 S; U% Vstatic struct cdev *mcbsp_cdev;
4 s& D' z7 g+ o' A6 s; q' Vstatic struct class *mcbsp_class;
* m# C3 F& q" d; B( ^1 \ ~; Pstatic dev_t mcbsp_dev;
4 ~: ^& M6 A9 i/ munsigned int DRR_data;4 k i9 d% n, N; {% R
unsigned int DXR_data;0 @1 X& a% @5 T) Q- d
static int mcbsp_open(struct inode *inode,struct file *file)7 u2 D- T3 o6 x I# O; J8 N; f
{
. w! ]( R; L' y' s+ E- J' r , b( m7 r) J T+ Q% R
//interrupt enable,initialized0 c: E% E) S/ \9 A4 u
unsigned int temp;& ~# J% P$ c" ^5 t
//SLEEP_EN(GPIO8[10])---0
& v" D1 U; i6 B- q$ d8 w; X temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, ?0 C7 v( ?- N: Q
temp=temp&(~0x00000400);
+ j0 t/ W# ]& H! C. s __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]* }( H7 b! K- D
//RESETn(GPIO8[8])----0----1
9 s/ @$ q- x. O* Z- q" H- \3 w! M temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));8 j3 h& ^( x/ h1 K4 o( e$ G7 l7 p& S/ e
temp=temp&(~0x00000100);
& y$ \6 x( g; _ F5 X T) X4 ^ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 }# `3 s% A9 l9 t8 ?
udelay(100);% Q0 s ?" B+ z) q) m) Z
temp=temp| 0x00000100;" z Y, {, a/ J L
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 H! \7 V, J( K1 |1 ~/ Y5 \" r
udelay(100);/ u& b) M, G% N! T
printk("open success!\n");
6 D4 ]. [) R5 {0 t5 _ return 0;
8 }& z& m* Q; D: V' I; N}) E! H" E1 [" q- J; C
. ^3 i$ P! V1 r
static int mcbsp_release(struct inode *inode,struct file *file)
$ D1 O& H5 e! L: F2 Y( n3 \{
* G3 d( ^- C, M' z; e9 s/ m printk("release success!\n");& D: D9 i* b4 S: U' T9 I4 F
return 0;
2 e" R/ e3 L! x}* W% ?" W8 w( `8 U& G
6 s6 a* n4 [$ ?- B7 ?static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
" \: ?4 |, S0 J2 C; T, J4 b{4 ? m8 B; ?" Y. D7 ]0 w
copy_from_user(&DXR_data,buf,len);
* g9 [8 e. C( U3 A6 T! e iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
1 s. n4 s# ~: O7 r( { return 0;! @* k9 p4 \) ], ?, p1 i; k
, N: p, p" ~/ V3 G" N$ {
}
) u% Y, q& x; c5 z
- \7 i# J( L5 o" h9 Cstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)' ]" j" ?3 R+ G( o6 ^6 @
{ # P4 x# {8 U ^( e- T$ Y
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) Q4 A" Z7 M) @5 l1 ? copy_to_user(buf,&DRR_data,len);
- L6 h, U; D9 E7 p- l0 v! b, q return 0;, z. _' Z/ A! g+ t4 z2 v9 ?
}
# G3 G; a+ @6 T
' B2 a# ]# H/ w$ e; w
& E6 a$ j* m" @ z: D6 zstatic struct file_operations mcbsp_fops=
- G; W/ u$ I b9 k! H{, `( j8 z# u0 m9 x. |' M
.owner=THIS_MODULE,
) K/ M5 {" h% ?6 H$ {3 P9 P .open=mcbsp_open,8 F* T& m& G7 N4 o; m5 B( ?; q6 {7 s7 P
.release=mcbsp_release,* c! k# K( D2 k: I* N0 { a
.write=mcbsp_write, n8 T% q/ e" C4 }% b! m( j: r' {
.read=mcbsp_read,
5 S" A, j3 H( k N. F- c/ k};/ I+ Z0 w0 X$ X& H& S! D# [* n
static int __init MCBSP_init(void)
' D n$ D: j# F. z$ s! p, ]{3 {( U: V" |( Z+ O& ^, q
int ret;; l' `8 G# i( p6 M: O1 E ?
unsigned int PINMUX1_REG_old;" {8 T: y' A3 n3 k
unsigned int PINMUX18_REG_old;: \ `6 R0 o/ M
unsigned int PINMUX19_REG_old;
1 b) ?4 R; H1 X" I8 q6 B unsigned int temp; / Q H& D; U3 v/ b4 k9 l
if(MCBSP_MAJOR)
9 v; m% x, i7 d1 N8 r7 ^7 q k {
) P& R$ d7 }" e; S+ k- ]; `' ` mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
2 O- M5 o; }5 K5 |2 k3 P ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 U, {7 `% Q8 i) b- t }
" y. r; [0 V6 v8 Q3 m( N( } else8 h2 P1 o; I8 M- R. g. i" I
{) [; u' ?) ^' ]3 M% M
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
# D. a' s* |" h7 ^- Y. L MCBSP_MAJOR=MAJOR(mcbsp_dev);
8 x _! }$ @' ]& t& C }
1 R* b# R- X9 b, l$ v + ]- p+ @" j5 X+ H8 m. j
if(ret<0)
; O% |- f) w* ?3 ]8 K5 A: B+ W {% X% c: q. l% a: ?/ Y1 P
printk(KERN_ERR "register chrdev fail!");" O) ~9 G; D, J% A: G* i0 Z
return -1;6 \* l. b& u! j+ P- S+ ?
}* M4 Z# t7 j9 s- }
8 N+ S2 N/ @5 {6 E- ?0 T
mcbsp_cdev=cdev_alloc();
~6 C g2 U& F, P " V) o) o; w+ b
if(mcbsp_cdev!=NULL)
' K0 L# P# X4 h! a1 w3 d {
4 h! u3 X; k# E; G cdev_init(mcbsp_cdev,&mcbsp_fops);0 B6 ^. m- I, G! o: R' l( e* C1 }
mcbsp_cdev->ops=&mcbsp_fops;
& B# W* {4 C! Y2 ] mcbsp_cdev->owner=THIS_MODULE;
a" C+ i' u7 ?5 E, x; M . e7 d3 o& r* [+ ]3 f1 V' Y
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), N Q1 |3 \$ v2 O/ l
printk(KERN_ERR "register cdev fail!");1 J, p' Y' t( \
else
/ d. P, y9 E, s) e$ t8 e printk(KERN_ERR "register success!\n");- U4 I; S. D( @) a3 R* _
}
3 ~0 U$ U- b1 ^) R3 G: F else
9 T# R5 G( Z; ? {
$ v5 ^3 L- X3 U) v" C' g3 u5 T z printk(KERN_ERR "register cdev err!");
7 g' p' x4 k% g, {% n& s return -1;
, \5 L# N+ D) Q: C0 x5 }; j9 c } k0 F! K& j) f( o# w
: R( p1 ? Y) s! C" H9 A! S
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
4 P8 Q" q: W7 B3 B7 c0 |8 z if(IS_ERR(mcbsp_class))1 V M* J- r$ h4 c8 x& \
{
, x% D' K3 G1 k# E+ F printk(KERN_ERR "register class err!");
) R0 S. s' X. z- h9 D' ^4 a return -1;
& w9 \& [. a5 k, e9 _ }" m' H' }/ }! }" u
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);! `' D, G1 _3 @5 Y
( J9 D5 k8 F1 Y
//PSC
# k" L% `+ e( k" {! O* U2 @ //add Enable MCBSP
+ N2 K' b9 f- Y& F0 S: T) t# Y: u2 f //test7 p6 c }* {- {; D* K% X. O
temp = 0x80000003;& ^- w. H7 v8 \/ I
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
; w2 P v u! V temp = 0x00000003;2 W: k- M* D2 r* k' _. {
writel(temp, IO_ADDRESS(PTCMD_ADDR));# p2 v! Z; G; C& Y( ]5 ?3 i! C
: I/ }2 i( C2 J0 W) j
temp = 0x001FF201;- b* [+ W9 t/ C1 u% g* ]% O$ @
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
$ i% Q. t/ B5 L! r t : }7 \1 L/ ^( k) U( I" E
//PINMUX 7 L! D4 J* i& V) f) J8 d2 \
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
2 Q6 @7 K7 k$ |4 o. [7 O, e) o PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% ]+ E% e8 Z4 \# \0 ? PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; * u y( e ^3 ]; Y& |3 R
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 T+ S1 H9 ?8 {, Z! c' O% w- G- q
3 d a6 B G9 F //SLEEP_EN,EPR,L138_SHK1,L138_RC* y7 E2 X# Z! e
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ' y/ j$ w, a7 A; W
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 3 N' m! B9 p" I d3 S
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) [4 D5 m, x, U* h" V( x% K. ?6 c
* C' f+ t5 i$ \- i9 R0 S
//RESETn,L138_SHK2
8 E+ k( u0 Y v3 \6 N( V PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 5 R7 e: s7 u8 x$ p2 @9 ^8 J# `/ a8 ^
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
5 @2 {5 K) Q* _6 J writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
2 T0 n! m \1 h- I$ j5 F
1 w! h5 j T7 K+ @# \. U4 L 5 x+ E G/ P v3 O
//SPCR Register: ^( z: T6 X; l4 D2 Q0 x' G
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset6 y6 u8 D$ `. z
temp = 0x03000000;//(DLB=0)3 Z5 l* p/ d! [6 p
// temp = 0x03008000;//(DLB=1)
8 K& w+ p& [) }- }/ N+ g' L writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset- r( m6 ^& c9 c! o7 D: y
temp = readl(IO_ADDRESS(SPCR_ADDR));
3 Y& |/ } Y1 |+ v+ h+ Z! h printk("temp=%x\n",temp);
+ Q+ b6 k, ~: n- {
& r8 @# H V: g //PCR Register
. x/ U' y; m( F+ l: ?8 p; y$ x# K //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 y$ `3 `& z$ o- p
// temp = 0x00000F0F;
( U9 \. z* x: S3 k temp = 0x00000B0F;
3 ~1 i, }0 m) I* [! R writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ) v# O3 U+ f5 E+ Z/ w: j5 S2 v
temp = readl(IO_ADDRESS(PCR_ADDR));
/ j" Y0 l9 j, O: J printk("temp=%x\n",temp);
% U# W3 ?+ t5 |* v1 w% r1 O //SRGR Register" A$ n% K" W# i; q' L
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11 P8 J4 t) X$ T9 Y1 |8 y I
//temp = 0x301F000B;
5 ]4 y# I, N# [% H* J writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
, ]( Z7 `' s6 q+ i0 \) ? temp = readl(IO_ADDRESS(SRGR_ADDR));
4 |) f9 j1 N, a) a: x( h printk("temp=%x\n",temp);
" ]7 S" H7 N( |6 M) H' O; | //RCR5 z7 B& N8 ]6 ~+ w) ^
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
; m3 s1 K& b9 V3 Y/ t5 S //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-06 P+ O" [1 G$ X& ?6 w: z
temp = 0x00440040;6 F D3 }3 H' r) U5 B
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
6 Y) n7 e# C/ F temp = readl(IO_ADDRESS(RCR_ADDR));3 w/ Q4 t- Q1 h( }& x$ j& s0 Z
printk("temp=%x\n",temp);
6 O5 m1 d! {* y% d- ? //XCR
- @" v' |# B1 {9 i7 o( X: c9 { //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1: O- m" [% V3 \, W( ~ {
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* d C0 u% `4 V1 Q& B
temp = 0x00440040;' C8 S$ d& w7 c1 n
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
, d: d/ L+ x' \0 m, |- ]7 B temp = readl(IO_ADDRESS(XCR_ADDR));! A: |0 V- m0 Z9 p8 \( q
printk("temp=%x\n",temp);
e6 w/ B. b8 |5 N' J5 T udelay(100);7 t, d# [. C/ b! j0 @' o1 U7 _
//SPCR Register
- H6 w4 l$ ?6 t8 M" D //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! Z. e: F% v; C, j% k! v) j( ~5 d
temp = 0x03C10001; //DLB = 0 VS DLB = 1# Q0 r3 _: S3 Z# F7 Z+ A
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
# A2 J$ S6 n* B0 _, Z' k temp = readl(IO_ADDRESS(SPCR_ADDR));: g! l' N- w5 X: M. Y! X# Y* Y
printk("temp=%x\n",temp);0 B8 ?3 ^: E/ d6 |- Z
udelay(100);
5 D3 L* D; D* I7 t2 D+ @6 G& {1 A& v$ K5 k
//set GPIO direction
& V( \% e8 v) K' c! Y$ \' @- ~9 } temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; G0 T! d+ C ^, ^( M; _
temp = temp | 0x00000100;//EPR----input
l; J7 j5 c+ u8 d$ k temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output4 @) i9 L6 ]4 N) g5 C
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 7 E. ?' Q9 g# i6 d) s
$ [( p, q L4 L" A' x( Q0 v& |8 M return 0;
% T/ \; S7 L; g, ~; b: ~}
2 N T- |- i+ w6 Fstatic void __exit MCBSP_exit(void)& j6 D1 _! l3 U1 p& f
{$ t0 N9 Q/ k! X5 w2 A2 G: ^
printk("mcbsp chrdev exit!\n");
4 k: k+ U. F/ d cdev_del(mcbsp_cdev);$ @2 F0 ?. B: l4 W
unregister_chrdev_region(mcbsp_dev,count);- q6 R: |( T0 `, P4 w3 A% ^
device_destroy(mcbsp_class,mcbsp_dev);
, y# A8 L* p u class_destroy(mcbsp_class);4 y& D d" o' X
}
( G8 Y0 I+ k) ]; K7 T1 L! f) Mmodule_init(MCBSP_init);
6 z c8 h$ n( r0 V, T0 wmodule_exit(MCBSP_exit); ^, `2 B# {( z5 P7 F
6 e3 ~) L' I4 GMODULE_LICENSE("GPL");
9 g. H9 g# r5 z, Q. @
& b6 A2 D9 g! c+ h2 f; l我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 p( w% I1 R2 H我的应用层的测试程序如下
2 Z5 z$ o+ E/ Q1 O: w3 g* }#include <stdio.h>. g0 r; }& ? [/ K4 R0 Z! I
#include <string.h>: p& x$ s& U* q6 z; B7 y
#include <fcntl.h>
5 g& B$ g2 h" T' U! Y9 z6 B9 {#include <unistd.h>4 P! {) P! C% R! h' o% f4 X0 c
#include <signal.h>$ m) E: \# s* e! J: z
#include <pthread.h> //线程$ H8 J; Z0 P- B. I% O9 R
#include <stdlib.h>
+ ?9 X5 Z' x9 z, v3 r. E, d#include <pcap.h> //捕获网口数据3 P) P y: _ T) o. d3 j* F0 C
#include <semaphore.h> //信号* f% i) a% ?; b% ~
#include <sys/types.h> //消息对列
- W- D% k4 |, i9 M5 O8 o# ^+ j#include <sys/ipc.h> //消息队列1 H/ ]3 j% {, k! g
#include <sys/msg.h> //消息队列
f* Q4 v/ P" K# U. Q; T B+ w1 E# n$ i#include <sys/select.h>
" D$ t7 G3 Z/ w6 v#include <sys/syscall.h>
; r0 t& R J: \( }, K* e#include <sys/stat.h>& V: c. \+ r9 d! t0 `9 b8 ~" P
#include <sys/mman.h>4 b) t, a3 n, e+ k; d
#define msleep(x) usleep(1000*x)& l& u7 H: w7 C2 G8 C! C
5 q$ S8 k0 K/ ]; H6 l& K
int main()3 y$ H8 T" _* H7 C
{ ; v' C1 H1 j# |4 O9 \
//MCBSP,ARM与AMBE2000交互设备" `+ W9 `( f; {5 q, m5 M9 O6 g7 t u
int fd;
$ ~; I7 M7 }4 l unsigned short data_write = 0x5555;3 Z9 V( Y2 G6 R3 w# I# g `
unsigned short data_read = 0x00;; Y1 T" }4 N" z1 e( s/ |" v
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, ]1 S t5 e$ `0 R# L
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);0 Y; G9 E$ q' b# x- S+ f2 y& y
1 y) r. ^4 f% H+ b: f8 \
if(fd < 0)
& ~* i2 t$ E: |3 l {
! b/ E7 b9 G& d2 q, ^ perror("open failed\n");2 S% p. d! ], c) o: {/ r$ M
return -1;
& X8 X- s; m3 K8 J4 i }
8 G3 f3 a5 g2 m' a& E
. @' m* s. X9 O8 M while(1) H; v2 O, Q5 t9 Z& L. t# R
{
" P; G* J+ u' ?# D0 [ 3 N/ \2 _! h3 i$ y& G% R h
//AMBE2000每次读写是24个字为一帧, m2 n1 C8 a- P: U% P! T8 w
//写数据时将数据在底层存储起来,等到中断的时候再发送
/ h/ Y" y x% r! e) m //AMBE2000输入数据是以0x13EC开头的; l8 L0 w# k! y: c& k7 H7 g! v
write(fd,&data_write,sizeof(unsigned short));
- E& s1 K; e( V4 k! j5 T1 ]+ ]- k % X# M# W3 b8 z$ E8 B3 A6 _: `
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 5 L1 }- |/ z/ {' f! W6 O. t+ _+ p
read(fd,&data_read,sizeof(unsigned short));
, L& @1 |: f* i# J9 Z4 t% c 7 M: G& x) @+ P# D, E/ J2 o
if(data_read == 0x13Ec). }: h0 b( h& W
{
% E9 h: F" y2 i: z8 I' p 1 C! o2 o2 i/ ^/ m3 _# z. U
printf("data_read = %x\n",data_read);% f3 X. i0 s7 z, r
}
2 O: T6 p1 ^" F& C
8 x' ~6 R, H k! l) A* M msleep(10);/ E) x4 F( [' B: y5 T5 ~0 U5 {+ \
; g7 o/ p1 ^, s+ N+ _2 o, _
/*- u f+ b! P! o- D
ioctl(fd,1); . }) g3 f, ]% x
sleep(1);1 f2 o1 w0 x( W% T* ~: W& |
ioctl(fd,0);2 Q. z7 o. M. i( [1 c% F/ ^/ Y8 }/ G
sleep(1);
" u2 @) }! u+ ]" _) J; e */ 8 s6 T2 P# Y. y
} " ]$ Z0 p/ J) X" ^+ E: X
return 0;
* m0 t1 A, B/ ]- ]% y* u3 n 8 s+ \7 N* ] e" v2 X
}
1 V+ c, k' f* n5 U* ~9 \) @! x/ N) t1 ]& ^/ f* J7 L
多谢各位指教,谢谢! 急
$ `" J- a3 ~/ L# F" p. Y) @+ P4 v- h2 K6 y
" r2 l9 e- a+ G6 K, a" t
( t% ^8 [, ]2 c+ I; j& a! g; ^5 Y
+ V/ {6 a1 T- d; B2 U( y4 g/ Z
|
|