|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 R) `" V R& h! Z# M! G/*
$ S" X/ i# @) ^" T" J5 ^ * Copyright (C) 2009 Texas Instruments Inc) D* N z+ a d! Z' t: t G
*
" ], u2 _) e0 d" g+ N3 J * This program is free software; you can redistribute it and/or modify0 v/ _3 w" M. f( H! ^2 Q
* it under the terms of the GNU General Public License as published by
+ M& f" W& G: u n) i * the Free Software Foundation; either version 2 of the License, or
; q/ O ^$ r( O2 S x8 @ * (at your option)any later version.
( }1 x5 x' C6 _2 K! K, n *; Z7 t- }; w( N2 N q
* This program is distributed in the hope that it will be useful,
* o! e; w+ Q" E- X% p8 t * but WITHOUT ANY WARRANTY; without even the implied warranty of) s8 d R8 E1 d+ ^
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the X* N- {9 k1 b" V* @
* GNU General Public License for more details.
6 I$ l/ z; L0 e5 y) z( P" H *
" }% e, J6 u5 z9 [ * You should have received a copy of the GNU General Public License
" l" m! a- W% n$ M * along with this program; if not, write to the Free Software
% ?. k# b- S7 o * Foundati
3 Z" f( v5 N4 g2 }*/
+ d1 S# W6 N+ H7 f#include <linux/module.h>
5 g9 w# w6 m- R- n: ^- f# L#include <linux/init.h>
. D) ?4 L/ _& n& J#include <linux/errno.h>
0 W+ a7 _) f! x- c#include <linux/types.h>* M/ R, }: u% J
#include <linux/interrupt.h>! r/ ^0 z% z+ m$ V8 V( B* J" o3 n5 h
#include <linux/io.h>9 J) B6 u R( z; {) U9 Z
#include <linux/sysctl.h>
& I* u' w1 z' a0 V- q$ X0 b#include <linux/mm.h>
: D4 b1 b: n! V% m0 S#include <linux/delay.h>) n* y! b% L6 A! w# n! w. @$ `* c
#include<linux/kernel.h>; o9 z& b# M( | m& E! a" B
#include<linux/fs.h>. v. J2 x D0 ^
#include<linux/ioctl.h>
6 O, Y' u- K' e2 ~4 f2 O#include<linux/cdev.h>8 t7 ` C) D/ ~, J" U% Z6 t' o
#include<linux/kdev_t.h>
8 s- H+ O' Z" @#include<linux/gpio.h>7 p1 Q) u' n6 k: X0 g$ x' H
#include <mach/hardware.h># o- G- P \! o6 c4 [# v4 z, W
#include <mach/irqs.h>
# a9 ?$ G" F9 U- l& m/ T( H5 e+ L% N# t6 ]! U2 |- s* G1 ~
#include <asm/mach-types.h>( G$ z+ N, [4 [+ `- |) s
#include <asm/mach/arch.h>
; b+ H1 ]% s: B4 L* @6 A) `#include <mach/da8xx.h>% e1 ]) ]' w- d7 [% E; I% z2 F
#define SYSCFG_BASE 0x01c14000
! D. s" v8 s' G# r' l( v; \1 T#define PINMUX1_OFFSET 0x124
% F1 B/ Y( m5 p' F4 ^: C+ S) @8 G#define PINMUX18_OFFSET 0x168 ! C, R# f7 R# c5 F3 g" L
#define PINMUX19_OFFSET 0x16c
, b& b' S5 m! F% Q; C#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
/ @8 T. P' p5 g7 }#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
( t: L$ x2 B' w, a#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
" `' q: E6 k* n4 J7 e#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
" C- Q/ ~2 R @#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
l& J" A3 W: R g. ^* w, {* N, w3 }
' E3 R" C7 `4 `: P$ \7 }2 v#define DXR_ADDR 0x01D11004 //MCBSP1_DXR1 y" E; H, @7 X
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
0 p+ _8 G$ Q- O//PSC. J/ g2 z0 M$ F9 w' d1 @$ I
#define PTCMD_ADDR 0x01E27120
* K; A4 { V* S6 {2 G+ i0 y' D' t1 j#define MDCTL15_ADDR 0x01E27A3C+ @6 J7 e$ E( e$ x$ M( L
#define PDCTL1_ADDR 0x01E27304' Y7 G/ x" e7 T( p% `1 z
//GPIO8 direction$ w: l4 z c, G" c1 z& g- P( n1 }
#define GPIO8_DIRECT 0x01E260B03 s2 w" v& Z `6 _7 {6 \1 P
#define GPIO8_OUT 0x01E260B4
! _/ j% I# A- u' @ k+ w6 U0 W1 N#define GPIO8_IN 0x01E260C0
# l) j# P# H6 M/ j( L4 L& Y, i, ~* E( o% N. j
//#define MCBSP1_RINT 99
6 e P* I: k/ m( S' w4 ^/ M//#define MCBSP1_XINT 100
9 M4 `4 s+ |1 w ?- ^6 K, f9 A; m* H; ustatic int MCBSP_MAJOR=239;
+ \: I* u9 g" S3 G x8 \: T- B) istatic int MCBSP_MINOR=0;# T) `. }: q# X) @3 M
static int count =1;
; t3 S1 s" V0 F* w4 `! V6 h0 S, S# }) M6 Y: H7 p5 M6 n
#define MCBSP_NAME "MCBSP-device"" `2 o3 i z9 d5 h
e! V! R7 o! D! I; b# F- Jstatic struct cdev *mcbsp_cdev;
8 u% Z; b1 J5 x; P$ D Vstatic struct class *mcbsp_class;# M' j8 g# ^, z
static dev_t mcbsp_dev;6 |; C; g% }0 g" E3 y" Y& W) U( ^% r
unsigned int DRR_data;
& E8 K( ?/ I( D: }2 i7 g! y; ?' Zunsigned int DXR_data;. s1 [2 x+ X/ b7 I6 [6 `
static int mcbsp_open(struct inode *inode,struct file *file)% ]4 v- @3 _4 W5 o- z8 M0 U* k. V
{
p: f5 f. I& V0 o, G. _0 a$ E $ Q8 l+ F: E1 `
//interrupt enable,initialized B# {3 M/ g2 D- }8 M
unsigned int temp;
/ L* M& X: |% K9 h* b; d" x4 P //SLEEP_EN(GPIO8[10])---0
. c' y4 Y M) Z' U" _0 _' w, X) g temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
; ]- Q2 x) z* g. p/ J! s/ n# A temp=temp&(~0x00000400);* b( y. ?/ ~: \* S- Y/ H" N' y
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( u; ~5 ~7 o2 ~7 o1 Y
//RESETn(GPIO8[8])----0----14 A+ P' z6 f9 s7 H# c
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' i/ J7 Z) ^' S. g
temp=temp&(~0x00000100);
' R! f' a# Z5 P' S. T& J6 V __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 ~4 ]8 T, A8 Z2 j) Y
udelay(100);. L1 ^4 d3 G# z6 C& U/ E
temp=temp| 0x00000100;
: s# ^& ~, Y5 h! B __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ q# b8 c' y' T+ J: b% T5 H: H. V) v udelay(100);' M" g' P* t( b5 @
printk("open success!\n");2 w2 H. i$ B* }" h2 [; W6 e9 z* s
return 0;
7 X$ |, y/ }7 w# b}4 |7 K( G5 ]$ E
+ E' Y% U& z3 R; q: W i# zstatic int mcbsp_release(struct inode *inode,struct file *file)
% ]0 q3 O# A$ r; ~: ^* x{
' A6 i$ t% N$ u) P, r* y printk("release success!\n");
# K+ b; X1 [& ~1 f return 0;
; X3 h: }7 |. ^}3 m& } U1 K* B) W5 A6 t
/ x& u& N1 X$ K$ H# y3 ]4 q) H* Tstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)0 H& l$ p$ P8 a$ E. \
{
2 b4 { {4 G4 O! S1 q: k copy_from_user(&DXR_data,buf,len);
. k9 N. r0 i I" N1 p iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); # z. A* c6 r. c8 H& x
return 0;
+ W( W$ X2 ~) G {
2 G. W; c f' U6 s}
( v: s9 e" d) _0 E# {1 I8 u% N3 e9 [
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off), Z; {( c5 a! x5 X8 h' e! Z8 ?
{ 2 o) y. Q+ p6 ?: g3 U+ M3 t3 r$ G
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( V) a5 @5 l2 P! ]
copy_to_user(buf,&DRR_data,len);
( l" g) k$ g! A( P- i1 y% x W return 0;
2 V1 ^; { g% ?8 t, R1 ]0 Z4 Y2 ?}
7 b% F. i8 N& H6 a2 V( h, @
5 J. L) x) h/ y7 o) L
+ `1 E8 n+ }8 N& ]1 B+ tstatic struct file_operations mcbsp_fops=
" n3 d" W$ J! J3 j6 X6 e{
2 G1 v' g; ~4 e" o( |1 n9 x .owner=THIS_MODULE,3 u4 M- n/ {) B6 y
.open=mcbsp_open,
% w) t& G2 y; D .release=mcbsp_release,
! a: `+ a K% c& x" e- v0 G .write=mcbsp_write,
" C1 R- g7 z& {0 U+ B* r .read=mcbsp_read,+ ]1 R T3 }' t; `
};
- P$ B7 |2 w* W' d l/ fstatic int __init MCBSP_init(void)$ C4 O# v6 d H2 ]; |4 |/ B
{8 u8 O# n5 i- x+ c. |
int ret;( j0 w# x6 f: ~4 q' g& h7 P8 l
unsigned int PINMUX1_REG_old;
+ L- F) i5 z' t unsigned int PINMUX18_REG_old;
) ?* Q0 w6 n' d" ` unsigned int PINMUX19_REG_old;
- w3 b% t/ w( n: W( N7 z1 J unsigned int temp;
" S: [9 u) l0 r& e if(MCBSP_MAJOR)
$ K4 R( V+ X% {# _9 r+ K1 {6 D; x {
1 m- W# d+ n0 M mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
7 \7 N4 Z' ]( q ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
( ?2 ^, {- N1 E4 D }
; { I2 `6 }0 L& D, A else/ {% c! o) O( q6 h! l
{0 U6 K" _5 h6 @0 a* a
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);3 R/ s7 d6 u2 l/ m
MCBSP_MAJOR=MAJOR(mcbsp_dev);# ^; U+ H9 O# d' L4 l7 g1 c
}
- {3 H# N( I2 [, b& f" V
! o( T$ Q, x, K* S. Y2 z+ U if(ret<0)
4 R- h) N# C* M B$ h' U {
3 w- ~( K6 g3 t+ Y1 E printk(KERN_ERR "register chrdev fail!");
7 Y9 d* g- [9 @8 ~( [* _. t4 U return -1;
3 j, L3 W8 A0 y0 n' U }. T0 U. T! E' S& w
8 a, u, D( p% I' X$ I" N+ g# C
mcbsp_cdev=cdev_alloc();/ y: _+ Q+ L5 g) H: L: j. x8 e, t) y
- d5 f- J; v8 E; K9 O- y q
if(mcbsp_cdev!=NULL)
7 H" u' m, G3 a; ?% P5 t1 ?1 L {
3 m7 s" o& r0 X7 h' z4 B cdev_init(mcbsp_cdev,&mcbsp_fops);$ p! V# b8 B; I' n( _1 @8 Y5 l
mcbsp_cdev->ops=&mcbsp_fops;' C6 g8 c0 b# W1 O5 D+ x- Y! n
mcbsp_cdev->owner=THIS_MODULE;1 g* j2 \9 q& ]$ F: k, ^" h
- h x0 y1 i' E
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 N( E2 \9 U- k7 b) c u0 s
printk(KERN_ERR "register cdev fail!");
6 F6 S; V7 H/ c6 F% l' _9 i R else1 h% w s S9 h) u; X4 g
printk(KERN_ERR "register success!\n");
5 a# W7 `% t- f8 m4 C }
4 k1 D3 w. C5 t& ~% x" X else& I) d, m4 |3 q4 x" F) c+ c$ s
{
# t; u. _& T \ [ printk(KERN_ERR "register cdev err!");0 }/ q7 H5 P1 U0 O
return -1;5 B( a+ F7 p% n! c! N6 A: Q$ A
}
5 q- T. d) R7 N9 {6 J N0 i
5 |! R5 r* ?, P- Z* B* Z mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
1 u9 u/ G. e, E5 f if(IS_ERR(mcbsp_class))
* k$ x7 A! `9 Y W/ A/ [ {
( N& v' \/ W! ^+ @, Z, e- @ printk(KERN_ERR "register class err!");! ]4 U; `4 v$ Q1 \0 q2 d
return -1;
7 N, x& R/ ] U8 e }
: Z1 |) L {- {% x) a9 W. j' ~) }( C device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ i( O7 B% Z3 ]# {+ T) z/ }5 d, L/ d e! l& K7 J1 z: l
//PSC* C% h5 t0 W# d( T1 o, X/ ]
//add Enable MCBSP, m+ \: R$ L' v0 C. Q/ Y! d' h. E
//test8 b* n* [& B3 o5 M1 u4 X% J) \
temp = 0x80000003;: x" G& ^. t, }7 N1 ]( r+ a, i) r
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
. s$ l/ U+ C1 [1 ~% Q temp = 0x00000003;8 C. z3 m9 ]9 |' g& g% z. n
writel(temp, IO_ADDRESS(PTCMD_ADDR));0 s, P e x3 t" d; q
5 Q" k0 N" s! R5 Q, D! p3 A temp = 0x001FF201;
6 I& N$ r9 T+ f. v% `& R' Y5 k# r writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# ]% ? [+ `, F: M8 N : q$ b0 a& S' \
//PINMUX , \/ ^9 a+ I# _. T) _
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR, N3 R! v; R" {5 S7 v3 D2 _4 }
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 9 n6 v) C5 Q( f! N4 a4 V
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
# T' N' V! a: E1 w writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);& [$ e, \6 ]! H, c
3 Y' S' A# @* j8 G( \ O/ {- b
//SLEEP_EN,EPR,L138_SHK1,L138_RC, v X( P' t6 }; B
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ U2 x7 r- D4 _% |' I PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 3 j" T9 O9 H' L, L' j4 S& x
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) n5 W9 s6 _! d5 I; R: K
( P% e) R2 v# e% g+ K: }% q' V //RESETn,L138_SHK2
) F! {5 {* `( k3 w PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 G3 ^3 O' r8 q7 u& p PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
6 g5 |1 _. w2 l8 Q0 m t9 f writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);- G3 B `' I: l* V2 {1 b7 |$ E. @1 _
( u% B @( T' {, Y, b# M3 k; \
# ~7 ]4 l' T& C% ~5 r+ A8 y# Q6 S
//SPCR Register
+ J9 b3 N# g& b4 H, G w) x //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
! N" V* J2 r/ N9 b9 U& o4 F temp = 0x03000000;//(DLB=0)
+ _/ I& _7 f% F% `0 i. {5 F // temp = 0x03008000;//(DLB=1)+ R( h# J8 ~' x. j
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
# G9 }, e6 Q0 T; N temp = readl(IO_ADDRESS(SPCR_ADDR));
3 n1 P; C$ D& z& [; f6 i printk("temp=%x\n",temp);
- X$ v2 m: B; D # q1 F1 D, R5 i
//PCR Register1 A( m9 j+ [+ V* p9 Y) O7 }- Q/ f
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0 I' z# y: N, K0 j1 m6 \
// temp = 0x00000F0F;
3 O8 _2 W5 g) |6 A temp = 0x00000B0F;. \3 ]% Q/ W% t
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
$ C& y: l% |* ^. T4 y) w( C temp = readl(IO_ADDRESS(PCR_ADDR));2 r4 u3 X4 ]: B2 R
printk("temp=%x\n",temp); ' I% t' `# j, o4 {
//SRGR Register+ N( q- V4 b4 t" I. l; Q. P
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 f( c! a# c( V9 Q //temp = 0x301F000B;
7 _" k9 I, }' ~+ J( r0 ~ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized w8 a6 p1 j& V$ w4 j4 F
temp = readl(IO_ADDRESS(SRGR_ADDR));# a1 f: Q2 [( M: O
printk("temp=%x\n",temp);
; M! y+ H- ?/ t& f2 n //RCR
( \) `$ ]$ i: a% R //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,2 M, t1 A+ ~' m9 S( ]
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 s) ~3 q* n6 h9 j$ q. s% [% {
temp = 0x00440040;( K) J; N8 A) b% @
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 1 \6 n5 ^/ O, ]1 K# l4 g# z6 \- ^
temp = readl(IO_ADDRESS(RCR_ADDR));
: O* ~1 Z3 }1 K. x7 I Y. \5 O. n printk("temp=%x\n",temp);
, ?9 W/ o7 r ]& J8 y9 M/ J4 a0 Q9 D0 C //XCR) M! T3 l2 T6 Y p, g2 O
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) j+ _: s6 [5 [2 A$ _. X
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-09 g0 m! \/ }$ l: j; D2 g* d2 b1 }) _1 a3 o
temp = 0x00440040;. O' K/ x# c3 V4 I8 e* X# n; X4 T
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized + Q" D+ G0 n$ ~3 l A! F+ F
temp = readl(IO_ADDRESS(XCR_ADDR));- I3 e# R4 F; g! H5 X1 q
printk("temp=%x\n",temp);
( I: C: x7 I! s! h! m5 A udelay(100);. o: F" Y* X& Y7 H, c" T8 d( X# R
//SPCR Register# e+ w G1 X* u& ?% C2 w+ @
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-10 A- t" @6 b9 F! M2 E6 k% I6 F
temp = 0x03C10001; //DLB = 0 VS DLB = 1
9 U' [8 K5 B- D6 j- J. Q0 u writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
: f Z3 B; C+ o4 C/ A; O% [; v$ C temp = readl(IO_ADDRESS(SPCR_ADDR));
! t7 e/ m, V3 O, T printk("temp=%x\n",temp);
% b' q3 k6 i4 b" ] udelay(100);
1 t/ }# e1 m4 N' o" y$ f
) `$ }' \: y* r3 J4 k //set GPIO direction. H( l5 H0 z& j; B6 Z' K" K4 z
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));2 T W( K J' c" n' q
temp = temp | 0x00000100;//EPR----input; |% w; D- R7 r$ a( u7 W; W
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
, R. e. X1 W5 r$ T% P- u I __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
# J9 o6 f' s- l7 H: {, t
6 b) n0 P2 ?4 c: s% [- o8 }4 m return 0;
0 y- v" x' V D* @0 c}7 d# J3 Z' e$ p. F3 A: i
static void __exit MCBSP_exit(void)1 Z" j3 f) ?, C! L8 m
{" Y# E1 H' s) Z$ l. j+ T% O, M
printk("mcbsp chrdev exit!\n");
$ V1 O# V/ f) w2 z cdev_del(mcbsp_cdev);
# V+ u3 I- J, c unregister_chrdev_region(mcbsp_dev,count);+ t2 y3 C3 X, _9 l% K' Q
device_destroy(mcbsp_class,mcbsp_dev);; B4 w9 o- q+ M8 B. s+ X* {/ |
class_destroy(mcbsp_class);( u. Y$ Z# T5 W9 V' u j
}2 U8 F# O" k6 q3 f, f" k. e
module_init(MCBSP_init);
$ l8 x; Q( D. p' w- U' h+ p& C7 [8 pmodule_exit(MCBSP_exit);, \ V$ [# O2 | b4 H! M3 g( b
2 b9 b: L) D+ A7 ~2 S; Q1 K
MODULE_LICENSE("GPL");
4 q; r' L+ M0 ?% B! M& Z; X3 i+ B# _& b
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
4 c7 r- i* n: u. T# a我的应用层的测试程序如下
- d2 ]' W$ R* U, T5 i" u#include <stdio.h>
) q# q7 ~+ L; ?; y0 M. x& i#include <string.h>$ I9 Z1 `7 k( j. P1 d2 p" o
#include <fcntl.h>. U( {- L6 `9 `4 o
#include <unistd.h>
, E- U% i$ _ I% `; y# a+ E: L' j#include <signal.h>
$ |/ t5 x$ u5 n7 @/ A#include <pthread.h> //线程: L' J2 L1 N- z4 ~/ J
#include <stdlib.h>5 H. a$ [7 l% G8 k
#include <pcap.h> //捕获网口数据, ], c2 d; q& ?. d- h
#include <semaphore.h> //信号7 G* ?/ w' D4 a7 i7 |8 S
#include <sys/types.h> //消息对列
% ?: [6 P& g1 {! v7 C8 Q#include <sys/ipc.h> //消息队列5 A, f- p% g* O M0 Y$ L' B4 M' K
#include <sys/msg.h> //消息队列2 l! H: P1 i5 u2 z
#include <sys/select.h>
% q5 W6 |* H2 U5 o$ z5 W8 ` A V#include <sys/syscall.h>' y# `! f* x9 v3 J
#include <sys/stat.h>
9 Y3 ~+ y1 t; V! x#include <sys/mman.h>/ ^7 E1 q% h+ f7 T+ b5 J
#define msleep(x) usleep(1000*x)/ N. L3 `) ?1 q0 v% ^ ^
2 J3 l1 x3 j. Q/ A% p) ?" Wint main()
' w \7 t5 ^4 L3 S q* R{
( K% D3 l* A# I //MCBSP,ARM与AMBE2000交互设备
0 r0 g7 a9 }7 _4 z1 c8 p int fd;
+ n) l0 E% j0 R9 T& ]- N# z unsigned short data_write = 0x5555;
y ~& h5 ]* H B unsigned short data_read = 0x00;
4 V, Q" L# M6 D fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ k! j) j# C+ O J5 D# Z% r
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
! {5 {1 A# a/ |3 s+ Y E0 x& X- G6 v% ^+ n
if(fd < 0)2 d7 [& O% A7 B; N; V# c+ r; x
{! _2 K9 R( l! d, y5 Z
perror("open failed\n");; H. ?+ E3 ]' f
return -1;
: b/ X; b$ i/ g2 k' z; g }
0 |2 j3 u6 [" N( i, v, F. F
, x/ p7 o9 Y8 W2 X while(1)$ S; w z' c/ s0 |+ U0 B
{
" r- p( ?) f) W7 a# N& \6 U( l& Q4 Y
* f7 a: F. C4 u //AMBE2000每次读写是24个字为一帧
" g! J6 f/ E! Y6 t, q' t //写数据时将数据在底层存储起来,等到中断的时候再发送% {% f3 b ]) ?$ m( @6 N5 T
//AMBE2000输入数据是以0x13EC开头的
7 S0 P# h y" O9 \6 z+ F# p write(fd,&data_write,sizeof(unsigned short));
* w/ r" h, p% ]" Y
' g% W, l0 h3 `9 Z4 O, X //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
. b0 } h1 j2 L! o/ P' ] read(fd,&data_read,sizeof(unsigned short));
7 V% [6 U2 e" }6 A + {9 x# R0 z; o ]+ U+ J4 l
if(data_read == 0x13Ec)
, ~0 `* |4 J! x, G- z: U+ G) p {' ?, \: } `' ?# f% h0 F
4 S# U& V- s9 i6 f printf("data_read = %x\n",data_read);
- F' g; f( _ M1 N( j& ^6 I }$ `. z6 C. H( l" [, T- N, w
4 ~4 u; i& X* \3 X3 A$ f msleep(10);
7 h9 }( ^4 R! A* B5 n
. Q% V% Q1 F+ I/ [4 L7 p" M) _2 f /*: }3 i0 F9 N6 |! f
ioctl(fd,1);
8 }4 z7 T7 g6 T" q! J8 O" P5 u2 [, N sleep(1);
! ]1 a' J c8 V5 j) B ioctl(fd,0);
+ ~9 g7 g2 g5 |( V sleep(1);
5 o8 m/ ~7 t! }8 U */
7 D3 B1 T! N! j0 M" ^( ~6 L } ! H/ e1 C- @4 O7 W' Z( i
return 0;
7 `( i1 f- h0 c. |/ ?+ [ * \5 ^3 U& D! }5 ~5 O4 q5 J, }7 x
}
, d% M N B h" f4 p( W( r3 i
2 p: O9 V* {# |4 ]' R% `/ v1 n5 t多谢各位指教,谢谢! 急
( S- o i2 n( w/ b; R& j; z0 e% o2 U1 a" l) x& {
" b2 [0 e9 a1 ?) V# h, I" f* |- S; }9 R/ m: g; m
" f8 \' q7 Y3 f7 m5 Z- g# f
7 d4 Y- r9 n5 j6 k+ M, R# R) j |
|