|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
0 x/ D) C3 [1 X$ g+ M( h8 G$ y/*4 s |) X5 O y* ~4 G
* Copyright (C) 2009 Texas Instruments Inc
5 I0 h7 q4 ?6 V6 d$ d/ _ *
% {; L: P. ~9 u+ `( Y6 D * This program is free software; you can redistribute it and/or modify
" O3 B+ r, J/ l R1 w * it under the terms of the GNU General Public License as published by8 ~) T. p& C1 j+ y
* the Free Software Foundation; either version 2 of the License, or
# b5 O) v0 S( x, l" K! ` * (at your option)any later version.
* y4 r8 S( ?; N: z" q" E1 p' q% z *6 \5 R. _. k! n; J
* This program is distributed in the hope that it will be useful,
" f6 w# Z. \3 G1 z9 y! @ * but WITHOUT ANY WARRANTY; without even the implied warranty of% t6 L6 c' V1 q$ P! p% k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ H2 A- z: a2 T9 v2 E, F2 p * GNU General Public License for more details.
" L; p) t1 [( c4 I) l- @ *
1 T) B+ N+ `5 G/ P * You should have received a copy of the GNU General Public License M3 R" P4 O8 j1 }% [+ e$ K5 F, ~
* along with this program; if not, write to the Free Software
) s$ K) O% e! b4 v7 ]) P. r * Foundati
, k; q4 B" Y% p*/5 L- h6 Z a6 ]7 g* T: X5 E1 |
#include <linux/module.h>" K- ]4 B* }" u
#include <linux/init.h>) x+ P6 E0 j, c! J8 I9 P F, m. f
#include <linux/errno.h>1 Z, X9 n$ E7 L. j% \7 O
#include <linux/types.h>% L" z# c# A, p
#include <linux/interrupt.h>* k% E9 \$ D' {+ ~/ L+ V1 x
#include <linux/io.h>, P$ x+ J) }" D' V. k }
#include <linux/sysctl.h>
5 r, ?9 H& Y5 \#include <linux/mm.h>
' r/ D7 [- e* N#include <linux/delay.h>; Y8 u6 U% d" c% {/ e
#include<linux/kernel.h>9 i7 V0 ?( [; l0 A. F" G' }
#include<linux/fs.h>: T4 r. b: u0 p( J
#include<linux/ioctl.h>
( }4 d, V3 ~5 n% z( W#include<linux/cdev.h> N4 w# }+ k3 U0 ~6 b/ E8 s
#include<linux/kdev_t.h>0 I: F$ O1 @9 v" ^
#include<linux/gpio.h>7 U2 y Q( o; k/ r" ~( ]
#include <mach/hardware.h>7 T4 Z! R* p0 {# W# H
#include <mach/irqs.h>
9 I* }0 ~. |! D n q% w* g* W$ z1 E6 E! a7 G2 n/ T, X
#include <asm/mach-types.h>& Q' W4 Q2 m3 j2 O w
#include <asm/mach/arch.h>. f% }2 l M% a, w4 x& _
#include <mach/da8xx.h>
@- y* n% c2 {+ I- ^% W#define SYSCFG_BASE 0x01c14000
# B7 ?, E+ A6 j; n1 ^( J/ U#define PINMUX1_OFFSET 0x124
" W# g2 e# [! X+ }4 N, w#define PINMUX18_OFFSET 0x168
/ i0 ~# z! q" K* t5 ?. @#define PINMUX19_OFFSET 0x16c
1 A+ K( {# H( r" }6 m. O#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR+ H* H; w# s( _* U1 n
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
- Z6 W U6 a* ]* l: V1 e+ g#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
% Z4 s5 g$ t5 K0 n; Y, x8 f1 @$ P#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR. `/ Y0 u9 d. y$ M
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
/ c0 Q% Q$ }$ h5 B
1 Q u- c6 o; p$ n#define DXR_ADDR 0x01D11004 //MCBSP1_DXR8 M$ [; e" J5 D2 @
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR7 h! C6 T* {) F1 y
//PSC6 W+ _6 t; f# M
#define PTCMD_ADDR 0x01E27120 * D2 A" y, Q% ~% t( d5 |0 q; L
#define MDCTL15_ADDR 0x01E27A3C
" r; }" ]& }# K& J8 p#define PDCTL1_ADDR 0x01E27304
' ^6 [5 e6 d. g" m) r2 }7 ^//GPIO8 direction
. i& h( \9 d/ ^( i+ L9 n8 R#define GPIO8_DIRECT 0x01E260B0: Q$ S1 E/ I- x- }; p6 I+ D
#define GPIO8_OUT 0x01E260B4
. u) M9 c/ t2 G5 `- a. A$ p1 h#define GPIO8_IN 0x01E260C0
1 x5 B( ]* e7 `+ b1 t
% ^: p% J2 f. o: K/ w" Y0 o//#define MCBSP1_RINT 99 - `9 F* q) t+ T d' B
//#define MCBSP1_XINT 100
4 W. ~. i8 K4 ? jstatic int MCBSP_MAJOR=239;
' P% f+ w0 k! _) y. k0 [static int MCBSP_MINOR=0;2 b, K: `7 l) D# g" C- l
static int count =1;
Z6 R: J n# x/ X! ~8 m+ c" _
" |! Y. K" T0 ^#define MCBSP_NAME "MCBSP-device"
) _0 W) d, s9 q G! S, b) j/ E
7 ~4 Z0 ~. M3 Ystatic struct cdev *mcbsp_cdev;+ Y. {$ M0 p" N9 @7 h" S! k4 y
static struct class *mcbsp_class;. b4 t) x2 ~# N, f8 `% k% E0 l& g
static dev_t mcbsp_dev;
$ x o; z4 n8 M9 xunsigned int DRR_data;
! V; u( o: `: I0 {4 o4 G7 \# Qunsigned int DXR_data;
- B* Z N* m3 M* _$ Gstatic int mcbsp_open(struct inode *inode,struct file *file)* k( l9 \8 V: r0 g7 ]
{8 c! f, D) O% u; z( u9 U
& e! n& Q+ ?: Q. U8 E //interrupt enable,initialized( K2 p# v8 K0 |
unsigned int temp;* r# J! d+ ^* j6 b: Y3 O
//SLEEP_EN(GPIO8[10])---0
$ W1 j [; f( ]1 o) w* e temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 { X# P) f6 u$ I# L5 b temp=temp&(~0x00000400);; Z7 n4 ]& ^. ^, C9 c$ c
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
/ L n2 p# Z4 r+ d( m //RESETn(GPIO8[8])----0----1
7 o, W! e8 y( K+ O3 E* t temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! \3 j, T# m* B( _/ }; t; x0 c
temp=temp&(~0x00000100);
4 O& M9 S7 W& N1 } __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
; r* G0 ^* @+ Q udelay(100);* v9 \/ X$ d6 X! f# H7 l$ e. v5 E
temp=temp| 0x00000100;
u8 w* g2 T6 h$ N9 U, J& q( n __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
1 Y- b+ y' {. ^9 d udelay(100);
2 G( i; `9 S, S# O5 [ printk("open success!\n");
$ O t. L3 T* ^* E7 q; {& z return 0;1 f }2 S! t p' {8 q: C7 B) G% z
}
( X' B+ w/ P- U/ ]# `8 d u" {# h$ h& c- C+ { K- T
static int mcbsp_release(struct inode *inode,struct file *file)
+ x; X s) Q2 z5 L& i! z{+ ]* Q' S5 O& \& x. u# k* j
printk("release success!\n");6 ~! c& b/ K+ w. h2 ~) {7 y
return 0;
2 W+ V2 Z) h$ U3 N i: e/ c}0 a p* F( F, `' Q' W. t
) m: w/ d; _ h
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
, A% `6 d' G% u) W8 e{2 q5 ?0 i8 g, b3 k
copy_from_user(&DXR_data,buf,len);
" E& X: S1 q" B8 G; D iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
1 e: v. j/ ~5 x; Z; \; H return 0;- J5 f" T( A% e, ^. x
5 c- ?1 K& |3 w0 j i
}
, z0 |) H6 c! H; Y1 }7 X0 B% b! B7 v5 J3 c5 \
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off). N+ I( P l* w* h7 m( W
{ i2 t1 V9 [8 t7 G) [# d
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR)); D* M& _6 @; I! M3 ^
copy_to_user(buf,&DRR_data,len);
; b) x3 {0 s/ r0 M$ [3 z return 0;
1 K; o, O% d3 u* I! T}
: N" M( ~$ d3 s+ @$ z! Y# _4 F9 h2 E# m+ h0 F$ y0 R
+ k3 [$ d- ~5 n
static struct file_operations mcbsp_fops=
: W8 o5 J. ^5 f6 l{
$ }$ v, l8 \3 r$ c' d .owner=THIS_MODULE,' _" V- T. p/ {" y; p
.open=mcbsp_open,
2 _: E7 I ?7 f7 K: @! S) K- V .release=mcbsp_release,' \. ]4 H6 R. g7 G
.write=mcbsp_write,* O! g5 h3 r5 V2 G1 f
.read=mcbsp_read,
7 F; Z: z- ?. a f, @. Q};7 X6 T% G8 f- Y; l; L7 w
static int __init MCBSP_init(void)
, f8 O7 h4 E, w S- U5 F{
9 T+ B+ y: F/ c$ ^/ H int ret;; M9 W- t9 ^/ t. ?
unsigned int PINMUX1_REG_old;
: [5 T; M5 A0 [4 ^! \1 W unsigned int PINMUX18_REG_old;" H/ \3 a' A8 D0 H! a9 ^# C9 O
unsigned int PINMUX19_REG_old;
+ b7 R& ]$ ]# N1 `( D0 K8 Q unsigned int temp;
7 |; x$ ?( F8 H9 `0 u% M7 v if(MCBSP_MAJOR)
6 ~+ w1 x1 D2 N% n {$ c" c8 Z) N- B$ o' }$ ^, [
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);9 f0 ]5 k& |) x" L
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);4 s) ?. H& H2 {' G9 b9 t5 Z
}6 s, M- I/ m: W3 s9 o- Q
else X% |/ c4 N; T B
{9 z2 t( R6 n& A) p. R
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);, f% K" Y4 _$ {
MCBSP_MAJOR=MAJOR(mcbsp_dev);& G* ]. E* y8 J) u
}
2 {, ~6 Q. M" Z" c" m! A " y$ d$ z6 ?1 {5 m7 ]9 _6 W; s% w' j; E
if(ret<0)6 {( x3 J; `. I V# W# B1 I
{
' F) `( |& B: |( P) A; `/ \+ q$ D printk(KERN_ERR "register chrdev fail!");
2 Z( I, I# J, X return -1;
& z$ {3 |, N0 [& n! S _1 X }; ]+ S; o1 _' o3 e
$ J0 `2 O7 ?' Z# @1 [$ W* k
mcbsp_cdev=cdev_alloc();, A, g- A; c$ j2 D! { \
% N, R1 }% T$ C; R
if(mcbsp_cdev!=NULL)
5 T g% ?# C- a* W# s) y {2 j$ H: R% X1 q. S9 g2 n
cdev_init(mcbsp_cdev,&mcbsp_fops);
/ d$ o& {" ]; a) {( K8 G mcbsp_cdev->ops=&mcbsp_fops;, \1 {8 P, W" G) c$ e
mcbsp_cdev->owner=THIS_MODULE;
+ R! A8 m% H ^6 g! t) B
4 c6 f( T. M: F0 t if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) q8 f6 a6 ^- a printk(KERN_ERR "register cdev fail!");$ r0 o7 k( Z7 c$ b
else( c, F3 T i+ Z# L j, ~
printk(KERN_ERR "register success!\n");
% V$ e0 Y1 f( z" O5 ?5 i7 R }
]; r" L3 d. y' _ else* {" _. W) c& b |1 v
{1 p8 D1 V' y) }& O; J
printk(KERN_ERR "register cdev err!");
- X2 s6 G+ ^$ W2 o, m; x( ~% _ return -1;
4 k. V: y: W& M2 T) q5 I }/ e: _1 j1 D, ?7 m/ x
3 r% ^0 a" f& |# P+ G4 J, i
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) }$ L6 K( M( N3 S. U
if(IS_ERR(mcbsp_class))
* a- L; [! @; h2 Y( N5 [% s& K {
: N/ _ f" g6 Z$ A. Z printk(KERN_ERR "register class err!");
8 V7 I9 ]9 k9 C. O9 Z% x5 R return -1;
2 `9 ]6 }( z' j, P5 e7 A- B& F }
2 L% c' i* t, ?- E* q3 V! r device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 M5 P$ }5 E$ [
4 c3 ^$ C" b Z& `5 D. a
//PSC9 X# }% X, N4 A+ t/ c
//add Enable MCBSP
. Q2 f/ p# T$ T0 [( r //test' k1 j& {9 a5 `) @8 m6 C6 @
temp = 0x80000003;
# D& X1 w& J+ U1 M- q3 ?7 U% l writel(temp, IO_ADDRESS(MDCTL15_ADDR));: j# G& j& P r# \) ?0 c
temp = 0x00000003;8 o0 U+ q5 {2 J( A# p, ]
writel(temp, IO_ADDRESS(PTCMD_ADDR));3 P6 q* P5 p6 h
4 G. i$ \" b$ o' u
temp = 0x001FF201;2 a+ b# T. y4 J
writel(temp, IO_ADDRESS(PDCTL1_ADDR));" M, {% d$ e- g7 O: ?
+ u+ }( P# D1 p5 ~1 `
//PINMUX 2 T# M, k: P8 i7 A
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
! v, B t5 a6 p4 Q9 j PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 3 I8 ?$ e: d- A* g( M y
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; : |# j8 j7 Y4 o; i5 @' w }" r
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# U6 `% p. U0 ?! f9 m, V5 P$ I* }
( z# q8 u; j9 Z( O$ l) Z/ U4 l
//SLEEP_EN,EPR,L138_SHK1,L138_RC
! s" [, I) [) u" P5 _% s PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ' |, b5 Y+ H" ?; h/ N% F
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; + x$ o/ g% D0 t$ `
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);" e& Q5 n# G+ s. y7 [7 d4 v; {' K
# h: M7 d8 ^% _1 m9 K //RESETn,L138_SHK2
* r% ?: f$ x6 T! _ r" U* ^9 O PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); $ g: ], p7 r; ~) x+ {+ Q( F4 _
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 9 y1 W9 h6 f+ l W' r3 E% d$ r
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
6 C% d1 \1 R6 `: n2 B' U
2 n @. M* ~2 t" \' ]* w3 k0 r2 X- V
* x: H5 Y( ^* Q0 t2 O4 E' m //SPCR Register- f+ g: R5 f+ S1 d3 _ L0 |
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset3 f, l* p2 w' m- U9 J
temp = 0x03000000;//(DLB=0)
/ } n8 Q6 u1 x; g0 E( a, } _ // temp = 0x03008000;//(DLB=1)
' v" W2 @/ R# B+ r* o* ^) [ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
4 f, z( C' ]2 i" [3 Z, i temp = readl(IO_ADDRESS(SPCR_ADDR));9 k) X) F2 v7 H
printk("temp=%x\n",temp);
/ V" P2 g, P. l V8 K. r8 `
& U; }; J3 }0 X //PCR Register& ?- v+ x8 k% Q3 Y8 v4 \$ n9 y
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
7 o8 R9 H% L$ \8 O2 ] // temp = 0x00000F0F;
( R& _9 |. l, U9 S0 J# u temp = 0x00000B0F;
9 _, z) F1 f- m4 }5 ^1 f3 c writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized . l G7 z0 ?0 ]4 b9 b1 P/ ?4 D* `
temp = readl(IO_ADDRESS(PCR_ADDR));
2 M( I+ T: L h0 l% u printk("temp=%x\n",temp); ; D* D# U n5 d! ?6 ~
//SRGR Register; \ _7 Z% u8 p5 @
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
, ?8 J4 E- Y' l- @! ~$ z2 V //temp = 0x301F000B;9 f+ W, L6 h5 w$ g% |
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
$ R' {* ^2 e& M) [" t temp = readl(IO_ADDRESS(SRGR_ADDR));) |* S, L6 G* a( k. {. M* ?* \
printk("temp=%x\n",temp);3 s/ }' X9 i/ k1 g3 e8 x& L: s5 [5 L X
//RCR
% n! n% `8 ]. R' z //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 D' W+ B4 J! u5 S0 e //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-07 K$ o: q7 X" E: b6 Y
temp = 0x00440040;9 a; s9 S l9 Q1 J1 d9 ?6 b
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
+ N! Y, H( i/ A+ ^; M/ {7 c6 D4 Q temp = readl(IO_ADDRESS(RCR_ADDR));7 Q8 r; a' W9 y2 v) R, N" t
printk("temp=%x\n",temp);
+ d, E7 W* }! a8 O e //XCR' h4 E* `7 @( \7 ] L. _
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ G% g5 g/ ~- m
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" @9 X5 R/ b6 l) C temp = 0x00440040;- m& q) }0 \0 a4 H& |/ O7 N& x
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ; |# {8 w1 h, k# O) b; N; \
temp = readl(IO_ADDRESS(XCR_ADDR));
# e; Q3 p* }# p2 A2 U printk("temp=%x\n",temp);
5 o. M. }$ C' m. I y- U& ]; p udelay(100);
! M" v3 `9 j1 H0 {& d! A( _6 X //SPCR Register
& e0 n9 t" x/ b! D7 t H: k) \ //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, H Q0 p) A' b temp = 0x03C10001; //DLB = 0 VS DLB = 1
4 B+ Q, L" Q! d: o% { writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
6 c/ X7 e) T1 t6 K& {8 m' K( l0 s temp = readl(IO_ADDRESS(SPCR_ADDR));2 i) _$ T1 k; k1 m3 B
printk("temp=%x\n",temp);
( t1 h2 w, Z) g9 w( F: m! m; b udelay(100);. Z+ _- f5 R! D% ?* K7 _
4 D B4 q# o A9 R. F# J2 } //set GPIO direction
" a) x( T- N! a& g8 N) b temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 K3 i+ E7 w- r: w temp = temp | 0x00000100;//EPR----input, F0 m4 ^- Q: [$ t1 I$ z
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
) i ?6 g9 s* { V& e1 ^1 g& e, e __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ T6 `9 F1 T2 z3 G ]- J6 G * h2 J) d. O1 v; Y
return 0;- r$ `; f& ^/ [* U
}
3 M! O- i+ A! Z ]9 n! ?static void __exit MCBSP_exit(void)* C1 A9 Y& @& O% x: g8 g
{; k( Q+ g( G+ c6 Z/ h+ |$ @5 u
printk("mcbsp chrdev exit!\n");
1 T2 h) ^- `" _+ P8 O cdev_del(mcbsp_cdev);
0 ]( }' Q1 |, l3 g4 Y unregister_chrdev_region(mcbsp_dev,count);) d2 J7 P7 ^% P+ Q9 x; `
device_destroy(mcbsp_class,mcbsp_dev);! @# C, w8 a. t/ {7 a
class_destroy(mcbsp_class);& R/ u+ f# v$ ]6 S9 T0 d: O
}
8 ?1 E: O1 ~# h/ f" V- I* k0 Dmodule_init(MCBSP_init);
( k9 K9 P2 ?, w/ hmodule_exit(MCBSP_exit);' f5 u; x$ g _2 r1 k3 g. ?5 A
: f- c! \ Y5 n8 O# J) G7 q
MODULE_LICENSE("GPL");
: }$ Y& j0 {6 e$ }& }. \4 }( X, `) [9 F( T7 }5 @5 Q
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。 @+ t: T/ m# N
我的应用层的测试程序如下: ~; }9 a1 f% h8 s# G$ ?
#include <stdio.h>2 Z9 Z* H0 Q8 ~
#include <string.h>
" Y3 }1 M- }- n: c6 `#include <fcntl.h> T0 J' i: }9 I2 ?& n) X* \
#include <unistd.h>, k, f& d8 D: E: o4 x. A! o
#include <signal.h>
# M0 ^7 J' t, s8 F8 q; R& r5 P#include <pthread.h> //线程
9 M: }* z: R1 L7 ^& M+ t#include <stdlib.h>0 o9 P1 s/ p" y
#include <pcap.h> //捕获网口数据
4 {( p+ H7 e, ~#include <semaphore.h> //信号
6 P4 K, _+ b- J1 g j7 @7 ~, s#include <sys/types.h> //消息对列9 s: @1 @/ i- x' D- d; W! f4 t
#include <sys/ipc.h> //消息队列3 L8 ?) J* ~/ ]! P5 E; V
#include <sys/msg.h> //消息队列
" l6 H, H& R6 k; f" M#include <sys/select.h>, }0 X0 Q, x0 R* ~5 Q
#include <sys/syscall.h>
3 u+ [. g/ Z, C7 V#include <sys/stat.h>
0 O5 @4 c1 p+ E3 y8 e/ j#include <sys/mman.h>( {! d* n/ {; m2 E" r" g) X" ~1 }
#define msleep(x) usleep(1000*x)
7 s: T& o$ G3 r$ G
# {1 i3 p3 C3 }: t) Dint main()3 s- ~( n6 L% W& X) \ I
{ 9 _( {4 a6 |( a6 t/ r; O
//MCBSP,ARM与AMBE2000交互设备
: @. Q: W- p9 I+ ^. S int fd;
8 p0 Q% ~. E* p' `% M unsigned short data_write = 0x5555;
/ m9 F8 Y8 c; i; H; _ unsigned short data_read = 0x00;5 _7 V4 K- t5 @2 A4 @9 [ O( t9 b
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
" |- E( x" x$ \6 I4 `' s9 c // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);/ q, G; r5 Z- o2 w. \4 L2 v1 d
! K- D; @9 ]4 H9 v7 `, d$ ]3 _
if(fd < 0)5 V2 m/ T3 j% ]/ ^5 J
{
7 O/ v- f- D2 F+ Y9 d- S x+ _5 N perror("open failed\n");
6 _: ?/ ?. k9 b- D1 x5 r return -1;
! n: ~% Z T! M }
8 p. t0 l9 D, x
/ G8 Q" }( g$ ]# z1 t C! J while(1)( p& g T. {, @0 l8 ?3 r6 O
{( G* u1 J& T7 Q$ V
/ `% h& z: b3 m' o4 Q _2 \
//AMBE2000每次读写是24个字为一帧- c. J* F/ Z9 C- A$ _# p
//写数据时将数据在底层存储起来,等到中断的时候再发送$ w( W3 _/ z8 @6 f% [
//AMBE2000输入数据是以0x13EC开头的 N; I8 \+ i" \* ?# k& E o
write(fd,&data_write,sizeof(unsigned short));; U" [. a Y7 S+ ~
& Y6 F6 E* y5 E0 V8 G
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
$ |7 d, g1 |# c/ S/ \6 I4 N read(fd,&data_read,sizeof(unsigned short));4 ~0 c8 C& M3 K9 a' ~5 c' k3 w$ V
) v5 z1 M; P/ B" {3 y
if(data_read == 0x13Ec)- f5 d9 }/ E7 j5 k2 C I
{
9 U7 w7 P9 R7 \! x0 ^8 O % a- `, S& ?% f. w- @7 j- G
printf("data_read = %x\n",data_read);
$ ]+ t- d- j$ d6 N/ G1 ~* j }- ~' t7 }4 Y, E& w
! z) q6 G5 u7 i7 H
msleep(10);/ m+ n4 b W( O
8 f1 X9 q; y6 { a0 S: \ h4 C. E /*, E' F4 }$ E8 s% Q
ioctl(fd,1);
P3 Z. H, }$ r4 G. o sleep(1);! L3 }0 F$ F b+ U, F* A9 U" o' |
ioctl(fd,0);6 c" `$ H$ f' M" ], x+ _0 f0 G1 U
sleep(1);
8 m# h/ ^2 X& ~3 b( l$ q */ 2 g- z1 b0 D' Z6 ?5 a
} 6 n8 W- M( e+ t7 C8 I8 W
return 0;! ]; V6 V- M8 w* @9 Z, M
7 f5 p) O1 F: v9 n) Z}+ t& _" ]4 p; t! v
+ A( @4 J4 ]/ E8 e$ I- F8 n4 V/ b7 v9 Q
多谢各位指教,谢谢! 急- u) ]0 `5 A/ W: \! e
0 U4 d9 B, N% N* u3 a* y' \/ J
% [8 _% d/ V0 E$ g
; g6 r& h) l, m6 t9 c% A# p
$ y6 U) Q( b& Z% P( W. G/ f& X! `$ Y D
|
|