|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: & K+ X- u6 t: Q' n' N
/*
8 e; ~2 H5 c& `9 D2 P * Copyright (C) 2009 Texas Instruments Inc
8 m3 c7 W/ n G/ a1 A2 m *
. |4 c! b" F2 _, @- w * This program is free software; you can redistribute it and/or modify
" T1 r; Z& g; }" B# o" F0 [4 p: @5 g * it under the terms of the GNU General Public License as published by8 J; m% ~/ _# M K/ f3 b3 s; h
* the Free Software Foundation; either version 2 of the License, or
2 i, t0 \- [' P- F' w * (at your option)any later version.
! b2 q# A( n+ ] *
$ E! i. ~2 j6 Q0 K * This program is distributed in the hope that it will be useful,
8 F, t; S7 K1 G" f# K6 p% t0 Y7 c * but WITHOUT ANY WARRANTY; without even the implied warranty of
) _) g+ S! `/ s9 Y$ {4 @* B# V * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
& b: X' c" m6 a * GNU General Public License for more details.
* v; F2 q4 L5 A* E$ P( K9 k *
' f+ e. D" F* ?! b0 N * You should have received a copy of the GNU General Public License6 z1 F- o1 i3 Y7 r; b
* along with this program; if not, write to the Free Software
7 H% y" k' u; N7 H. a * Foundati, r: q. S; |# I$ u& \
*// e* f4 J- j6 v4 i; b3 M9 }: O
#include <linux/module.h>
- f8 o; e8 ?/ \% r4 j#include <linux/init.h>/ ]0 h) U# N3 Y1 j' _6 f& n# g
#include <linux/errno.h>
3 U4 \/ R$ Q9 e& |4 X7 L; L0 q8 H#include <linux/types.h> w! U9 \: N2 f5 Y8 x9 _# ]
#include <linux/interrupt.h>& V c( z% }5 h/ {! C
#include <linux/io.h>
9 V, M: Q% D4 T0 ~) f% K#include <linux/sysctl.h>- R3 R5 W3 s0 O! T. W
#include <linux/mm.h>
! W1 ?/ A% e7 T; E% C" P4 K3 M#include <linux/delay.h>
: n0 Z0 I, o0 V" G% V+ t7 j! \#include<linux/kernel.h>4 J' l& [1 M' f9 T' w' G4 W' g
#include<linux/fs.h>
& X- n3 G4 ]1 q4 M2 l3 q. ]#include<linux/ioctl.h>
3 B+ R; z8 }# t7 L, Z( r4 |#include<linux/cdev.h>
' P" H; [8 G: w9 ?0 {' W9 O0 F7 V#include<linux/kdev_t.h>
/ L. S4 U" p, x- _: N. o( A( F#include<linux/gpio.h>" M) n9 m; ~* O& x7 F
#include <mach/hardware.h>
$ Q8 t" H s5 L#include <mach/irqs.h>. j9 }/ X9 t$ B% ]5 o4 D
3 e7 T& j, U0 Q7 U- @( N
#include <asm/mach-types.h>% J+ L( _2 z4 w6 Q& M, E9 z- p7 S
#include <asm/mach/arch.h>- Z& _ T' u# D6 F! _' l
#include <mach/da8xx.h>
! a$ ~( g+ O3 f I+ y$ K& X& p* C" w#define SYSCFG_BASE 0x01c14000
0 C, E' R% h* O#define PINMUX1_OFFSET 0x124
4 x( {( ^% C g; l2 g#define PINMUX18_OFFSET 0x168 9 B- N" y! A7 R" n( M9 ?
#define PINMUX19_OFFSET 0x16c* d% x* H2 S" F7 A4 f+ T8 K
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR6 V* Y/ V+ p- V: E% z9 ]( c
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
; |/ z5 s8 Y4 K* U9 B3 e% `' H+ s#define XCR_ADDR 0x01D11010 //MCBSP1_XCR$ n. a; Z: B' i! m' T- w6 v
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR! y+ |4 r T, q( J
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
2 [$ a5 R* h; D; z' J 3 i) ~% l7 x! R2 ~( K" Y
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR0 ]7 m% G) l! N: x0 _( f
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
- Q- i4 T$ Q% g2 ^& n6 u//PSC
) R9 l. ~3 _# Y W: {3 l/ }#define PTCMD_ADDR 0x01E27120 1 \) g6 x6 l1 O
#define MDCTL15_ADDR 0x01E27A3C3 ~/ z( b5 ~0 a
#define PDCTL1_ADDR 0x01E273043 {. y3 n; [7 x7 B, O" X8 x* S
//GPIO8 direction
1 k4 \( L5 q% x#define GPIO8_DIRECT 0x01E260B0
7 [6 @+ ^# ~, A, D9 {" n x* i#define GPIO8_OUT 0x01E260B4$ J p& o: p6 m1 w" E8 R: O
#define GPIO8_IN 0x01E260C0 Q# _0 A( e+ k
7 ]+ a ?, @ c//#define MCBSP1_RINT 99
, [ ]/ t( _ j2 ^4 P8 W//#define MCBSP1_XINT 100
1 H3 N) a+ ~4 n6 k( I' mstatic int MCBSP_MAJOR=239;: r, g& i5 r1 H$ J
static int MCBSP_MINOR=0;
4 U) C( m: [& r/ a+ t0 `static int count =1;
0 u: ^8 y$ C7 k: l3 V3 f
5 D: K k/ l+ Y! H#define MCBSP_NAME "MCBSP-device"
n, c3 c; J1 D L6 R a
7 w& C' H1 m1 I' c. i/ _& o, d" E0 \static struct cdev *mcbsp_cdev;
( z8 K" C7 \( R- pstatic struct class *mcbsp_class;
5 K% g$ n' \9 S2 n4 ~static dev_t mcbsp_dev;/ f6 ]$ p' l6 h) [, b: G
unsigned int DRR_data;
6 |0 w8 U/ b% c7 B0 R! xunsigned int DXR_data;
% G+ w3 Q3 b5 Z9 Sstatic int mcbsp_open(struct inode *inode,struct file *file)
, ?3 I' b; y( }* z: S2 ^{! w! E% J( K( e6 T. f
: K! f- F6 T& h5 i8 o) k' O; W) q1 r //interrupt enable,initialized3 ~1 E2 t2 m; p: P" W6 ~
unsigned int temp;# k3 M P, v0 ^) S" H3 h* E% | h, F
//SLEEP_EN(GPIO8[10])---0
* g: Z# A. R- g, n( L temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! ]6 B, x6 }! t y# u, t; f% m8 `
temp=temp&(~0x00000400);8 C7 ?( o4 d% N/ R1 h- i
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]! O6 _9 ^9 E7 F& N8 ^! |0 x
//RESETn(GPIO8[8])----0----11 M( M3 r# Y- s8 u U& ^( p8 Q
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 H5 o5 B8 V4 O# a% Q: n% i; ~, r temp=temp&(~0x00000100);
. B0 U3 |0 u- [8 [ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 r8 A0 `6 {* y9 f8 _* J
udelay(100);
# X9 V4 Z+ \. \& ~( a1 K temp=temp| 0x00000100;
$ F4 l' X) z& ?1 y& l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& ?2 x1 f' m# z+ ] udelay(100);
$ g4 {: w% t* z+ m printk("open success!\n");
4 J8 P% |7 }6 @1 O: N return 0;' \- N* {! F1 H D
}. q* d, A$ y# ?8 @% d8 k0 e( x8 V
" O$ w$ G- S& M
static int mcbsp_release(struct inode *inode,struct file *file)8 O) B$ q8 B f( w3 {; n, P8 o
{* l6 y( h0 i& h, ?
printk("release success!\n");
* D8 [- _3 L% [7 T w' T M! \: \ return 0;1 O3 l7 c+ X: k8 A' I
}" w6 e) {5 }' p+ e
: q G$ G9 e$ n2 A$ g( e! F% B9 ^static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
) N) t& `1 }5 |& }{
O4 L/ n$ k3 m6 k8 t/ I! c" j% W copy_from_user(&DXR_data,buf,len);6 `3 E1 O8 t" V' P! Y" M; Y$ g
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
5 x; T1 y3 q# A& }7 h return 0;7 g3 X# O; V) U' D
4 i N `, j, e! j3 z; Z; U8 m
}
( n1 J2 Z7 m3 A7 B9 y; N6 ~5 \- L+ u G0 ` c* d* I; x
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 E: h! C+ t. {2 A( U o. J+ A
{
8 E. J) \5 M; u DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));& G2 `: u# I* _# c+ C
copy_to_user(buf,&DRR_data,len); ' L5 e, t) @3 ?
return 0;
4 k3 j4 G8 m. R! j" I) f}( d6 E# Q0 W/ [3 H2 G& R1 X; \
% \# Y' H: S# @
! x3 v/ `' ~) Ostatic struct file_operations mcbsp_fops=
' X$ e! \8 D, @4 p1 _{$ {+ D& O" e8 X4 S/ [
.owner=THIS_MODULE,8 N/ w0 \$ h9 p( z" r1 ^2 n3 x
.open=mcbsp_open,% F8 |6 ?( ?" x( B. h
.release=mcbsp_release, a" b6 R' O4 y, v9 Q( Z9 u8 L
.write=mcbsp_write,9 |/ F) a! _& L: \9 b/ W2 U- l
.read=mcbsp_read,
2 L2 D2 ^! X4 O5 C0 U. W7 ~};
' e2 } e$ R- g' l$ rstatic int __init MCBSP_init(void)$ }' }$ K* H4 U: n# K$ S* a
{: g& h& Q' s2 @
int ret;' l+ M4 y& m f4 X8 G0 }
unsigned int PINMUX1_REG_old;3 s" H1 b/ B4 L1 F3 P# }
unsigned int PINMUX18_REG_old;8 x' U X. S, O. S, l; f7 ^- J
unsigned int PINMUX19_REG_old;7 X/ \1 J7 v/ U5 L. w0 _
unsigned int temp;
9 u. ]" u9 k/ x$ C& R p if(MCBSP_MAJOR)
5 {% ^$ Y7 b# j( @* e {$ } H, B, z* s& B
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);" Y. S7 k# q3 K7 d+ w4 n( a
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 r- A; e" E P
}: t. G1 H4 G: {8 W
else
4 x3 C9 {( [" `7 p; w* q {
R" [; }* T( C. y: w& G ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
, S8 ^3 W: {6 ~1 O1 d MCBSP_MAJOR=MAJOR(mcbsp_dev);9 g& [0 R0 B* [
}
; Y5 A# P6 _ ]- B3 M; P4 v$ h ! g3 H8 X5 K; G* s
if(ret<0)
- i4 Y4 m; }) Q7 c+ ]3 ?' `9 t/ o {8 y' q3 |" p% M& l+ ~8 l8 F6 o& l
printk(KERN_ERR "register chrdev fail!");
( w7 n: q) r5 j6 v( y5 A return -1;
1 N- U: |! A6 R5 |1 z% P9 V; ~6 } }/ t( ~( w7 G0 y
% d E2 `) F t& \ mcbsp_cdev=cdev_alloc();
+ [( L" c9 A' b* a
( l$ }. x+ _- h3 g if(mcbsp_cdev!=NULL)) k4 P5 m, ~4 L% D' Q" g' n
{7 `' D( N( x2 u% H
cdev_init(mcbsp_cdev,&mcbsp_fops);- f0 C+ r1 p1 S8 ?; |; Y$ e
mcbsp_cdev->ops=&mcbsp_fops;
. ?" H( x) r2 x4 M" X' Z$ X" | mcbsp_cdev->owner=THIS_MODULE;* ]- o$ X! `7 p) ~3 ?
: d$ D6 e- F; c, C% w if(cdev_add(mcbsp_cdev,mcbsp_dev,count))* [! e4 _( W+ z$ O* B
printk(KERN_ERR "register cdev fail!");
8 M% b) y- ^* x- C0 `$ I else( I( J. e$ ~' J0 [3 P9 S! F
printk(KERN_ERR "register success!\n");
4 u+ X; Z0 \ B8 r9 } }& \# l- i s0 ]9 f' N( m% v* K
else
8 w4 O/ V# Z: `- Y7 s3 s {& x$ ] i5 j5 x9 U$ n
printk(KERN_ERR "register cdev err!");
- n6 D. r; G3 G# ^, h. E: T% Z! Y return -1;
$ C2 C) s7 Y; E3 |( ^1 q2 J }9 X. g! ]* z1 q
' z/ [2 r+ c$ X- R: y6 b* Y( r mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- J/ u- K. n P I if(IS_ERR(mcbsp_class))
$ [7 p8 V& @ b {
6 L( o( P* ]8 U3 \* A3 ~# J printk(KERN_ERR "register class err!");. B8 a( d$ i! @- H: C
return -1;: x( m5 ]' E% o T0 ?& w. _/ e
}5 ^$ |& H% J/ C5 Z$ E9 |
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);# a# |0 \, U2 R! u4 D7 [
# Q0 W. R! q6 z. z6 k //PSC
) `4 _. G& H# F //add Enable MCBSP& _9 ^! ?* m7 L* A
//test& d. X; |6 K0 F. @
temp = 0x80000003;% X# H3 |4 z3 b
writel(temp, IO_ADDRESS(MDCTL15_ADDR)); Y% u7 z/ S# D2 I- |3 ^6 t3 r
temp = 0x00000003;' o' q' I6 l8 Y' x. d* E
writel(temp, IO_ADDRESS(PTCMD_ADDR));
- i' T6 J& \1 U
2 V# A8 ^6 r3 P, {2 L& a+ `. n temp = 0x001FF201;
1 e- m0 g' K% r2 C9 t, D6 O9 u5 g. |6 W writel(temp, IO_ADDRESS(PDCTL1_ADDR));
4 q/ Q% N h& J+ z6 ]5 X1 U' L1 }
/ A5 u2 t2 U X- ?. U //PINMUX
* q# F8 C5 P. r9 H4 b7 ~) S //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* |: M# v. ^$ ~9 K0 ^
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 n4 \: @9 ]% G, h8 ^' l PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; " k8 v1 ?9 Q# p/ ^! j
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);& R; W/ Z, e& \$ D! d" _5 `' j
8 { u+ @4 F" w& y3 d
//SLEEP_EN,EPR,L138_SHK1,L138_RC( h6 {5 e3 l4 m: R. m: t6 V3 q
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); $ X9 B+ O7 _/ A. P$ E O
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
3 R% c% c6 W O writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);6 n' @# T; K' o4 K/ o
% v. W: B! `9 F1 P5 p+ v //RESETn,L138_SHK2
1 o2 h- S; K0 n# n& Q PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); , V1 N9 s; t/ @' I; ^2 F) [
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; . G# H, E: ~, p: w
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
, g0 |% F# J4 X% o# D$ B' W3 X* R' W
& n' F; F6 A3 y) s
$ w% p# d0 N2 |5 u; Y //SPCR Register" S8 U& E- c1 f0 @7 p3 @
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 R3 D! I9 j6 [; ?8 ^ temp = 0x03000000;//(DLB=0) V( N1 u8 R, G( M! M: R4 f
// temp = 0x03008000;//(DLB=1)
6 _/ y% |* Y" K, `1 ^( ?6 ~ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset, [( x5 P7 B+ @/ }4 u9 G4 m' L
temp = readl(IO_ADDRESS(SPCR_ADDR));0 I8 D' J& Q# I, Y: F4 d+ m) [
printk("temp=%x\n",temp);
/ k; J( o) B, h* A7 B9 G
( f4 n0 q" ]- T" ] //PCR Register
& o. z9 M7 [1 l* J7 O //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 ?6 o1 s/ D# B3 n // temp = 0x00000F0F;, C, V( n, }' i8 I" ^1 ]3 {" y
temp = 0x00000B0F;9 P) ^9 Y2 u' a( e
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
7 s& j# K: l6 m; ?* h temp = readl(IO_ADDRESS(PCR_ADDR));
6 D7 e3 z$ e( v" T2 k9 e# A printk("temp=%x\n",temp); ' W2 Z7 B) }; T8 W0 q# ~+ W
//SRGR Register
) m# x! L/ N# T/ z) \& G //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
+ G0 ~' t! x n i //temp = 0x301F000B;% S! \! [% L* l* o! H& M& ^3 g
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
7 c8 K8 _6 S- l* W \ temp = readl(IO_ADDRESS(SRGR_ADDR));# r7 N" N& _7 {- \6 F
printk("temp=%x\n",temp);
7 G$ h% x' z& f0 T6 {" G' { //RCR
! ~4 |2 e0 Q* f' l# r! ? //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
$ R/ _; |3 M" ?" `9 K //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' n5 H$ b2 V8 j, l
temp = 0x00440040;6 t0 E3 `0 K! K
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized & W' @& Q; g7 a( L4 \5 J R ^
temp = readl(IO_ADDRESS(RCR_ADDR));2 H1 d- T9 c) H3 d7 `4 ~
printk("temp=%x\n",temp);( l* Y) m5 P- g F0 l1 r, Q
//XCR" d. U- E0 U: b$ ^/ [
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1, R% \+ p* p' v, L9 D$ [: D, P' ?
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% J/ w/ k' s' [- v3 T
temp = 0x00440040;; u8 e7 p4 _; C0 W3 g; B/ m
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized " }) J$ S8 W6 X4 q- b8 i$ f' S
temp = readl(IO_ADDRESS(XCR_ADDR));
8 r% h- F. R3 I/ Z1 o printk("temp=%x\n",temp);$ H$ Y+ x' t6 P& E# Z
udelay(100);. W% x! ^' H+ M) A1 \
//SPCR Register
. l' B: C/ |0 Q% ` //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1/ k( T' C9 z ]4 c6 e
temp = 0x03C10001; //DLB = 0 VS DLB = 1
8 R8 ~# L! X5 q( b, q writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
z* o: N2 b% W' \2 o P& J temp = readl(IO_ADDRESS(SPCR_ADDR));6 @$ S$ p/ q. S; u! X
printk("temp=%x\n",temp);
3 t' l0 g, @2 C2 J$ ` udelay(100);' S$ p3 w* {' Y# a
2 L# [$ R) @4 k% ? //set GPIO direction4 \. f9 O# A0 {* W* O8 ~
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));8 _' k0 j" Y, `/ V! r$ _, ~# y$ g
temp = temp | 0x00000100;//EPR----input
+ i' ]3 F! M8 I& Q; u' ^ w temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output) y+ W5 X/ A2 v
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; w* \/ ]- {/ o3 c) `5 ^ 4 F3 s& o- J s) V, x
return 0;0 B( o: \4 P4 ^9 `: N
}5 s6 k" d$ D1 u
static void __exit MCBSP_exit(void)
4 _1 _5 ?( t& P& ^6 J) d{
; s7 P" N3 u6 f# V& ?8 J& G1 A printk("mcbsp chrdev exit!\n");. O/ v- D, v" b: T9 ^6 k. F0 X2 j
cdev_del(mcbsp_cdev);
# S/ m- y" D/ ~6 x6 J unregister_chrdev_region(mcbsp_dev,count);/ L3 d1 T& o9 [) ^. R6 H
device_destroy(mcbsp_class,mcbsp_dev);$ M9 ~+ x" S* X R% ~' S5 Q6 u* V
class_destroy(mcbsp_class);9 I5 X* g, e3 ]* i; W! w" }; V
}8 @6 ]- [: N# t
module_init(MCBSP_init);: k8 X" @9 ^- |) r1 A O
module_exit(MCBSP_exit);; M. U( y; B' T/ E7 K O( z
+ y$ P! l2 T2 C2 H& s# e+ G
MODULE_LICENSE("GPL");1 v0 }4 W2 a- R2 T2 T" _; o& P
( H8 W: w8 _" y7 h$ M% a ]我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。5 I9 N$ q3 U7 t3 H3 n
我的应用层的测试程序如下- F7 Q/ e' |8 S4 F- f& u
#include <stdio.h>
: n% M: a; u v( F7 p! R9 @! g#include <string.h>/ i, u! T6 n; D0 ]& D: J" I
#include <fcntl.h>
+ Y) K# i3 v% j#include <unistd.h>: b' g# C/ K; }' n
#include <signal.h>' _% ?0 E8 _5 L( G& Q0 S0 E$ U
#include <pthread.h> //线程
& k6 t4 z. Z% N# B1 y#include <stdlib.h>
9 b% J% k/ X' t! M/ |# N+ ~#include <pcap.h> //捕获网口数据
8 V0 I4 ]: C9 K; l! B* Z2 ?3 ~#include <semaphore.h> //信号( S! y- A c: j% w
#include <sys/types.h> //消息对列( @8 I! n. Y, m. Y7 l: b( v; @) H6 Q6 a
#include <sys/ipc.h> //消息队列, v" l. Y7 ^* e/ g' X! s& a. ]
#include <sys/msg.h> //消息队列
. U: x, K/ F4 J3 J( q" ~1 j#include <sys/select.h>
1 r: {: q/ `* d7 x) u#include <sys/syscall.h>9 }9 k1 T7 q- g _
#include <sys/stat.h>
+ k) _7 r6 b. O1 ^' |6 J% H' J: `#include <sys/mman.h> m4 H$ s+ K% r% C
#define msleep(x) usleep(1000*x); D k% P9 O/ ?
0 s; n, z$ U2 }8 R* l8 K# W
int main()
, O% Y6 P: H& w8 o) q3 q{ . g8 w( t. j& Y3 l: v; J$ Y% y7 U- ]
//MCBSP,ARM与AMBE2000交互设备
+ D0 d" A# @5 P' u( E( j) M int fd;
7 T6 h o! J: n$ ~ D- o unsigned short data_write = 0x5555;1 d/ r$ @) U' W6 n
unsigned short data_read = 0x00;
0 E+ k$ L3 n& @+ y8 _ fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
! C$ c1 u& t, w! w // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ m% L) a* D4 @2 F
3 r/ _5 W0 \! F2 S/ p( Q( ` if(fd < 0)4 {3 t5 E$ a; v4 ^, O" f8 t9 z' o
{% i4 B" z. b1 ^6 B
perror("open failed\n");; x7 Z* @2 z+ \; H) E& T! O' v
return -1;
! v3 m8 J1 K4 [% r; G }( {* r8 n. t& Y1 a6 c* ~; q2 L7 v
' b- |/ p' m3 v: c while(1)
8 Z4 P, p( m7 V {
$ j/ c+ E& ~* I- w2 H: L 4 ]( }; w c6 t6 R- l! _; r' Q5 @) M
//AMBE2000每次读写是24个字为一帧$ t+ P8 A' r: E0 O5 y
//写数据时将数据在底层存储起来,等到中断的时候再发送
$ S5 |# e5 T* [9 V" S& f3 [ //AMBE2000输入数据是以0x13EC开头的
2 e( Q4 a3 v. @4 M2 g write(fd,&data_write,sizeof(unsigned short));
7 W6 B5 `7 c6 C : Q8 o+ y4 G; P' O- [
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
* e0 W7 I$ i1 p# O% m read(fd,&data_read,sizeof(unsigned short));
# F1 C" t- y- T, @
9 T" M. c* D- v" Y9 h7 H) i if(data_read == 0x13Ec)
$ `2 x( f4 k2 R8 A0 P {/ C0 S9 c. W3 N% N) D3 V* r
7 j9 t- U3 {( g% U printf("data_read = %x\n",data_read);
& C6 r% q' V0 W' k: u4 [2 v; R }
4 X! U7 u4 F& }& W8 O: V- g$ x$ o
: Z8 V: C5 ~1 b6 {" [; Z msleep(10);
8 q; Q: }& F2 n/ F5 | 8 D) H5 x/ `* _1 M- O5 f
/*
7 a B/ @; W$ x* F( W3 L ioctl(fd,1);
% E. U4 h/ }' o3 S8 O. v8 ]4 l sleep(1);
- R: }$ |; H; x1 c# d7 j ioctl(fd,0);* y' N/ a. q4 Z% W. T2 \& @
sleep(1);
, G( o. [ K4 I9 R# t2 ], j! Z */ - }" }3 O, B9 P7 {$ S( F( f* b Z) s @
} ' c) N& {) {+ ^( D2 Y2 o
return 0;$ }' l# Z {5 w& g5 P; f r# p
' L5 A8 x) X- j$ G, b
}! D( I6 f8 \" T$ k. u
9 L, P7 [) t0 |' x' ~0 ^多谢各位指教,谢谢! 急
4 I) H1 U1 t; z; {% _
4 E H. I v# q% C# b+ e X2 _$ n7 H+ _ N
) H3 Q/ G+ A2 Q- h, D
* S8 ^* v7 Z' q X v5 p6 k* Z, H8 h% O. K& l# ~5 i$ Q' _5 p6 M
|
|