标题: McBSP时钟、同步、数据线不正常 [打印本页] 作者: gaocaimary 时间: 2014-10-16 10:58 标题: McBSP时钟、同步、数据线不正常 我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 9 U. k$ @5 S; f5 P3 z0 O/* 9 E4 e$ C# p; k2 g7 A; R * Copyright (C) 2009 Texas Instruments Inc " ~$ N8 ?9 _8 J4 I *" `; C' q* V" \! ^2 A: w
* This program is free software; you can redistribute it and/or modify$ F. Y1 }+ {! o7 P) p. z2 s- B& W
* it under the terms of the GNU General Public License as published by8 O& G: s- T& C- B' L" F# E
* the Free Software Foundation; either version 2 of the License, or( Q' d5 |/ h9 b" R) W$ G5 R
* (at your option)any later version. 3 `8 A- B, B& h$ |8 k7 D *+ t a' `# }& o4 H4 F8 S( G4 P( D% r
* This program is distributed in the hope that it will be useful, 3 w) D5 m. x/ c3 a/ { * but WITHOUT ANY WARRANTY; without even the implied warranty of 0 R F9 T9 B+ L" D0 F' \2 V * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 D l, ]2 {. \& @+ b! f
* GNU General Public License for more details. ! _$ u# I7 b9 G9 ~( [8 F6 C ** n9 X, q! X$ P) X; Q4 h
* You should have received a copy of the GNU General Public License r) s3 `! n+ b( [# }3 t1 G& B * along with this program; if not, write to the Free Software% K% O+ y: F9 C2 c& I
* Foundati# t, S) W- B6 b% A: |' z! T7 S
*/ ; m! X- p( B7 {$ o; l' R$ B#include <linux/module.h>& k [+ T3 V2 y7 ^
#include <linux/init.h>* ]& g" \) @8 T6 J
#include <linux/errno.h>, k% d8 Y8 x- u
#include <linux/types.h> / o5 E; I! P4 T* S- y; A5 M+ v2 X#include <linux/interrupt.h>* r* P6 ]$ _# {, f$ K
#include <linux/io.h>* O4 E6 o, q. B7 c: [! {4 r
#include <linux/sysctl.h>, l) g0 ?+ [6 E
#include <linux/mm.h> 0 y4 ~& r0 H }$ w8 R3 F#include <linux/delay.h> # ~7 T2 ?3 E% k! L" U# `#include<linux/kernel.h> * o: O: a" o% A* C- Y#include<linux/fs.h> ( p7 ~5 Z5 v/ P#include<linux/ioctl.h> * w7 s* t8 D* f" Y9 q#include<linux/cdev.h>% {# S7 m3 s, k& a. L" V+ y9 p, i
#include<linux/kdev_t.h> 5 g4 I+ N+ \" D: j: `7 c7 M( ~#include<linux/gpio.h> 8 Q( V2 E2 n# ?. |5 F#include <mach/hardware.h>9 i1 Y8 ?6 T2 ]3 Q) W
#include <mach/irqs.h> 6 o7 y# Z+ h6 O. w9 Q : j6 t3 A1 w6 r! h# G) A* D4 }3 x* b#include <asm/mach-types.h># H, @8 c! K% u% b( D
#include <asm/mach/arch.h> 0 Q! d8 H- k, I8 p' G& F7 F#include <mach/da8xx.h> 3 b f! {; g9 q9 `( c, j#define SYSCFG_BASE 0x01c14000 % ]; p L1 ]% z: P% j8 O- ~1 k3 r8 x#define PINMUX1_OFFSET 0x124 , K7 T+ U, {8 k/ ~% s#define PINMUX18_OFFSET 0x168 6 H6 ]6 s" k, y, u5 P+ y+ i; g#define PINMUX19_OFFSET 0x16c ) ? f. s* U4 S#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR, A$ p) c$ f9 @! \2 `/ b" i+ ]
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR1 g9 g( _/ g2 { H3 x& C! Y
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR / h* R, n+ k) Z#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR 6 Z* _" N5 d3 h. s" X! r t#define PCR_ADDR 0x01D11024 //MCBSP1_PCR ; o8 }& K5 A4 ^+ q$ J9 ?" Y! S/ J # q- U+ S v0 C( e5 {2 L% a2 y#define DXR_ADDR 0x01D11004 //MCBSP1_DXR8 u8 m1 G n- a7 w5 { ]3 F
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR$ M' x, z( f3 ], q
//PSC - g% g9 D) e) U9 g& F#define PTCMD_ADDR 0x01E27120 % R, g9 L9 O+ K8 F; n
#define MDCTL15_ADDR 0x01E27A3C: ~# s+ D" }6 q( T1 v0 C, g
#define PDCTL1_ADDR 0x01E27304 6 e( X7 K; S# y! g//GPIO8 direction4 d- Q5 m6 x+ L7 O: Z
#define GPIO8_DIRECT 0x01E260B0 / d+ S1 M! C4 l% Q#define GPIO8_OUT 0x01E260B4 : a1 H7 @# h8 W- C5 `0 }3 {+ X9 O#define GPIO8_IN 0x01E260C0 * ^1 q! E8 X1 o% \" B+ d9 R f) x6 q* W2 K# ]6 X4 |) _5 _
//#define MCBSP1_RINT 99 ! {. q- L$ ]" e9 Q//#define MCBSP1_XINT 100 . g6 a$ D$ Z- x( L3 @
static int MCBSP_MAJOR=239;& B. Z$ h: o* V8 |( `
static int MCBSP_MINOR=0;9 X! i" M6 O8 ~6 g9 B
static int count =1;6 S3 D S3 [% Z5 h0 m/ j2 o
. i! \* _7 i Y* c' n# y1 f#define MCBSP_NAME "MCBSP-device" 7 ]/ O' H9 B7 c: [7 M V# M y1 S# k: e& g' Y @
static struct cdev *mcbsp_cdev;' H! J" M; r. }2 D5 C7 n
static struct class *mcbsp_class; : ~+ t+ A/ k) g5 v! lstatic dev_t mcbsp_dev;, D3 I9 W6 K( T3 w. o6 y
unsigned int DRR_data;. E' o( ^: \+ l: m" S7 i
unsigned int DXR_data;6 f( H6 _8 \# b' ^2 W" W
static int mcbsp_open(struct inode *inode,struct file *file)) [4 S1 D ~0 Y
{, N" G/ I6 a6 j5 f7 S$ c$ C3 v
" Y6 d3 ?# B$ ?; `: \7 |6 D //interrupt enable,initialized . N$ f4 p* D! J+ Y) L0 F0 T5 { unsigned int temp;4 S0 p* g. B' C \5 Q. U' k
//SLEEP_EN(GPIO8[10])---0! w# a8 S# T' Q8 b
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 O: }$ i1 q) `" q
temp=temp&(~0x00000400); 6 g# _2 f) b6 B: S7 J) Y7 \ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]5 R0 G9 h6 G y. E. ^* @$ v* x
//RESETn(GPIO8[8])----0----1 6 W* {1 ]8 H3 h1 d# H temp = __raw_readl(IO_ADDRESS(GPIO8_OUT)); 4 a( w" ]3 ?8 N& C- t1 r temp=temp&(~0x00000100); ! q& I+ N. Z; P- W8 C* d- Z* Z5 z+ o __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0 * U: |( o% `: `) k udelay(100);0 v9 P/ s0 {8 s: r' \
temp=temp| 0x00000100;9 U: G/ H( z" \
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1 . ], Z$ t# C2 C& R& R- b udelay(100);! C) t9 U: G2 }
printk("open success!\n"); - R; m8 d. c3 j$ b1 ]/ k( t$ M# J5 ` return 0;) b; F2 I8 |9 y# @4 @) }( v
}. F* k; [, I( S& I
A% P! ^+ b% ^# a+ K m! a5 cstatic int mcbsp_release(struct inode *inode,struct file *file) M/ E& F9 i, R0 a{$ }9 ? Q9 U2 M# { P
printk("release success!\n");/ c0 c/ R0 B1 T. k" i/ h' T
return 0;9 l% r; c3 y5 K$ x5 B4 `
}6 h; w# T+ {; \+ ?" I+ P: l
, ^: M9 ^" Z) Lstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off) % p. C4 h. L$ F1 J{ 6 f$ l1 @6 n8 q' N0 @9 M6 v copy_from_user(&DXR_data,buf,len); 6 b7 m3 B" ?6 y/ [: m1 o iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ' i/ ~6 W4 U5 G4 P* w9 E0 e4 F m, c+ F
return 0;2 }% A, R* h X5 T5 _( ?
: ]( j: } T/ J}3 N. T, W5 p& {7 S
( R- ^' e& j( n; y' U, M. N
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off) , H# f1 R. r8 L0 ?7 h# \1 g' X* @{ $ L& t: q# T8 M8 j1 h8 A
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR)); ' d+ Q/ v/ c% z' ~) \8 _6 _ copy_to_user(buf,&DRR_data,len); ) w- i' ~: F; W; J/ `/ ?$ \2 w: ~ return 0;* {7 N6 ]9 A! C) c
} ( j6 A4 v+ }3 _1 b 2 J1 e3 v1 C" n# u( s W+ b/ H" d; K6 G( _7 W! H6 _
static struct file_operations mcbsp_fops=$ Y5 T* D. M, V8 e
{6 a3 c; M0 I; [2 U/ w; ]
.owner=THIS_MODULE,( V& e% B' h/ x3 ^) {! V9 H
.open=mcbsp_open,7 Y) Z7 \9 _4 v( _0 {- P
.release=mcbsp_release,* o s& t% J _
.write=mcbsp_write, " Q$ e0 H" w1 ?- h .read=mcbsp_read, ' E: }* ^. V- k* z7 @2 z};* D6 Z. j0 W+ Y% i3 a5 h
static int __init MCBSP_init(void) . p! v- I- c, D$ H! z{* i& V- ]' N0 D2 p4 T3 W3 j
int ret;6 ?1 w% z: j, `: X n. B8 p
unsigned int PINMUX1_REG_old;0 h5 m' l z5 S' J- n
unsigned int PINMUX18_REG_old;, C% P( C$ ?: c/ ^7 `' h6 m
unsigned int PINMUX19_REG_old; 9 [, _! ~# B$ ?7 h# w: d+ j% [* k$ h unsigned int temp; & u* q8 J/ H) o& I t
if(MCBSP_MAJOR) 2 n d x5 a I {! U5 c9 w- C0 E6 x! |" p7 E! M
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 t! p# |) V+ ^
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);- H6 K/ v; @+ P+ T( m
} 8 S9 V7 O$ B+ y' |. b# _ else ! Q' R, F* M- I) e8 _6 k( E { * ^# y: Z$ v! W1 V, } ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME); 8 q: k7 X7 \. G4 `7 h% S9 g MCBSP_MAJOR=MAJOR(mcbsp_dev); ; O, h6 |- B& \5 q9 @' a4 T } 3 X. _. N- {2 Y: \% [: _ 6 R$ o4 z4 C: R9 g' h" d9 r- A2 Q- z) [ if(ret<0) 6 `. \+ \+ N5 @ { $ m0 J/ |% l/ P& z) _ printk(KERN_ERR "register chrdev fail!"); 3 n* \- `( C" C0 |. w- | return -1; 2 p6 {/ n2 n* e y. {( s }' f. c) I! e, e" i# W5 x
& V* d3 ^# j0 }7 W. g
mcbsp_cdev=cdev_alloc(); 0 v9 ~* J; s6 |7 N+ I0 S6 ? 5 n1 \* w9 @6 R) C if(mcbsp_cdev!=NULL)1 T! o* R% c1 {8 ?0 r$ H) S3 a
{ 5 I# ^3 b* P- h3 j" U8 s cdev_init(mcbsp_cdev,&mcbsp_fops);! m0 N/ a7 @( d( a2 `( X5 n* R
mcbsp_cdev->ops=&mcbsp_fops; 4 n+ `/ B* `0 V" q" J2 E mcbsp_cdev->owner=THIS_MODULE; 3 z! V' Q9 a' f( G/ P' w [' L $ ?/ \! b: D( E- {. Y9 i. V z2 o if(cdev_add(mcbsp_cdev,mcbsp_dev,count)) ) d4 A3 n. E! G* V1 F- ]1 w printk(KERN_ERR "register cdev fail!"); 3 M! y; ]- a+ Z else( P1 I" x% G! R" I/ J! y' `
printk(KERN_ERR "register success!\n");2 D. [$ V) [6 a; C9 @( \ n
}2 I8 `' Q; D& h1 l+ J
else 9 c6 L9 |$ e8 q. H! \ {, K: v7 D- M! _! l* E) L- K0 v
printk(KERN_ERR "register cdev err!");- m! C2 a, T# A- X9 A7 D4 g
return -1; & m1 ]& J# M- q1 t" x6 C Y } $ l% ?2 z, f/ E5 x, c3 m 8 y( j0 D9 [+ l- x
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME); - r$ y4 ]8 x; I. ^ if(IS_ERR(mcbsp_class)), G5 U2 k0 G( y( v
{, U1 d/ ?0 ^/ t1 H+ n7 k( L/ z6 `
printk(KERN_ERR "register class err!"); - M' d) C4 D8 B! O0 n0 X# I% _0 N return -1;; }& g# g" V: i8 t# `' U
} ) m: R9 Z' l( o4 h6 C/ f device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME); 2 z% S6 N( n @' o p, V0 C+ v6 e 5 ?" _) m& v1 ?$ }0 w5 e# _ //PSC # L d, Y8 |& o$ O/ v% V0 V //add Enable MCBSP : q+ S" B+ J$ |: R: _* x- U4 M //test1 c' [/ r& l: X" D
temp = 0x80000003; 8 Y Q& @) L8 |) `6 Y$ Z! X writel(temp, IO_ADDRESS(MDCTL15_ADDR));& A0 o0 y( z. x8 F* ?4 C
temp = 0x00000003; + z2 g6 g+ I6 U) i writel(temp, IO_ADDRESS(PTCMD_ADDR));; y, K3 p R5 j6 w/ b( _8 @
' R" A; Y# o0 d- b$ |6 N temp = 0x001FF201;- p* t s' K/ D
writel(temp, IO_ADDRESS(PDCTL1_ADDR));6 ?7 k# e6 ^! L6 H4 I6 U! g
! T- V/ |/ t6 J. o4 | //PINMUX " E# a6 }9 g+ q( g! K/ n //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* y0 m% ]; O- f$ g
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); $ j6 p' A! u$ G% z PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 9 U2 L, V3 [; {" m1 A$ ]8 e: N writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);$ @7 |8 r2 z& w6 I+ d0 G% x. T
& [3 G* C! v( z4 @. [( b P3 B
//SLEEP_EN,EPR,L138_SHK1,L138_RC: }- D0 {( P. f/ j/ k3 N: i
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); . S# d: s6 D# ^. L
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ; K; b$ V. O% j. X/ n: G/ k
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);5 Y: }: f/ f& P2 Q- i
! ?4 b: \" E$ A0 k //RESETn,L138_SHK2 I" G8 _- u R6 [
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); " e6 S( D, p2 r/ T: R6 I9 @! {
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ( D4 ?8 `. j- ~5 w3 C writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ W. E6 t1 w4 J0 M3 }6 e. j
8 \; r4 K0 Z, R+ Y6 L6 G
4 n+ z& | M/ k/ c+ W' \+ S8 V6 L+ R
//SPCR Register 7 j' N4 l+ s$ ~% L //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset 6 r' k1 T2 L$ K$ l, H temp = 0x03000000;//(DLB=0) # S" M7 N# k7 N! Z+ M1 K7 ?: v1 Y // temp = 0x03008000;//(DLB=1)0 v: F& N% c% \% o/ {& ?, I) U
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset & N" D8 @5 D. N6 Q* f) E& x temp = readl(IO_ADDRESS(SPCR_ADDR));) _1 Y& O7 }/ i, H
printk("temp=%x\n",temp);; Z: |% k: ^9 p R) Y; Y
: p2 D. u& N5 ~" a: g //PCR Register# z$ Y: R1 v! W4 S7 {: h2 V
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0# l6 a0 F; K3 V9 m$ N. z
// temp = 0x00000F0F;( p/ Y& Y' R; k4 F/ }6 q
temp = 0x00000B0F;8 u1 e: K, }& d# O) N. _( d
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ( z1 b; V/ f, u, e temp = readl(IO_ADDRESS(PCR_ADDR));6 \& W4 B+ M7 H- Y# F: a
printk("temp=%x\n",temp); $ p. G& w! X' Q //SRGR Register9 T& m9 s3 \5 ?# p' j9 M
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11" }4 O# c" H4 [% L0 [
//temp = 0x301F000B; 0 I8 i+ H: \4 v writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 8 c* `# R8 r! s' C9 J' ]: b
temp = readl(IO_ADDRESS(SRGR_ADDR)); 8 [- L: ^0 s C9 n4 \" N5 U/ c printk("temp=%x\n",temp); 8 F. e3 e- q4 j8 G //RCR, w; H# b, A7 g6 B( |) F+ |
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1, 9 a+ ]/ G; B, R1 q4 Z! O! d- W: I) J/ v //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0 + \2 Q3 n* e' P5 D& S temp = 0x00440040; 8 }) J# Y, m- ~ writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 5 d6 i7 O( h6 ~. a5 B) a$ a temp = readl(IO_ADDRESS(RCR_ADDR)); , t) O. A f1 H# k printk("temp=%x\n",temp);+ B' o, ? \% x1 E R" h
//XCR! S1 t. K$ @- F, I
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1 , a' _- `" N+ q! _+ ] Y //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0 }; S1 f& Y+ Z: P- m" h temp = 0x00440040;- O5 B4 R* l* W8 H9 g/ {! P
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized " h$ W* J9 y0 i$ L2 W0 r
temp = readl(IO_ADDRESS(XCR_ADDR));- M& M9 o2 \! N( T; h" i
printk("temp=%x\n",temp);6 ] ~/ f! p) ~7 B9 y1 M- }
udelay(100);5 g* d: G2 V5 G: i1 @5 ~# Q1 h
//SPCR Register+ \0 S6 w/ ~6 ^) X2 K* u
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1 8 V0 x' T& B5 G1 k0 h% g temp = 0x03C10001; //DLB = 0 VS DLB = 1& I' U. W$ S' G' ?; V- {2 H! f: D6 U) F
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled K" z1 h" T, r# L: M2 S% ^# O" r. Z temp = readl(IO_ADDRESS(SPCR_ADDR));+ b; k3 ^3 \. g- h" R3 a
printk("temp=%x\n",temp);1 I" c* G( p1 e: k! O o9 |4 R
udelay(100); y# y% I3 m" a: V2 p 6 K! f$ g1 S* {$ `! Z. S* U1 T //set GPIO direction A8 I* M9 h& \' T3 n2 R temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT)); / x5 A( C# E. ~& A6 h1 ] temp = temp | 0x00000100;//EPR----input & |% Q8 O- x; Z: K: m A temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output3 e+ ~# G* ~3 x. o4 `( _
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); $ ]2 k& Q) w1 t# m8 J# m8 w * t5 i: i8 i( B1 E return 0; 5 j+ H$ Q* L% ~/ k0 D B% K} 9 O0 U% t" P8 ^# I Z) H$ }8 nstatic void __exit MCBSP_exit(void)% I( b9 G0 ?: e9 [
{1 |# V" b2 y: D, ~- p
printk("mcbsp chrdev exit!\n"); ) p" `! |' n0 l2 e4 ~! q6 M cdev_del(mcbsp_cdev);$ \1 `- h7 [; e& p4 J) X; G5 i
unregister_chrdev_region(mcbsp_dev,count); 0 r; f/ `; D Q device_destroy(mcbsp_class,mcbsp_dev);! M3 P* A$ V( E$ J- Y
class_destroy(mcbsp_class);, g+ R, p5 s u9 U
}2 A. e6 ]1 X, h1 z
module_init(MCBSP_init);. g+ I; x* E' s6 @' { m; U
module_exit(MCBSP_exit);1 S6 I$ G8 l% @0 V5 `! w
$ n9 Z6 Q9 v- q8 W$ \4 z- G
MODULE_LICENSE("GPL");3 |$ T# Z" _9 Z/ Y( T, `' v' ^/ j
; u$ A) P* |! g( f4 f6 Y) r我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。 , F. W9 v1 F# C% G1 Q6 g我的应用层的测试程序如下 4 O. H' y |( g e#include <stdio.h>( E/ U) |4 G! m& a$ d4 t9 \7 N
#include <string.h> 7 m* K) i* u8 P9 K+ i% g# E#include <fcntl.h>8 N+ b$ m. T5 G0 R: }
#include <unistd.h> $ z0 Z: x9 ?! q! l; I* J#include <signal.h>! E. L* d7 r$ L C
#include <pthread.h> //线程' k* ?2 ^% Y- ?* S: _1 r6 `
#include <stdlib.h> / ~9 s6 F$ u1 M4 ]+ `; m9 a2 Y/ M#include <pcap.h> //捕获网口数据/ j- g! m0 U, i$ |/ O4 K5 z
#include <semaphore.h> //信号 5 F$ X' U; m0 ^" `* C#include <sys/types.h> //消息对列 5 w* Q! F/ _7 |$ o9 R8 H5 D5 k#include <sys/ipc.h> //消息队列$ ]1 [+ W# a' H
#include <sys/msg.h> //消息队列 6 t7 b$ B8 X0 z, F# H) G2 m#include <sys/select.h> B2 D$ K; D0 l0 r5 I- O
#include <sys/syscall.h> ( m$ L, E8 N' \5 U# g' u#include <sys/stat.h> ! k5 o3 y4 o, @0 A' r$ P! N- s( p( [#include <sys/mman.h> & Y z# I5 h* ]. D#define msleep(x) usleep(1000*x) " d6 G9 R0 c0 k+ V8 a; K 9 s: E$ K& W: Z0 f6 vint main(). d1 r1 @0 M8 W. A4 E8 y U
{ ) W2 q/ }, k" m5 o1 @ //MCBSP,ARM与AMBE2000交互设备 $ ^( E" J. ?) M& t4 p int fd;* R; Y) M# T9 r- U2 y0 |1 C% m
unsigned short data_write = 0x5555; : U) e% c& s, t* u; b unsigned short data_read = 0x00; 4 ?0 P4 @. M# A7 k& ~0 h- i fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);& Q8 f* N% `' `( c1 j* h$ h+ n
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC); * y& u1 O/ T' X 5 J- F }' H& r& j if(fd < 0) 3 W+ D4 ]5 d1 u+ F6 s8 p {6 |. W: g! P: F% A, E$ x$ K# V a# T
perror("open failed\n");! s$ ~5 S/ x$ `; i
return -1;7 Y. c3 \, Y2 z; e: c( O
}5 Z0 y! A( M, o! E5 a
; C- z+ q! ?4 _) p1 V
while(1) ( F; O7 B+ J; N* T { * N2 a; E5 u. w r$ D 2 x+ c& v: e- |8 z3 [. V) }8 o4 b
//AMBE2000每次读写是24个字为一帧 $ L0 Q; j; s0 J& @/ R0 B# M: { //写数据时将数据在底层存储起来,等到中断的时候再发送 ( P. h4 \3 L6 s0 w //AMBE2000输入数据是以0x13EC开头的" F6 s, y0 [3 K; ]& K! [
write(fd,&data_write,sizeof(unsigned short)); ( `! I ?- s- d4 ]8 x * T; b; x; [% L& H% }3 F
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 ' w: ]! ?2 G0 V5 l read(fd,&data_read,sizeof(unsigned short)); - T' S* P( h4 r7 D/ E5 p + m; q; D. |3 u4 m0 V, `9 ?# @ if(data_read == 0x13Ec)/ T& J; a# u% N% W: [" j4 y
{: h. m w5 H' t& u
- L+ Q' R8 x' S" J x printf("data_read = %x\n",data_read); " k/ m( E( x% B) b. M }8 m/ F: }' F/ h" C
. e( J2 Z! h1 K. E3 w. h4 X* E
msleep(10); 7 Q* \( \: k' P: e * v- n* U4 v, H) \2 w /** p% [2 j, i0 o! t5 m' |( w9 _
ioctl(fd,1); ( W/ Y2 g% A$ P9 j, t! L- @ sleep(1); ' W$ y, ~# o; O& t' C4 x ioctl(fd,0);$ m* }+ u5 T+ P' ?/ a/ Q; \& D
sleep(1);- j8 _' d; ~: X' r' |9 k% w
*/ . U! D7 ?; P- @$ m |8 J" u
} . z6 _7 C9 H2 G1 W: Q return 0;5 E- a8 D8 G& h$ g
$ r& E, {# T. i
} V4 {4 ]4 j" j- {3 h o
" E9 _- I* D/ F# Z$ F& p G多谢各位指教,谢谢! 急$ l& m2 O$ q0 q1 D# R
) _% I/ j+ n! T% x; `) L * l" o, t& [5 [ . w8 V- y& R3 K/ v2 } ' K/ _& p4 L% \* p* x3 Q: X & \ X; |, U7 Y* y