|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ! H/ W: E1 l; l! P4 H L
/*- F5 ~& J4 c7 `
* Copyright (C) 2009 Texas Instruments Inc( Q' n" A5 c/ [0 U3 C( w
*
% X, g6 ^! N- i/ N * This program is free software; you can redistribute it and/or modify
* F8 ]8 c0 X4 ] * it under the terms of the GNU General Public License as published by
: b' e9 y' F3 J: f5 g * the Free Software Foundation; either version 2 of the License, or
- L, a' [1 U- I) w1 E8 k * (at your option)any later version., k* c0 W$ E% p9 E0 |
*0 Y$ E7 d; \& [+ ^. x* b3 f7 U
* This program is distributed in the hope that it will be useful,2 u- H- N5 I- a
* but WITHOUT ANY WARRANTY; without even the implied warranty of
2 n. v& @2 p X G+ D, ?; i: O * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! i* G1 J, G9 x* [4 Y1 r; T' ? * GNU General Public License for more details.
; V4 e2 Z9 h, J! b6 f *; L5 H0 L6 o$ _
* You should have received a copy of the GNU General Public License2 X& ?6 D' f0 W2 O" Q
* along with this program; if not, write to the Free Software
% e/ }: U: ]0 h' P6 H * Foundati+ X/ I6 k2 }+ Z
*/, J r L9 j8 z9 I2 L1 m; W
#include <linux/module.h>8 J0 |! u f; K6 I
#include <linux/init.h>
' Q1 P% d2 \; `/ g" l; n#include <linux/errno.h>
. e. J% M+ f& J$ S: `#include <linux/types.h>
3 U7 Y; f/ A: D. ]#include <linux/interrupt.h>- T4 ^* G# U# {8 q% Y9 ]
#include <linux/io.h>. d ?) \5 ~4 y6 @1 s- `
#include <linux/sysctl.h>
- Q8 w5 c) o U, \! N" T#include <linux/mm.h>
Z- ^: g. N0 b' g#include <linux/delay.h>
: z4 v: t0 f# Z9 u. ?#include<linux/kernel.h>. T3 D& A* C& T8 i1 X
#include<linux/fs.h>+ |( n9 P1 w" ?0 h3 U
#include<linux/ioctl.h>
* p. F" G, i R# f, i D#include<linux/cdev.h>; E. r' A3 ^5 R6 C j5 u9 S
#include<linux/kdev_t.h>' \5 Z. }# e5 N/ C
#include<linux/gpio.h>. h8 b2 o `2 s2 v
#include <mach/hardware.h>
2 N; ^9 B! Y+ \) J#include <mach/irqs.h>3 s; O- q" H- z/ q7 j/ N* G$ n
2 Q. c# N/ o1 t9 g2 F2 K# X+ D: @
#include <asm/mach-types.h>
. p" @4 g4 c' k% B; T9 ]! }#include <asm/mach/arch.h>: E& L$ b; g8 O4 V5 p
#include <mach/da8xx.h>1 _3 I! n7 ?3 ]& O4 s7 `9 s# q
#define SYSCFG_BASE 0x01c14000, f4 ~- `$ s9 x3 a1 j+ R- n
#define PINMUX1_OFFSET 0x124
0 J+ S m$ G* B, {. S# q8 K#define PINMUX18_OFFSET 0x168 ( ~! p5 r) v/ `- s& C- d8 e4 Y
#define PINMUX19_OFFSET 0x16c
( O. f4 `* N3 Y* N n" M#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
& b7 I, R8 ^8 R: N#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
5 l9 Y6 J: D6 L& q3 M9 s. a( f3 _#define XCR_ADDR 0x01D11010 //MCBSP1_XCR! H8 K2 m( r4 U) C, C! q
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
; H+ u; b# S9 U. N#define PCR_ADDR 0x01D11024 //MCBSP1_PCR. h+ v0 E/ ^+ ?) ^; S. s
& [3 P( }* {' Z5 @7 i#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
6 A6 d; |; c: l5 H#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
4 j% |5 Q0 D5 L/ v) U9 \; B//PSC
1 M& g' _& ^8 \$ J0 r+ ~/ a( o#define PTCMD_ADDR 0x01E27120
# z0 l- r3 B; t$ M3 v' Q$ h( m#define MDCTL15_ADDR 0x01E27A3C
' ~/ t0 v' D) R# \- k1 G e+ c#define PDCTL1_ADDR 0x01E27304& X: U, a- `0 B3 D
//GPIO8 direction
9 V3 V# M8 ^; g& O. K D9 u#define GPIO8_DIRECT 0x01E260B0
5 ^: r. d" ^! h#define GPIO8_OUT 0x01E260B4
' y5 J) U$ T/ Z" i/ [#define GPIO8_IN 0x01E260C0& h! | d) ~6 h3 y5 F
8 q9 r4 k7 g7 ^5 w7 N9 [# y//#define MCBSP1_RINT 99 ; G2 e0 F0 H: v2 G- B x: p
//#define MCBSP1_XINT 100 9 ~) V% a" E/ n8 f1 }1 l
static int MCBSP_MAJOR=239;: z4 y+ v9 Z* n: |
static int MCBSP_MINOR=0;
7 h) q: o; P. ~6 Istatic int count =1;0 X; |) M: x7 u, e
: |: p( T: p+ T$ z8 q6 T#define MCBSP_NAME "MCBSP-device"
# _2 ?5 { N! `4 H
: Z# E. f! Q: S( l. v9 @' [static struct cdev *mcbsp_cdev;
0 F j; T; _6 ~static struct class *mcbsp_class;4 x; X, N$ Z4 n, I9 {0 k2 D h
static dev_t mcbsp_dev;
- G% v9 h; v, g$ y$ |unsigned int DRR_data;8 a1 c# w D3 E; g" G
unsigned int DXR_data;+ p! E: o' Q6 X$ X, y0 e
static int mcbsp_open(struct inode *inode,struct file *file)
% a( e5 v3 i: V/ [ f{
2 ^0 z. @: ]& g+ i- b5 X
9 i7 a3 a& l6 j6 ]2 p. D2 V //interrupt enable,initialized& e1 Q7 x/ R$ X5 V d* l& Z5 U
unsigned int temp;0 A) m0 U h$ S9 c8 p& Q, j( F
//SLEEP_EN(GPIO8[10])---0
- A" } s3 P% ~ F2 N temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 f( r" N2 C# H6 k5 A s; { temp=temp&(~0x00000400);
& |- a0 R: H. I/ N8 L& z# A __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
4 E# g/ B: ~. D& ?+ { //RESETn(GPIO8[8])----0----1
1 R+ m, h6 B. U1 I% Y0 \ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ o& t+ f- m& h- V6 {2 ?& O
temp=temp&(~0x00000100);
1 T$ E9 L a4 B __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 u5 w; R1 D2 W+ M/ ?' g3 A udelay(100);
4 R0 K; `; Q# b8 V' q% I temp=temp| 0x00000100;
( f( Y) G3 s$ Y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1' |2 L# ?" Z; L3 a
udelay(100);) O6 p5 R* o0 K+ r" _
printk("open success!\n");* f2 f9 T/ P* o: L' A: R' w
return 0;/ n( l( G& Q) }- x; v
}5 Y5 B* t4 @4 E% [
- p7 V( z% B/ f4 B+ X
static int mcbsp_release(struct inode *inode,struct file *file)
3 M( P/ @8 S8 P# U* P v{
6 r" }0 E" v/ V' b) v; A( {" l; ]( d printk("release success!\n");
& }% a7 |7 b- j+ k+ n return 0;3 ^) @# x3 e& }' R6 K( Y
}
3 p- Q5 q( l* u% _
5 b& o8 p2 C7 t* d5 U7 R7 lstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 `5 { M6 N- l) v3 W{
2 d) Z( \# A6 h2 F: b9 {3 ` copy_from_user(&DXR_data,buf,len);
3 Y7 L, l" T' `; B ]! B iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
' L0 W5 k2 `5 X5 Z4 ~ return 0;
3 Y5 I. ~, M+ [" @1 s5 N3 e- p% J ; a$ ]) V/ `8 }# K5 Y
}
. J. R8 W8 Q. L) E, m
# ?2 Y/ M: l7 ?static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 ^) q5 G: ^7 X. F+ g5 v
{ # i( ? j. T4 f+ Q; J' {
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
1 O7 _( r6 n x, d: o" G copy_to_user(buf,&DRR_data,len); 2 S/ `3 F1 d! C8 I) j' R5 A- Y
return 0;
! U7 [( q$ B& W7 m$ d}) i( p V6 w) d/ H
: X/ m: L r) u2 S5 E4 o; r* h( ^% r6 `3 Y4 E |. n o
static struct file_operations mcbsp_fops=
9 q, O0 f0 N0 Q5 x8 P0 ^0 j{) A3 T: K; X5 T( D
.owner=THIS_MODULE,: _. B0 B; L$ h, O# G& F
.open=mcbsp_open,
1 b1 T: t, O& Z# L4 E6 V .release=mcbsp_release,& k/ e& ^ W4 N. ]% q
.write=mcbsp_write,
' [* W4 D+ d8 {" z0 f1 U .read=mcbsp_read,1 ]1 w- L/ U, |! d; z
};
) R" Z: d7 b E8 _3 ^5 U- y) {static int __init MCBSP_init(void)+ d8 k( Q. J$ l+ y* C+ l
{% f8 h+ q; @7 {4 v; l) G& a* {
int ret;3 W2 L$ [4 X# {' e
unsigned int PINMUX1_REG_old;
" k( D% H/ S, y3 _/ ? unsigned int PINMUX18_REG_old;# E3 s3 F3 v( N3 S, n' s
unsigned int PINMUX19_REG_old;
6 Z5 \7 F0 o, l$ A3 ]8 e unsigned int temp; ' ~) u' A K# R6 e0 I* ^
if(MCBSP_MAJOR)
% N5 K6 E: S0 p2 j) w- e* _ {1 R* S0 j. u# a3 u$ U
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);* M2 [* ? v$ b) l$ V! w
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! [ a1 R# O# E( @ k# ]
}
/ v0 J# D7 G$ ?, E+ W5 o. y0 P: P else
; a. B" w% x1 o5 O( Q# O {: E( U9 @% i9 G: y2 c9 v, s+ G
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
, l9 d) y* Q7 r% h" J MCBSP_MAJOR=MAJOR(mcbsp_dev);' |3 c' Q& e# t
}' E7 b4 K: C9 J# c9 N- y
& k( T, c' e+ H# E0 P! } if(ret<0)
4 N" y6 f6 M# i5 u3 k, F {( N" A- g0 R) z- x! R
printk(KERN_ERR "register chrdev fail!");4 X) v! x/ T' g2 ]
return -1;
, }$ c. S: U' s0 Q, y$ j' N& @ }. R d1 E: D$ i- R
3 I% d$ O5 m) P4 ]1 I mcbsp_cdev=cdev_alloc();
, Y9 F9 M5 i2 c% i1 }) C7 B1 u+ y
- K! T6 m m, o8 s: Z4 H, k if(mcbsp_cdev!=NULL)# S8 Z: N% n- P2 p' ?! [
{
+ c+ \2 ~' ^2 N4 w cdev_init(mcbsp_cdev,&mcbsp_fops);
6 |7 `2 j. w& H" l mcbsp_cdev->ops=&mcbsp_fops;2 w/ `, `. f/ F4 N0 e
mcbsp_cdev->owner=THIS_MODULE;
: `& ` ?: i; O& J4 @ B# u j
. ]) u" S; a' n' l- I! b8 o" ]& } if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
% x5 r+ S6 O# A+ {/ E printk(KERN_ERR "register cdev fail!");$ U5 P. r d' N* w+ `
else; O* z, I+ m& D& w& @4 m
printk(KERN_ERR "register success!\n");
0 ?' X: {, g4 `+ ^" ]- l! L }$ N0 c% C* }4 A$ L/ v; d% e, s
else
8 ]8 I7 j) T9 [2 A/ N t6 f/ T" S {7 D( h# {. R' f
printk(KERN_ERR "register cdev err!");: @) `2 i; W8 ^: N9 {
return -1;( \ R. n- _' d3 o4 u d$ F
}
- }* ]& u" @) t- K- ~1 Y% ~ `4 w
/ ?) m/ |% g$ g mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 {% |8 S c) K if(IS_ERR(mcbsp_class))7 I1 ~3 B) p4 @% i" Y) @* g) V
{3 b% I. Y9 b8 L+ F" D
printk(KERN_ERR "register class err!");$ I* H# e; B5 p; L. [' A; j5 [/ h
return -1;+ t- k% x2 b8 Y2 V
}" R( S& r2 J& G! @# u
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);$ i- U$ ^% I2 S$ Z9 ]0 v
- v2 a. |" W( s5 R, \ //PSC
1 l- h9 D6 z- U+ J0 G2 l& S! r //add Enable MCBSP. b" A6 s3 d: E1 W/ F6 v
//test6 Y' Y" o" t) b1 z
temp = 0x80000003;
$ i# @. D8 |# a D# a writel(temp, IO_ADDRESS(MDCTL15_ADDR));# `; `8 v8 |/ J9 }# f
temp = 0x00000003;
4 Y) ^ [' @1 v$ b& x% r writel(temp, IO_ADDRESS(PTCMD_ADDR));/ a N! C7 {! Y* P
4 V) l9 F/ j4 J4 ]& o6 T" N temp = 0x001FF201;8 o2 G9 ?7 I- |
writel(temp, IO_ADDRESS(PDCTL1_ADDR));" S }7 ^ @* n) J1 w( O
% L$ \1 r3 \5 J+ E8 ^7 D
//PINMUX
5 J" C E1 S- k$ t: m //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,! K0 N+ s; U8 ?6 e
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 5 p. I/ W! t9 {% t) R" [: I: k( S
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ) B" n5 k7 a% A8 }4 {/ |
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
' D9 `& F6 A; F; \( u8 C 5 x5 w! Q+ D; `4 o( m! G6 i
//SLEEP_EN,EPR,L138_SHK1,L138_RC
3 s$ g+ ~, v+ m PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); + ]& b/ x# E4 z# u: U, f
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; : E* p" l7 ?! ]- p; d4 m* X3 E& J9 R4 x( W
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);! k0 G; {& u% L5 y: ~9 s
, F) g' m! j# j2 v9 b4 A+ f+ H4 ]; N //RESETn,L138_SHK2& L- \$ ]" ^9 ~. |% ?0 C2 G8 l
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ! z8 J2 h" Q4 a j I5 Z1 l% h, x
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 3 R$ s! L1 r0 z( I1 j8 _
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);2 w5 l5 C. F; E" M+ g9 m1 |
5 o B! A" O, W2 Y 7 o! X# }- \) s& n' ~
//SPCR Register+ M F- U! |6 G8 ~& i; v
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
{9 F4 [+ M3 I2 v( H5 e temp = 0x03000000;//(DLB=0)0 q9 K; B C4 R- H# ]
// temp = 0x03008000;//(DLB=1)# E# S% ]$ i& K
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset* [- X+ ~+ X7 K4 _6 t
temp = readl(IO_ADDRESS(SPCR_ADDR)); w- O( C. p, \; p, X' B7 p7 n# Z4 o
printk("temp=%x\n",temp);* u1 h# ?7 {6 Z& M, {3 }! _
6 g) @$ `7 L; l: v: m& { //PCR Register
. P& O7 j" F6 E- V: }* G5 }5 E //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
3 U+ w- g9 g* ?* E* {) p8 _4 \ // temp = 0x00000F0F;
. m8 H3 F4 e3 z& D. \3 y- _ temp = 0x00000B0F;2 u+ M$ ]5 y6 R4 f2 G( P0 @6 d
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
, [: |" B% [ [: G! o temp = readl(IO_ADDRESS(PCR_ADDR));1 u& h6 T9 F6 b2 ~5 i1 z
printk("temp=%x\n",temp); 0 A# Z& s7 \. [5 E- L0 z2 o' W4 A
//SRGR Register
( s6 v: b9 n5 `9 j //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
7 Z, _% V: | ^9 F& _& ] //temp = 0x301F000B;; {- d6 P2 } L: |- d) [' O
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ) T; p4 L9 ?- h D* d- \3 x
temp = readl(IO_ADDRESS(SRGR_ADDR));% Q2 d P; e( ]/ y0 w: X2 b
printk("temp=%x\n",temp);/ Z6 B! ~ x0 T( v& {- i
//RCR' b. F2 q' e0 d4 t7 S9 I+ p x
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! G) \8 b8 x& S$ W$ Q# U% w. X/ M6 `) q
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0# J# j+ Q8 I: p% M
temp = 0x00440040;4 h8 \5 `7 p* b# h! E$ r Q
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized / R6 G. B2 _2 _6 O# \
temp = readl(IO_ADDRESS(RCR_ADDR));3 v- f+ W4 w, A. v; i. h! T
printk("temp=%x\n",temp);
! B; P; E3 x2 Z Y //XCR
+ }. R) k1 w4 T //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1* x! {, w* @; t& K4 b6 h1 h
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
4 k) T' S& k5 v$ d2 {& k' C temp = 0x00440040;5 t* j) w& d$ W4 X# s# e1 q
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized . I3 C; T5 c" N0 f9 D c5 q
temp = readl(IO_ADDRESS(XCR_ADDR));. u1 k' e. B- g. Q* P
printk("temp=%x\n",temp);& d* C* |* w c' |; U& W/ ]
udelay(100);
' Z- _& q( g5 _3 r; i8 ` //SPCR Register. R: P$ w7 R5 \9 g* f; A t
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
+ L' n5 o' v2 U# Y. n temp = 0x03C10001; //DLB = 0 VS DLB = 1( X/ Y4 z" \8 r2 ] m+ X6 a- G
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
7 Y8 n* j1 M' f2 i2 Y3 ?% s) [0 c temp = readl(IO_ADDRESS(SPCR_ADDR));
+ ~ N9 a Y" E) V printk("temp=%x\n",temp);
6 M6 p* c( F8 S" K6 m( H0 u" a5 Z udelay(100);
) _5 i! k: v/ Y- E
1 ?3 U$ v& }' [2 q //set GPIO direction/ i8 ?8 b" e3 r4 l
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
9 I0 m6 h" J4 \0 N' C5 ~0 Q- C temp = temp | 0x00000100;//EPR----input9 A8 U6 C( X6 k. X
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output6 t; ? |* G# I) b/ l' ^
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
& J3 q8 _0 A, h7 U4 ?- v
, ]6 ~; q$ X* L' E% I& T, r! ^ return 0;
$ q5 p: d& s( U) u6 o5 V}, N7 {( w$ i1 z- B) Z
static void __exit MCBSP_exit(void)( |& t0 `: L- k9 x6 B
{
( r- L: x+ r* h" A printk("mcbsp chrdev exit!\n");
6 y3 h6 C! {8 Z- d$ @' W cdev_del(mcbsp_cdev);
+ }1 B' G4 o+ G: i4 [$ s! m# U unregister_chrdev_region(mcbsp_dev,count);
6 V1 n; E1 V. }; `( g, R+ `* Z7 H: m$ e device_destroy(mcbsp_class,mcbsp_dev);
* {0 a C1 E8 [; O class_destroy(mcbsp_class);
, `* b( s/ o5 F6 ?}) b) t! p4 v/ B0 {% e6 @
module_init(MCBSP_init);
4 h; p4 x9 e6 _$ s$ Bmodule_exit(MCBSP_exit);- ?( n* g7 R: V4 _( |1 N, f
) w: y m4 c: U" z$ L" A$ y |$ RMODULE_LICENSE("GPL");
* t1 r5 y; L {) V7 |8 G$ j% y* o& f. b
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。7 u+ O8 Q( a$ }0 P% k
我的应用层的测试程序如下9 h. `# S h7 y2 J. r, E# v! m
#include <stdio.h>
4 V7 C2 ^5 f3 Z; ^) d#include <string.h>
/ q* H3 Q8 ^( k" o7 f2 j#include <fcntl.h>/ K# C, x/ i) o' u
#include <unistd.h>- X6 x4 K2 k( P9 |6 @, Y
#include <signal.h>
6 C% c4 z! {5 {; P/ R#include <pthread.h> //线程( f7 ?) R( b, ^5 _2 k1 m
#include <stdlib.h>
* c5 k) S# ^4 `8 {5 }; X. ~#include <pcap.h> //捕获网口数据5 e$ Z( f0 o( A7 k/ L: ?
#include <semaphore.h> //信号# J% r k" A! Q" P& O
#include <sys/types.h> //消息对列+ `0 k6 L5 E+ t' o- F
#include <sys/ipc.h> //消息队列
8 _) ]+ n0 Z+ c#include <sys/msg.h> //消息队列
2 K# ?/ j5 |# G: R4 h' D#include <sys/select.h>
$ Z# n. C8 |6 N/ v4 y8 h% \#include <sys/syscall.h>
6 V0 o1 S7 M9 X a% o0 r#include <sys/stat.h>
8 w* L! P9 I1 j5 q- Q#include <sys/mman.h>! V7 [7 n/ u2 h3 J
#define msleep(x) usleep(1000*x)2 O* ]( w8 z1 {& p: S, T
. R' W6 g7 `9 O$ ~: d' S( M
int main()$ h# }3 b4 {+ a+ x$ |# {/ x8 O6 h# ~
{
0 w0 \1 L, G/ i0 g! E! \ //MCBSP,ARM与AMBE2000交互设备
- A, V7 ?& x( ~" p R6 Y2 U int fd;( t: k- u+ Q2 J/ c
unsigned short data_write = 0x5555;/ Z( [' W; R) f, f. z
unsigned short data_read = 0x00;8 M) ]3 h- B5 Q7 Q
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! |# u- C4 F" m/ h& J
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
& N I b& }0 G9 l) U3 c5 v. Q" t( L
; c' [- z4 u* X. f: N- d" E1 i if(fd < 0)
! P% J, O. M% F3 V: _- V* k {, y- v3 B& y/ }( E
perror("open failed\n");. e) M O D9 t- |. Q. |
return -1;- F3 {7 a2 n! ^+ U7 B, }# V4 L/ v
}+ e I: m9 F$ \
3 ]; u, d" D3 y) ?! K; V3 g# t while(1)3 g: H- [; J3 j. f, p! e
{; j" r6 _/ P( F9 l- D9 d& _
! r7 h# g/ r2 X3 ? //AMBE2000每次读写是24个字为一帧" _& l9 f8 n( U9 E* ?& }( K6 z( f: w
//写数据时将数据在底层存储起来,等到中断的时候再发送
{$ X( E$ q+ @ //AMBE2000输入数据是以0x13EC开头的
8 y- G3 \' q( L0 N) V! M write(fd,&data_write,sizeof(unsigned short));
' G7 ?* i/ d7 h( j9 b
! E, q7 S) k; v# q //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ; S+ i! d5 K q& x# D% @1 {# ^
read(fd,&data_read,sizeof(unsigned short));
g. {$ y& X6 C/ y5 c/ b
# `& G6 ?' B) B, w+ \' M1 Z if(data_read == 0x13Ec)+ ?3 ^ u7 R# l5 e; I9 t- ~- r$ e! }
{
+ _9 O7 e e% e' B4 c& a# e. [' W4 l. W : Y# E- U% G5 O8 w
printf("data_read = %x\n",data_read);' I9 C( v4 }5 `$ W; a
}# T X2 ~) a, u! E( t7 [8 A; w! [
( w I1 G& b: b
msleep(10);
1 X g+ Q/ H( c' |6 R
1 D/ A+ R6 l- g$ L' ?' w5 b) b, |% S /*
u( G6 Z( B. \( v; s ioctl(fd,1);
$ z/ l) V; p% q9 {# h6 T8 v sleep(1);
# [+ ^9 I* @4 v1 b" J% f ioctl(fd,0);
/ r% r L* k5 ]" Z sleep(1);
: Q6 k! p' i5 U& T; l( D */ 5 M. M9 B& j" k4 ]# m
}
& i0 F' d" v: U+ Q/ ]) A- K# U return 0;/ G% k9 ^5 Y2 u1 Z4 e
@. {" {" ~- e! I}
* i! K. Z0 C. a' G- e, _; _* A; `, k: Y% [2 }6 g
多谢各位指教,谢谢! 急
6 w3 N9 d. G0 y8 y, |( u
* Y4 g/ m" H( h; A, f+ ]- X3 g7 \! H0 K: \" c7 w8 Q
4 S8 H: w3 Y; S ~# n1 z
( r J, q- ^0 c4 G6 m. w
5 F& S6 X- l/ t* t Z |
|