|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: - ^9 O! a- V& p- O. ~6 S8 S8 `9 M0 \1 \
/*. X" W0 S$ _9 `: \# ]$ F+ D: c; f$ `
* Copyright (C) 2009 Texas Instruments Inc% R; W" G% U6 T1 d6 `0 T& H
*
I. j* S% q' r2 n, ~' H9 F( } * This program is free software; you can redistribute it and/or modify( \# L5 L4 v' b+ w2 P
* it under the terms of the GNU General Public License as published by
/ y& [, d i8 @, Q$ Z8 f( g * the Free Software Foundation; either version 2 of the License, or6 d3 N# w4 e$ d3 i4 A. j
* (at your option)any later version.
( _( ] X' M+ E# C *
( p" |* x5 Z5 Y5 [/ b$ o * This program is distributed in the hope that it will be useful,
+ v7 ^% `8 j/ B7 o * but WITHOUT ANY WARRANTY; without even the implied warranty of& O5 t( H) }1 B' S2 {1 ]) t- ?
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; A1 y$ |# w- @1 t' R
* GNU General Public License for more details." p5 W8 {3 u( H$ N4 `$ w5 O
*
' o" [' O$ j8 T- j! g1 M * You should have received a copy of the GNU General Public License% Z& d) l+ _/ o( O" k$ t R
* along with this program; if not, write to the Free Software
3 ?3 X" X: ]6 P3 @ * Foundati8 G1 E" C& q* Q7 c- K. G) g" b
*/
7 |9 k9 G3 r9 j2 p7 u9 z#include <linux/module.h>; o/ L. E' y& T9 ^; R
#include <linux/init.h>$ E: U! ]- K* {5 U
#include <linux/errno.h>7 y P( x% f3 d0 z# n
#include <linux/types.h>
4 a3 e4 s! ^' {, m& P: ~) q#include <linux/interrupt.h>* j8 z! s& O8 d0 Y0 V' b- l7 v% v
#include <linux/io.h>) b7 k; s1 V! `" K0 k
#include <linux/sysctl.h>
5 N% Z; |3 P- N! ^5 r#include <linux/mm.h>
" a, f1 N, c0 \#include <linux/delay.h>
. J5 X3 P2 Q. u6 p( F#include<linux/kernel.h>
3 H! ~& t0 S: X' g, F& e- z0 z2 L#include<linux/fs.h>
1 l0 B/ m$ J3 ^! z4 b8 |! \#include<linux/ioctl.h>
1 }3 Z. x2 x# h: p) `#include<linux/cdev.h>
3 f4 c% u0 _+ L( ]. j; g#include<linux/kdev_t.h>
$ p' w0 t0 g1 Q7 V+ T#include<linux/gpio.h>. W" y- }# U" Q( E' i
#include <mach/hardware.h>4 _+ Z! J, V2 Z, A
#include <mach/irqs.h>
" o8 }$ n$ ?6 ^0 R) O% k& P
/ R3 `! [5 I* S2 z#include <asm/mach-types.h>" s8 |" g4 ?3 \
#include <asm/mach/arch.h>+ @4 f4 \1 `- P( V
#include <mach/da8xx.h>
8 n) m h0 {3 i9 ?0 D#define SYSCFG_BASE 0x01c140004 K+ G9 X: Y+ q4 {2 v
#define PINMUX1_OFFSET 0x124
7 K7 a% M% T1 T" R1 Q#define PINMUX18_OFFSET 0x168
9 l) `* O- a! `8 | S' h#define PINMUX19_OFFSET 0x16c1 _! ]: v; g g, S5 V$ {% o
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
$ X$ P& v! ^% `! j( e& ?' r w6 X#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
" I9 G5 E4 r! f1 `/ s. Q, j1 A#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
$ u- e1 i# b( S#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR% L8 g* I& }5 l" h0 j7 v
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR2 N2 b, o! U! A/ \3 @# o
( s) Y+ e) n# y& ^#define DXR_ADDR 0x01D11004 //MCBSP1_DXR% p t' F* |# d3 \% h
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR" {6 j ?4 r& I4 e1 ?# z4 y9 @
//PSC9 o0 i% F3 ~! U$ j. {6 |5 t9 [
#define PTCMD_ADDR 0x01E27120
- G* v! A2 {! q#define MDCTL15_ADDR 0x01E27A3C. q0 w0 d; T- r
#define PDCTL1_ADDR 0x01E27304
# r; m0 Y0 ^$ o% o' B" }1 b//GPIO8 direction
$ g# Z8 z* Y' q#define GPIO8_DIRECT 0x01E260B0
4 M5 ]8 ]( N) t#define GPIO8_OUT 0x01E260B4
- i3 c5 H7 i3 S' d/ T d& L#define GPIO8_IN 0x01E260C0
8 M4 }% u7 }+ j7 g1 L) f9 t, `% T Z+ m3 O
//#define MCBSP1_RINT 99 ' q- C/ R9 ~ l8 @4 Y& }( A4 N
//#define MCBSP1_XINT 100 8 ~+ c- @, k3 ?) z: ^6 _
static int MCBSP_MAJOR=239;
9 M+ C+ n. r+ \9 g$ q$ C7 jstatic int MCBSP_MINOR=0;& _ N8 V) h+ N4 W# P; V* j
static int count =1;( u) v1 `* i1 R# K
" L' m# E+ E8 o, O8 F- f6 {3 \" Y
#define MCBSP_NAME "MCBSP-device"
% j h: c9 g& K7 U1 j
. A8 w- o% B2 e4 H4 [. Fstatic struct cdev *mcbsp_cdev;% x) B9 A. X- o7 h( F7 Z5 V
static struct class *mcbsp_class;
/ H- @* g, F( bstatic dev_t mcbsp_dev;) w- M' P9 L7 K, [
unsigned int DRR_data;
+ s$ m, G/ E- T: e* V! b+ kunsigned int DXR_data;
/ n m$ J4 C# ?5 e# ^1 w9 Bstatic int mcbsp_open(struct inode *inode,struct file *file)
" [" |1 o0 `" d) c D$ s" d8 \{# i3 d% i7 r2 d. B9 V( v3 m
! v% T- Q1 \6 ~& j
//interrupt enable,initialized
$ Q5 W4 e4 v& Z; q5 P1 ~0 M unsigned int temp;! Q/ q& `9 V% v/ E: G
//SLEEP_EN(GPIO8[10])---0
4 y R' ~6 F, E/ j! U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 [8 g/ q0 e# v ^6 x
temp=temp&(~0x00000400);6 o, o; Q1 }* Q, a' \8 |0 f
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
2 X6 m+ W. a6 R. G; a //RESETn(GPIO8[8])----0----1
/ E+ t9 q! ?$ e) _ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 L# F8 r6 c' b/ y temp=temp&(~0x00000100); P$ t4 i; ] l
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. X' s1 Y( ~6 j O& F, b: d udelay(100);% P; a/ D4 M4 p; X3 j$ n* \
temp=temp| 0x00000100;
* }: E2 a* E8 ? __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---17 ?: N/ \; V9 i, Z
udelay(100);
* o+ O d k7 l! c printk("open success!\n");3 G c3 V1 ?# L8 s; H2 B
return 0;9 h' j: ?. e+ @ V3 O5 _% o
}
. E# k+ R x% l
) U x1 ?5 y d3 f6 z2 P K% Wstatic int mcbsp_release(struct inode *inode,struct file *file)
$ d, Q I- z ~2 a. \; ?5 t{
* s" [) _9 Q2 V7 U printk("release success!\n");
; e/ K% B4 e' I return 0;
0 G# R! t! q H7 F/ G}
2 R: F% Y3 h x
, b. L; f5 ]# j- B- }* _static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ G6 y9 |8 c$ z6 j* g, |9 y2 e
{% z, W+ W) R& `2 i
copy_from_user(&DXR_data,buf,len);
6 n- t0 w: m7 P& O/ L$ s iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
6 j& S" J* Q: Z* p2 U- R return 0;
8 f# }, f9 k+ G* D- P% ]
0 h: i$ G: J2 ?: o. ^" C+ F2 r* i9 k E}* X3 o( @: g; [8 V2 T
1 Q$ Y# t- h( Gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)9 X, {9 R: x1 B! c" J
{ ! b: w8 F/ P2 E: U+ @
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
: N2 K; G0 J: s3 L% O% f copy_to_user(buf,&DRR_data,len); 8 S; g( F: `- y: i7 a2 k
return 0;
% v2 K5 n( A( N: y% [- a+ K3 x}
) U7 J: T) I2 X* \0 I
: A( U3 E; `! V$ L1 V
1 _4 O/ ]$ `* mstatic struct file_operations mcbsp_fops=
) s& M0 B" R; e0 e0 X% A: R{
4 k0 Z o) {; d .owner=THIS_MODULE,
( X2 p; u5 U' b, Q& v2 S4 [. T8 U .open=mcbsp_open,
- ^: o1 N6 V% ~1 t9 O' l5 n .release=mcbsp_release,
1 \+ a& `* j; Q: {5 B2 D& e: } .write=mcbsp_write,
# A" Z# l( w2 U; k3 Y .read=mcbsp_read,! A) {- b0 Q1 r. h- Z) H
};! d' `0 T$ D* Q" S
static int __init MCBSP_init(void)
$ |; @( c( f6 _( j{
, c9 E2 V& }9 x9 I int ret;
1 S) W9 K" ~6 e ~7 X+ O! A: j7 k4 I unsigned int PINMUX1_REG_old;
" ^+ }( b2 a% G' E0 O9 |% }; g+ y unsigned int PINMUX18_REG_old;8 j4 D$ m$ r) b% W6 b
unsigned int PINMUX19_REG_old;8 t( o& e: J" m! R
unsigned int temp;
; G8 c. o. S9 o8 W1 e& q if(MCBSP_MAJOR)
5 z7 E9 Q0 n) J& ? F {9 x& z. F& { b# ?
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);& S* @, n$ m; `2 r! Z6 T0 L
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
[$ U. l! P- _4 l }' Y6 v4 M0 U1 ~
else7 E0 y- \' k; L$ |7 h J) x
{# a, d' b; `( H' N% ^: w8 x
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);) @/ k7 D$ S& j9 V/ i6 h$ q& h0 G6 u) X3 ^
MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 e' `* w- k$ I4 t/ B" N }+ Q$ P& E X# L2 F& X
' U) W$ @1 _9 ]/ p1 r
if(ret<0): @- Z( I' L+ M6 u5 d5 L& Q5 V0 C
{4 j8 M9 s4 O* F
printk(KERN_ERR "register chrdev fail!");
2 m) ]& Y V5 w- x* M9 R! h return -1;
: I' v1 Z! [4 m. h }& `& x/ J( L4 i/ Y1 }
: g% {& r/ W* O+ {# B
mcbsp_cdev=cdev_alloc();3 V O. a! e: P$ g& Y0 t" q4 B
" x. q3 Y+ T3 y/ N# W
if(mcbsp_cdev!=NULL)2 [1 N0 k; s! n! H( ~: B
{
5 A! j5 {, s8 L: [0 F cdev_init(mcbsp_cdev,&mcbsp_fops);
8 B) O" _7 i. w: y1 w5 V, G mcbsp_cdev->ops=&mcbsp_fops;
9 X/ g# ?: m* y mcbsp_cdev->owner=THIS_MODULE;+ [; a. Z4 c" q* {. s- S8 I' c; k
0 c8 Z0 q9 v& R# h
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)); `3 o. i) f j# z1 K
printk(KERN_ERR "register cdev fail!");. F. j6 t: D* \, L
else6 d7 X6 C* D# y3 M1 a( [6 R9 ?6 G% a
printk(KERN_ERR "register success!\n");
& V1 H% ^! M& _5 h }
m7 @3 x# M4 a F6 _* [ else
2 { H1 h8 I( F% L) U {5 u6 j) i j" k" \6 J, |5 t
printk(KERN_ERR "register cdev err!");
5 I( _( s) Z) E8 \- ~9 O return -1;7 {& m! T+ C8 [+ {& v4 y
}
. M. k) T% ?. p5 [
2 A" x1 P+ u: M+ V mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ W" } L6 t2 [4 H% i9 a
if(IS_ERR(mcbsp_class))6 b1 M6 Q$ q, E t3 Y
{
- d2 M3 v4 t$ N9 T# r4 J5 b# b printk(KERN_ERR "register class err!");0 V, d6 o, S! P
return -1;
1 R3 N" z ~6 X4 }" U* K }/ T- [ b1 o& W& i4 z6 a
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
4 D( R( R5 f9 G0 b0 ?3 Q8 O6 D
4 L8 o! i, P8 _5 e //PSC
1 p' B+ `) G( }5 m! d* T1 s //add Enable MCBSP1 ]1 @+ D. z8 S) h" K6 H- `
//test
c! v. [9 p9 `0 C: x- _ temp = 0x80000003;
6 I8 ^; ^3 M2 y! ` b3 ` writel(temp, IO_ADDRESS(MDCTL15_ADDR));% r% M* V/ T& A, i
temp = 0x00000003;, \ {' q: Y u( E: w* ?
writel(temp, IO_ADDRESS(PTCMD_ADDR));+ G, v5 n7 e3 a. T- U) E
) n2 g5 _3 |8 ]/ E( }0 x* P) W. Z. k
temp = 0x001FF201;- I- Y& |" b( g6 D# m
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
7 `" n! C' R: t; Z6 Q
! Q& s0 ^2 Y# v! j //PINMUX
3 q* F7 W8 l& [1 P //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,5 M5 D( h* e+ w/ |* X; U8 [. W
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); + ^( r/ {% d' j8 [8 l ~2 E3 ], t; M
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
+ q# [% K/ G2 f writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);% n* m) [" r, D# r$ @& f% W! l
; G: L" P$ ?( o; C! B/ R( s //SLEEP_EN,EPR,L138_SHK1,L138_RC
1 \+ n' F8 y0 y/ \, s PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); % K) k& S: [+ P0 K' v
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; + W( m4 I8 t& v9 C& ]( {
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 o. }' _0 Y( `, Q% l$ [2 u: o3 V3 Q
( U" l1 m8 ~- W) S //RESETn,L138_SHK2
4 m- Z5 w: p' }7 S: a PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 x& W* `( ]9 H- K9 s5 d1 @. K. m PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; . b y1 P& _/ }
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
6 P& U0 x1 ] \" @3 z; ]7 T3 |7 j
* _# i8 h( k7 H1 @% N0 P 8 T2 l5 ?* Q+ |: N A8 j
//SPCR Register
8 _( [8 x; `6 W8 v/ Q0 a- E; z //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset( B7 w. W1 D9 {" [" T$ S2 r
temp = 0x03000000;//(DLB=0)
1 b& D* @0 M ?( s( X8 }( P- i // temp = 0x03008000;//(DLB=1)2 G$ O& M& d; C9 \, @7 a
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
$ `: I% g/ G9 h9 s& M7 `9 m temp = readl(IO_ADDRESS(SPCR_ADDR));( {# R6 d5 v. g# F8 _2 ^
printk("temp=%x\n",temp);! B7 n4 l$ c# L8 d8 g9 M
( c" {- L* H$ ]; O7 X //PCR Register
, }( H& Y6 E; c( [ //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0# d7 v- j! X+ z: e, F
// temp = 0x00000F0F;
% G" p3 L2 @& S4 N temp = 0x00000B0F;
: l) j! i0 G8 ^; K3 J writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized " I( _3 ?) s' C0 \* W" z% S+ |1 p
temp = readl(IO_ADDRESS(PCR_ADDR));2 P% G; z( y, g& e8 v
printk("temp=%x\n",temp); . J. T+ [; |: m5 B* k2 u P0 @
//SRGR Register
# b+ d0 _# K! P# i3 @; _* t1 F //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
# I7 `6 M6 o& B$ r* u S1 ` //temp = 0x301F000B;6 o( Y u/ z9 e: g3 {. t* ~
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized , S) S$ h6 y! w# @7 C7 b ~
temp = readl(IO_ADDRESS(SRGR_ADDR));1 T( _ x$ ` v# q* d
printk("temp=%x\n",temp);8 ?7 T A/ y7 a ^1 N5 F
//RCR& \$ Y7 Z: w# Y: S
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
5 z7 t" ?' Q5 n5 t //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
$ E% S4 f; w9 |: i temp = 0x00440040;
L0 p9 a8 R9 b! d! X writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 0 r& ^7 I7 V0 {. d' ~ `/ V
temp = readl(IO_ADDRESS(RCR_ADDR));
0 y1 Z! O. f2 p1 m3 F printk("temp=%x\n",temp);
. B4 u. [8 K$ O( [! _. c6 \ //XCR
7 ^. z% X2 R+ `) c. q" s) W //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
4 i+ l# O: B. d% k' q8 I7 A //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
; @# q- \) L% }* z$ L1 q" J temp = 0x00440040;8 S/ o4 \1 l! o
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
- g2 u( [& g/ s' R! A# P) s* u temp = readl(IO_ADDRESS(XCR_ADDR));
, T2 P0 f3 Y! N4 a+ D printk("temp=%x\n",temp);: n* X" i' R2 \, t) L
udelay(100);) w# N9 W7 Z& o" {; ]( z; b0 R
//SPCR Register9 z' k; f, g0 S+ C. J: J
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
$ Q+ q6 q7 ^9 C! z- Z* ^4 n9 c9 I temp = 0x03C10001; //DLB = 0 VS DLB = 1
2 a8 s# X% B# A$ j9 R9 h. y writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled2 d0 D( b8 d+ N( y8 }, t0 O$ C
temp = readl(IO_ADDRESS(SPCR_ADDR));
* ?( d s- v/ V( N; h- b, P printk("temp=%x\n",temp);
! }! p8 L/ T3 f2 @ udelay(100);' ]. d8 b' x3 x! e" `' X
) E3 r1 o6 N% r
//set GPIO direction
@2 J( z4 u- ]( A' [1 K temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));. L) f4 ?; N8 p$ d! f
temp = temp | 0x00000100;//EPR----input/ T2 g( L' K0 I: z, s& A9 U$ @) e) \
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
2 h+ \% F' t, @ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ; f6 a1 w4 q6 L. _: y- m
$ }! G0 H* p+ ~) D3 e1 Z1 o/ } return 0;
9 B- S8 w$ E% k% W- e}$ a3 y& ]- {" Q' ^+ E) R* t
static void __exit MCBSP_exit(void)
/ w% ^( q% Z+ q$ q9 q' k{
6 W2 L9 _" D% V9 H: O printk("mcbsp chrdev exit!\n");
# ~7 q0 s* x7 A# ?: i0 S# | cdev_del(mcbsp_cdev);* j% m7 n" S* N) e8 ^! I( E3 }" P
unregister_chrdev_region(mcbsp_dev,count);5 b3 B0 m7 H! g1 @: B' i+ S- ~2 m% w/ @
device_destroy(mcbsp_class,mcbsp_dev);, f0 g. A; m6 r/ D3 `
class_destroy(mcbsp_class);- Q( I4 {# I' p# s6 _( H2 Q
}
) P+ a8 G/ u' Q" n- C. o4 Hmodule_init(MCBSP_init);
7 o- R; A8 g1 l9 L0 {8 Lmodule_exit(MCBSP_exit);
' }6 q3 ]+ |7 h" t5 b. ?8 d4 _* N" w1 @
MODULE_LICENSE("GPL");
& Q' \$ N& c1 I* y; R
$ a* R0 q! G& h F8 e: @" b" g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。) W8 ^! ]! |9 _% i
我的应用层的测试程序如下
1 s# V+ i9 E. \. h$ l#include <stdio.h>
; \0 `% y) b2 z0 f) H: m#include <string.h>6 u& ~; Z+ E( M
#include <fcntl.h>
( E) ?8 [! G# y ^2 P; f#include <unistd.h>
9 _% a, e- w5 x7 w5 q: g# K#include <signal.h>7 [% N1 C# a; r( E$ V
#include <pthread.h> //线程
# r: }$ g+ V5 f4 J0 }4 o) f#include <stdlib.h>
* L8 V1 x: q; N/ k- t#include <pcap.h> //捕获网口数据+ \, m0 |( B4 X
#include <semaphore.h> //信号
* Q- `0 j/ p3 y1 ]7 F. [+ j#include <sys/types.h> //消息对列; e, h9 `5 h% @5 N# ]# r7 ?
#include <sys/ipc.h> //消息队列
; n/ H6 Z8 i2 N9 B* l- y; Q; E#include <sys/msg.h> //消息队列
4 P. u y3 e6 S5 S- m7 }/ p#include <sys/select.h>
k7 @/ ^" I; `1 i# i4 b#include <sys/syscall.h>6 N0 I" O8 i2 b' ~; x
#include <sys/stat.h>( e5 T# O6 C0 u5 M6 t7 t! e
#include <sys/mman.h># O2 H, [, F3 T" i" p2 E, p
#define msleep(x) usleep(1000*x)& n4 w4 E- H v! {
g R8 ] P+ }; f, T8 _ y% Y/ sint main()4 d% [2 [# A3 u1 O
{
6 i4 H! x9 x% x; B8 s$ b+ o //MCBSP,ARM与AMBE2000交互设备+ R% R3 _8 D* \$ k- p8 l$ F
int fd;7 d* z& q6 f& l0 T3 \/ A2 u2 `
unsigned short data_write = 0x5555;% y/ C- {7 a2 E7 j# @ a4 w
unsigned short data_read = 0x00;
, G. H0 [0 O, t fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ ]) A0 n& V' L // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 |) f; W: ]& G1 t h, e
% ?& O A; I! Y% v% { if(fd < 0)
9 R) d% d- T) u6 v5 a {
) |+ S7 U' ]6 ~ perror("open failed\n");0 c, h% m& k; r& |' R% v C
return -1;/ b# h9 G; C/ _5 K- ^' R
}! t. h5 d) V/ O$ t) w% J
7 u' b% W( c6 j' v; I! } while(1)
' A i1 L7 D' O0 f {
( `" N! ]8 t& L ' k/ s. u: |6 W. K5 X+ d+ ]# I9 @
//AMBE2000每次读写是24个字为一帧
( ]+ Y' E+ _# c0 v7 M2 b //写数据时将数据在底层存储起来,等到中断的时候再发送
. X, d: r3 x# x; X/ a* V //AMBE2000输入数据是以0x13EC开头的7 B. I5 v7 }% N8 ]; Q; ?
write(fd,&data_write,sizeof(unsigned short));
* ^7 G% t; k- j$ S9 j' \ . K) e; s8 P5 t: q' E& l4 s& D
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
! q1 B5 f- V, G1 p read(fd,&data_read,sizeof(unsigned short));
7 q5 ~- e7 x' f1 ]1 {; {4 w, D
0 \4 u( f3 Y7 g0 f+ o# u if(data_read == 0x13Ec)1 f+ j0 @. X( f& B* V- }
{
& K/ t) r# P" b7 b Z: d4 j3 G
& W7 R8 v8 d, _. y3 k% i, m7 C printf("data_read = %x\n",data_read);
' X5 C4 Q2 X: c) D0 K8 S }
r. x, D1 J. Q5 a, g- O ( |# x6 j! P7 K6 B* t4 ^
msleep(10);
# e. O# K Z3 E3 K+ n
. h: \% L* J" D9 S, t /*
0 f* ?( D ]+ `" |+ h ioctl(fd,1); & V" _* Y2 E* ?& g G( o' k( P* i
sleep(1); K' e9 N- \$ E4 r$ p
ioctl(fd,0);" u" Y0 Z9 R1 g2 m+ v3 P
sleep(1);6 g2 q; L& k0 R& u, [ x% l: C
*/ 2 n$ H: P( G$ @7 U
}
$ s9 u, F( u/ |; o return 0;
2 s; Q) ?7 ^. e4 E3 l ! R: B3 w- ^: w
}
/ n. f6 H& A6 C( X7 P* w3 F
" v2 q% q9 W- c% E多谢各位指教,谢谢! 急
( O) R. w2 \- e2 H4 U
: K' C# a d' d4 j9 o7 \8 i+ u) n, w5 {9 X# F# Q' i
+ M% O+ O2 d' q1 _* k8 s$ H2 j0 C+ t+ M7 R6 s$ s" b; l! h
! _* M t0 T* s8 N
|
|