|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: * I/ X; I+ F2 J6 B7 ]
/*1 ~9 }; }( k# r Q% i
* Copyright (C) 2009 Texas Instruments Inc
- s) W) H! N3 e1 @# O7 E B *
$ Y4 n2 |6 p0 X0 L) Y- `8 p * This program is free software; you can redistribute it and/or modify7 u, Y0 W# }/ @! @! s' F
* it under the terms of the GNU General Public License as published by
1 }( e: R+ W+ M0 w y * the Free Software Foundation; either version 2 of the License, or
0 N, x/ k, [" {5 z * (at your option)any later version.% G. h9 h: U% N3 r6 @
*9 d" i5 Q7 n% u* L
* This program is distributed in the hope that it will be useful,6 i7 c+ e4 A ]0 r
* but WITHOUT ANY WARRANTY; without even the implied warranty of
5 A B" [ q, n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0 R' ]* n' o- t0 {8 \$ { * GNU General Public License for more details.& c) e1 F+ u+ B: `0 ]' \1 n4 P) N
*
: ? }1 X6 \: \+ X" ]7 F# ~ * You should have received a copy of the GNU General Public License
# c+ D# c5 z+ E# O * along with this program; if not, write to the Free Software M% N% c# E# J
* Foundati2 U1 w8 b' s9 {! M
*/
: F8 N: B- v5 n: z; z#include <linux/module.h>
3 x8 M i2 \9 Q& ?5 M5 P6 @#include <linux/init.h>
8 Z( V& g6 `- h9 P#include <linux/errno.h>
9 A5 [8 I* |/ H) P4 N#include <linux/types.h>
' t/ q9 s7 P/ V2 q( c2 N#include <linux/interrupt.h>) J {2 g7 T g
#include <linux/io.h>1 y$ x( Z/ K( E. m, I' X+ j' d; {
#include <linux/sysctl.h>
5 E/ `: i. l i9 l$ @% M1 h& g9 `3 B* d#include <linux/mm.h>
1 E$ } U( z, E; Z7 Z#include <linux/delay.h>4 `( [# z5 f# j0 r0 _5 O/ d
#include<linux/kernel.h>" s9 k9 d8 d2 C4 ]1 t1 ~1 [
#include<linux/fs.h>( I0 @7 Y1 y6 R2 V6 j
#include<linux/ioctl.h>
- ]& e: [4 K" g3 L+ r#include<linux/cdev.h>0 u y8 p8 Z: e
#include<linux/kdev_t.h>
. @& g% R; v1 y3 K# d3 O#include<linux/gpio.h>
. ^, l" u j+ J3 V& D#include <mach/hardware.h>
' F0 y3 g& n4 ?/ N$ K/ d: K' {#include <mach/irqs.h>2 }* I2 s4 H9 N7 D( k; c- V/ L
0 Y3 {0 P! b3 A" ^#include <asm/mach-types.h>
# l! c. G6 N' q8 |( p6 N4 Q#include <asm/mach/arch.h>
0 q8 R! O5 T/ U E( f" j#include <mach/da8xx.h>
5 ]* w+ j4 C0 @# Z0 R2 o#define SYSCFG_BASE 0x01c14000" f4 d$ U i B. b
#define PINMUX1_OFFSET 0x124 ) n/ j! H, R$ @6 e6 q2 l
#define PINMUX18_OFFSET 0x168 ) y) b& Z7 Q0 d6 F
#define PINMUX19_OFFSET 0x16c% ~0 n* R: f. y8 I- X) m
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
0 G7 w. V1 k) g# J. {$ d# x+ ?#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
: ? p0 {, c# |' u$ x#define XCR_ADDR 0x01D11010 //MCBSP1_XCR" D1 b6 H( b1 M$ b6 | S' [ G
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR d2 C7 `5 G& F/ T* `- r3 I* O j
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR) _1 [+ R3 y& G( I3 ] K
: ~ @# {9 ^& o3 H: \#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
8 a/ t& }& Y( X% ]' w5 Q$ ?7 y, Z' p. H#define DRR_ADDR 0x01D11000 //MCBSP1_DRR) a' n# `9 W6 n" W
//PSC
5 v' ^# o3 E8 p0 p9 j#define PTCMD_ADDR 0x01E27120 " M5 B% w Y2 m& n3 R
#define MDCTL15_ADDR 0x01E27A3C
" B/ ?2 y. u1 D& K#define PDCTL1_ADDR 0x01E27304
# Q0 P( }3 S; J3 H% L//GPIO8 direction
# u/ ]: B5 x2 |$ T# V#define GPIO8_DIRECT 0x01E260B0
# p* S1 v* [* r6 I/ Y- N#define GPIO8_OUT 0x01E260B43 t3 I+ O! I( f: A6 R
#define GPIO8_IN 0x01E260C0
/ V9 ^6 A- F+ ~2 A& Y# j3 A/ h# e5 M! F& v" ] q% ^
//#define MCBSP1_RINT 99 & t2 a1 b* Y) L; z6 C( j) y( p
//#define MCBSP1_XINT 100
- i. ~. O( X0 q2 W8 `static int MCBSP_MAJOR=239;+ C4 k1 s, N# I' H% W& Q
static int MCBSP_MINOR=0;
* ]1 V( M, x( B3 |2 E6 _) lstatic int count =1;
) N( g2 h$ N: d; g! _
- ?, E% f" u# }' w* k( P#define MCBSP_NAME "MCBSP-device"
+ Y4 O3 e9 o9 o2 t( {; g3 U- P# z6 R
static struct cdev *mcbsp_cdev;
3 O e# R% Q( o7 _static struct class *mcbsp_class;
2 Z# \0 N; `. cstatic dev_t mcbsp_dev;
* s+ Q8 m; g5 B7 }9 Junsigned int DRR_data;
3 p2 q z: k6 q& d! A& Eunsigned int DXR_data;
2 p) p) H- \9 O$ A: wstatic int mcbsp_open(struct inode *inode,struct file *file)5 {. K& i$ E! w; N8 t e6 N+ g
{( v% k2 S U$ b/ {* ~
1 p3 b& p# X' f6 e; E: W
//interrupt enable,initialized
. I Z- A% E9 R( V" A/ P8 @ unsigned int temp;4 d! y5 x4 O3 L( Q: ]
//SLEEP_EN(GPIO8[10])---0
, o5 l6 \" }5 i temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ U& A3 m# i4 H5 L% b3 r8 s temp=temp&(~0x00000400);
# Z H3 I, Y5 v2 B3 z/ S2 E4 R. x9 t __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10], G* u0 Y# F# K+ v. x
//RESETn(GPIO8[8])----0----1# }. k( ~' o' m5 d/ s/ ?. L
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
D( Y8 T, l9 p2 a: Z/ X temp=temp&(~0x00000100);
4 O8 I: c2 s* k5 ~0 ^) i __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 Y- d) ~% V! P3 \8 D udelay(100);
) l, w, W2 T9 e% D' R; X temp=temp| 0x00000100;' c7 v' |. x# m
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ }4 D; Z3 [, |8 w* S udelay(100);, K" b! k& U" u
printk("open success!\n");" u8 B' I9 s9 G8 G+ ?% D. f
return 0;5 j) n& @# r- `2 c$ x7 e' b
}
{) S$ |7 H0 r: k* }* ~0 _' ]9 V( I( n# k" M9 B
static int mcbsp_release(struct inode *inode,struct file *file)
( |0 L1 P. ~: U1 q- f{
; [4 B/ l5 ?. ^/ {4 U8 Y printk("release success!\n");
8 h" D6 l# k( F: } return 0;
( [8 q4 c' k! q/ f0 S}* T6 h! J1 }5 _! W5 ]& ~0 W" D/ Z3 O
: e- C* K E9 R b3 X1 [4 R0 Kstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 T' r* c) e. N% Q g4 _& x& K, @{3 L8 {4 V1 w3 f& n9 G
copy_from_user(&DXR_data,buf,len);) _; m: F4 p. k
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 3 Q3 ^ P6 [" K' m
return 0;1 G/ v; Q* h; F- s& i( r* J
9 r5 h; H0 D4 Y( d% Z& }! A) \, D}2 w; I0 Y, s3 H+ W$ j4 i9 f+ m* J
/ e) }7 R" |0 C% o- B! P/ ~) Vstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
5 O5 ~% b+ ~ |6 W) m* ^" Q{
. Z! {6 B' B* U% _1 E6 E DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));; V& K( }1 L+ k$ r/ {/ t% Z# V
copy_to_user(buf,&DRR_data,len); % D- T) A/ B4 _- @+ @7 @. t& Y
return 0;" X+ B2 `3 Z4 _9 {1 R* Y+ Z0 T
}
5 J, n) b) M5 n* P
2 p- m* Q' {2 d! k+ r4 j: M2 ]
' z: G3 G7 b1 @static struct file_operations mcbsp_fops=
4 B5 \6 Y7 I/ S{5 j' l& `; {' S2 ^- k1 m: ]9 J
.owner=THIS_MODULE,) I# K$ [! z1 L% {) A3 Q) b& u3 m* u
.open=mcbsp_open,
G2 }8 T7 U: k1 ?. ` .release=mcbsp_release,
( L, b3 G+ B% Q [ .write=mcbsp_write,
$ J/ _: b, o4 u, G4 o2 k/ ^, Q .read=mcbsp_read,
1 M1 T8 h$ g7 R0 Y};' O% j, K7 B9 L! S8 E
static int __init MCBSP_init(void); r- R' `% y; P% p7 B; ^
{
7 o. h7 C+ S- c5 O |% L int ret;
. Q8 R* e8 y7 p( y& { unsigned int PINMUX1_REG_old;7 \$ f+ g: T. `! s; w4 \$ _8 D
unsigned int PINMUX18_REG_old;
: f0 [( c+ H4 X) E" W unsigned int PINMUX19_REG_old;8 ]% Q2 ]9 y' u% P6 Q
unsigned int temp; 0 ]( O( M" h, h1 l5 j
if(MCBSP_MAJOR)- P9 a, S0 @* d v2 b
{
: Q, R: T. y U' j0 @+ T7 V) ^) [ mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
9 y7 k" Z4 Z* p9 h! Q! v$ g ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);, O: ?) m7 U; a6 V c) Q: ?8 Y+ T1 E
}
' ]! f5 h/ H' o8 J' X' A* \6 a else" Q- r' t/ g- P. \! i: H
{8 B9 d, a" `4 U$ y# t4 b$ S6 y
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME); h2 J2 v1 ~" Y9 Y
MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 e" T. j/ v1 I( E: ` }6 }' |4 R8 ]" S7 Z! s: n
2 A) |" t; f% c: c! X1 O" { if(ret<0)# ]; w8 i$ p, d# X$ G
{5 O3 J, j; k+ |0 k: [) V1 C$ P Y8 V
printk(KERN_ERR "register chrdev fail!");
5 O' v) j# |' s: q( c/ Z Y9 \ return -1;
/ n, _. a+ I9 G8 [ }/ c$ b- S; C! t
3 O6 d3 |& ~% x, T- K4 F
mcbsp_cdev=cdev_alloc();9 s3 ]+ W- h# h4 Y. h# S
. ~4 }" b2 ?/ C% `# G, ?+ ^: |
if(mcbsp_cdev!=NULL)! H9 y: z! e C
{
6 V7 g, v- e0 V8 T9 _* k cdev_init(mcbsp_cdev,&mcbsp_fops);* g* J: |8 S& y$ {6 c: ~% B/ ?+ O
mcbsp_cdev->ops=&mcbsp_fops;4 L8 }* S% p ^2 w# [7 c
mcbsp_cdev->owner=THIS_MODULE;
& S: |( L# r" `. H' z
6 [ k0 D$ Z& r L- `) R1 b) O if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% v; c/ a' J' b( m! u k
printk(KERN_ERR "register cdev fail!");
# B2 e5 B% L! @- M else+ N' ]. ~( _. k/ X" x
printk(KERN_ERR "register success!\n");
( w6 G( _4 O8 b3 E0 `5 y' ]; @' g" I }1 G5 W& h; ^% g7 B0 }9 S' g
else0 t. G7 k" e# @4 v
{
! V8 J m4 Z; m printk(KERN_ERR "register cdev err!");4 j( k. z2 U' \$ s: @$ w
return -1;# I: D1 f# U; ^6 p- A' X
}4 a: J$ [* x! B" i- D: n
+ U) g5 R# e+ R0 [' Y) v7 j mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);- S9 m8 A/ M X) l5 V" ~4 g7 W! Y8 A
if(IS_ERR(mcbsp_class))
0 M/ Q0 h6 b( a/ X/ ^7 R {0 n. ^2 d d6 f* ]4 b) U
printk(KERN_ERR "register class err!");
& O K# s$ o: n6 L8 \/ P return -1;
% b" O0 Q8 R, u9 M2 s8 t3 w( g* Z5 H" K. G }) e% b2 L2 Q9 L+ `( x k
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);6 j2 ]* l3 {; i0 w. C
6 j( w- b! H7 t3 `( I- }% m- k //PSC8 G2 [: P1 y' d
//add Enable MCBSP
! A' T }* o2 L2 S$ u7 t ` //test0 W' G3 F5 I) x' g, X! ?1 c
temp = 0x80000003;$ O+ j. E+ V! W8 R+ r! S
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& {/ {+ N2 ^9 S. k- F! X8 e6 y% \ temp = 0x00000003;2 E! A& c f% Y# u
writel(temp, IO_ADDRESS(PTCMD_ADDR));! Q8 {( W8 i2 E, k8 [
/ c5 K: u" q3 y) x# N temp = 0x001FF201;
7 q) }0 |2 c9 p- ^" d7 x5 x writel(temp, IO_ADDRESS(PDCTL1_ADDR));
: m: q6 \) \4 A , q& q0 U( @# ]3 Q8 l+ e
//PINMUX * ` p0 c+ y, i& b; U/ p2 |
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
1 f Y' e. }2 [: F- c) s2 { o# ~, K2 B PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 0 u- Y% ]+ O, [2 i6 n
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
3 P6 O9 n* }3 ] n: l writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* l0 A5 b) J; G( C$ R# K- o$ E
5 j+ }& v7 l( ^ E! j4 {- H //SLEEP_EN,EPR,L138_SHK1,L138_RC2 j f+ k; W4 v0 y% b2 k; m/ i
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 7 M7 A# N$ d1 ~! k
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
% c6 p" A$ U7 y2 t9 r* w; m writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 I& ?3 z7 V+ h9 }# t- U
) b! B/ d; X5 t; }; V4 S' T //RESETn,L138_SHK2# T3 T9 D) N0 u9 s# e# x! u! {
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 5 ?) @6 X/ b4 W( W3 c7 `/ o$ j
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; - |9 ]1 t9 C5 r+ i
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; ]! h& @; ~) ?1 ]
6 u, D' J8 c: X9 t5 j
5 _! h, }( Y. M0 }2 Z1 O ?0 ?# g$ U% t //SPCR Register
, |( p/ k0 i# X; X) ]) V //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 s" S" V3 R; e/ Y* E temp = 0x03000000;//(DLB=0)
' [" u0 `' T- w% ` // temp = 0x03008000;//(DLB=1)& e4 z5 h- i# Z* y# n& O
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
; }, W1 _7 a J; y: b9 H3 |* F, h temp = readl(IO_ADDRESS(SPCR_ADDR));6 w6 \1 X4 b& v+ a; ]
printk("temp=%x\n",temp);
- p6 M. e$ n) ]2 d+ V 2 t6 C/ b( X" v) N2 J, I
//PCR Register
- @& h8 D# O: ~8 v9 y$ v //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ a" `3 ^5 y' I) g% f
// temp = 0x00000F0F;( ?% m/ g0 q& F- L6 C
temp = 0x00000B0F;0 y& L9 m/ \- \" B' K
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized % w8 g2 P! I( T s1 ^# t
temp = readl(IO_ADDRESS(PCR_ADDR));6 s! r9 L# U% w$ c I
printk("temp=%x\n",temp);
) Z, F) [) ]. V! w$ r: \" W8 u //SRGR Register
3 o& t0 U, K' v4 ]: E //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. k" }9 o% X/ `7 e* }) Z' P& q- { //temp = 0x301F000B;
8 [9 A1 U5 Z; j: S- x8 ^7 e! T, A; h5 m writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 2 k$ h: b: p; u1 i7 p" w! L$ F
temp = readl(IO_ADDRESS(SRGR_ADDR));
- i, F/ l1 s0 U, D% m" y printk("temp=%x\n",temp);
" Y R* S5 ]% K+ v/ } //RCR
2 d2 C4 `* {: A/ R( E, q M //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,9 D' p% }& ^1 Y7 W" x0 C
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" J: {% }" s' b& E! R" I9 I g
temp = 0x00440040;
# `0 \3 X( Z# J+ u% k% O2 m writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
2 E# `- a# H _4 @; W, j. a* U temp = readl(IO_ADDRESS(RCR_ADDR));1 b) Y# c/ C* C3 x0 B
printk("temp=%x\n",temp);8 n- w; _$ q2 f" O( f
//XCR1 {: T0 F/ r6 r
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
. D6 |, J6 y( H1 e //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 t. H/ ~0 D- z/ X0 {5 b* k2 Y8 J# }
temp = 0x00440040;, W6 b Y O6 y. B2 E% C
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized $ q9 H; i, P: k+ G& d. x
temp = readl(IO_ADDRESS(XCR_ADDR));$ ^' f5 @. \6 c
printk("temp=%x\n",temp);
& V6 x$ `, K9 H+ W6 j2 z6 O udelay(100);
1 W" J* g' \/ n; W: ] //SPCR Register+ ?( z) c) J# W& |$ \
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
9 K* [, v. d. C2 m) B4 z( Z6 u temp = 0x03C10001; //DLB = 0 VS DLB = 1
2 m9 } k. n) r, }. s writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled/ B0 H6 a1 c7 m" X
temp = readl(IO_ADDRESS(SPCR_ADDR));
2 K0 ]4 \3 d2 p/ @, r printk("temp=%x\n",temp);6 R- W! L6 B% E" g* J, z9 |8 j* A
udelay(100);
7 u, ^: L2 r% H6 [) Q
6 G1 p1 f# v6 C% R/ e8 R8 _3 u //set GPIO direction% ]' I. e8 P" D$ @1 n
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 M( n) w5 Z4 a% v
temp = temp | 0x00000100;//EPR----input
( K5 N- ?$ k0 _! k$ z- r& K9 A temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 k# |. s% R, N$ O' \
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
. _- u" g7 c; d& a, N+ y4 E
; m- M( }: u- a) p return 0;
L1 q! a" _* V0 y Y$ b# A+ u}% v3 w8 b% J: D: v6 e! F0 d
static void __exit MCBSP_exit(void)/ N' U" ~" h; n) _& Q9 g
{2 C. j8 Q0 Y4 a" ?/ h, p
printk("mcbsp chrdev exit!\n");: E1 F9 l4 N. h) V6 X6 W0 m
cdev_del(mcbsp_cdev);+ w; z7 X- z. b- z4 c
unregister_chrdev_region(mcbsp_dev,count);
* D9 p4 h1 L5 k device_destroy(mcbsp_class,mcbsp_dev);
6 m B! R% b- L9 P( E. J7 X) h class_destroy(mcbsp_class);
2 N" z; Y! G* G' }}
9 m5 l" c' t% T/ o3 _7 {; Gmodule_init(MCBSP_init);
) W- P4 @; X: C% [' V2 e0 A5 s. w2 Imodule_exit(MCBSP_exit);1 i5 _+ }/ v# Z5 Y+ d% f
! U) e N- `: ^: R: C& v/ L; ]( \& u
MODULE_LICENSE("GPL");+ y% D, M$ W" F M4 K
6 d* Z" E' ^, U5 W" p" b# v
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。, r3 s) Z9 n9 X1 ^' Y# p, d
我的应用层的测试程序如下, t: H" N J3 Q7 |- w" b+ `& y
#include <stdio.h>
: J; g9 j3 P: k) r) @' N9 Y#include <string.h>/ Q5 f3 ~7 _7 s0 t5 v! ]9 U, ~% c# v
#include <fcntl.h>
1 y# _! f( b9 L: L: w& @2 Y5 [#include <unistd.h>
. d9 ^9 C1 f& Y#include <signal.h>$ ^7 w. V" X L5 P
#include <pthread.h> //线程
- A0 b/ l! g; Q1 [#include <stdlib.h>
% U) l* t4 I" |/ L# Q# S! ] W' V#include <pcap.h> //捕获网口数据
8 m) ~/ |4 U5 y. O k. w#include <semaphore.h> //信号 R# P" W/ l- n3 t
#include <sys/types.h> //消息对列
& B7 r, M6 X2 J, E- O- i#include <sys/ipc.h> //消息队列
' m6 m2 F: N6 p9 ]7 ?#include <sys/msg.h> //消息队列
- A1 L% @; p# r#include <sys/select.h>
* B' G& _1 c' a# U#include <sys/syscall.h>
* W* k, b& ^- r3 S. k#include <sys/stat.h>
6 ^+ ^! Y9 U {3 E; p* Q2 R#include <sys/mman.h>
9 c1 d5 M" Z% L#define msleep(x) usleep(1000*x)6 U: P5 @0 j0 G4 f
2 }$ v+ u. e( Q) V2 O* `! Uint main()+ N) v2 A1 @1 Z6 t5 I j# X, c/ z
{ 1 C' A5 j3 _' r B9 g
//MCBSP,ARM与AMBE2000交互设备
- X6 I3 g2 Q0 ` E8 s7 W- f int fd;" _* r. {# ~4 C/ w! i% n
unsigned short data_write = 0x5555;7 T; T1 T1 {4 {! Z% q. R
unsigned short data_read = 0x00;
% Z( u2 Q0 D/ B. D8 b fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ T7 V' R- W) d
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);3 M$ p1 h( p8 Y2 a0 s& x8 n$ b. s
. W) r9 w1 L- [; V0 O if(fd < 0)8 X/ a9 {( ]3 @3 c/ C
{5 Q+ t% l2 g: p- L! r$ s: ?9 A0 ~
perror("open failed\n");
0 T' j: o' Q# X return -1;
# k* x+ X, G+ Z }7 ?2 c2 c& h( T
3 k* C0 D+ Y6 t' y8 D' J0 x
while(1)
. e9 H/ f* J9 i! U3 u1 P* |' B {/ M1 X0 {8 Y1 x! y2 G+ A
7 F7 X5 O" _9 A& I7 ?' f //AMBE2000每次读写是24个字为一帧
! _3 l1 U! ~. Y# r. y% D //写数据时将数据在底层存储起来,等到中断的时候再发送
% \9 l4 Q1 o$ s% S" X* h //AMBE2000输入数据是以0x13EC开头的
; G* ]9 Z( Y/ q# r write(fd,&data_write,sizeof(unsigned short));' D, I# w% M. m {9 [5 ~
$ d* k1 |4 t" O! y( M" }) R //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 1 m' \9 w- l- k, z8 H5 b& O
read(fd,&data_read,sizeof(unsigned short));
% ?' G8 r. k X8 j9 ]0 M" x
* W% j2 E( v. B; { if(data_read == 0x13Ec)0 _9 L5 f# C1 n2 ?2 a: B
{
+ m: Z0 ]) Q( w+ m
' \) w/ h3 E3 |* I2 j2 v4 c printf("data_read = %x\n",data_read);
; E5 v1 t' _4 X% y- x4 Y4 I }
3 h' f7 M z. A! i 7 \7 h8 N4 M& Y1 U0 W2 ?1 l
msleep(10);
, j8 L' I& q8 |) u$ i
$ H+ n! U& S5 m1 d% |9 T1 D /*
* r3 U4 r/ b4 l* T$ R ioctl(fd,1); 3 G0 z$ a1 | M. q
sleep(1);: p6 e! Q) T* p
ioctl(fd,0);
' d7 ?8 {. \6 r- b6 X' m sleep(1);
+ v6 y7 Z' @% U" \ */
. |2 p% h7 `+ G- V1 \; [! O } 2 \) o: }. D& t8 l8 B$ T
return 0;$ z$ G3 K% l5 \3 {$ k
' L4 e' \3 P, N# o G6 C
}
0 V/ L3 D3 l2 s3 {$ }4 H& S I( ^' R6 m E, I2 ?3 Y8 X5 H
多谢各位指教,谢谢! 急
# S- r3 D2 @' {
}1 ?& u3 ^1 s& s7 X2 |7 {, E0 c0 J I7 `: U' N$ W& q1 N9 N+ L
' u" b2 i9 Z4 `: M; E$ E
" w2 X; J3 _# v5 ~
" f2 \: {+ Z8 ]5 u, @+ W# a
|
|