|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 M8 P- T+ J2 E+ Z
/*
' r/ R, }5 g" n9 ~ * Copyright (C) 2009 Texas Instruments Inc
0 K+ o8 H, U2 j *( }3 Y- U* `! i
* This program is free software; you can redistribute it and/or modify
8 K9 i: E) P" C$ ^% s {. L * it under the terms of the GNU General Public License as published by' C5 g4 M, _- v" O: c5 U/ T/ Q! e; c
* the Free Software Foundation; either version 2 of the License, or
7 q/ E) y9 @ D4 P. l( l" a% Z4 o * (at your option)any later version.5 N5 K& T' O- W, x I `9 [
*
: c) {6 G; ]# h) g2 n( n& j * This program is distributed in the hope that it will be useful,
* a6 v! Q' @& E* g, U% J! V * but WITHOUT ANY WARRANTY; without even the implied warranty of) ?8 B: t6 r: V: F7 F4 m7 v
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the) A# b* P+ e8 l+ Q \4 ~
* GNU General Public License for more details.
, X8 k8 T5 G- c7 r3 l8 ~5 T# C ** U! x8 @6 ~! L! H5 t- ]2 I7 {6 R
* You should have received a copy of the GNU General Public License
+ k6 A/ U7 w2 J4 g5 _* k" |- {- {4 H * along with this program; if not, write to the Free Software
$ u* E6 Z5 u$ k% _7 x * Foundati
3 r$ W: n/ d; b7 z*/
& N2 \, w1 d+ i# i#include <linux/module.h>
( U, q$ d9 D* i3 ?4 d9 D, `#include <linux/init.h>6 V; ?3 f4 N' ]/ K5 W2 f4 r. W4 _4 o
#include <linux/errno.h>- h3 v/ E5 z+ R
#include <linux/types.h>' d9 C1 l* c# S8 f4 d8 _! w
#include <linux/interrupt.h>
: M9 q; Y* ~( l/ c#include <linux/io.h>
& n; x0 V5 U" E" U0 s8 \' d7 R#include <linux/sysctl.h>
% A- E/ j; l( W#include <linux/mm.h>
# m0 j8 Q/ g9 }& I/ y( R/ A#include <linux/delay.h>
' |8 Z5 b3 ^4 W# B#include<linux/kernel.h>
" H G+ I3 Z! _+ K& @- [# H5 V' ~#include<linux/fs.h>
6 v$ f4 l2 p% @$ V; R#include<linux/ioctl.h># J1 c7 b( {. l" C, C9 v
#include<linux/cdev.h>+ D2 {' Z3 T- J, o. d
#include<linux/kdev_t.h>
8 b6 u* B5 ~% x$ A& e#include<linux/gpio.h>
3 b. y' ?% P" y* ?7 i- d1 N0 T#include <mach/hardware.h>
% C( F' d3 @7 X: Y#include <mach/irqs.h>
# b0 z5 I+ H! u$ V
( i, X) R5 B, V; S: k3 t+ R# O, }#include <asm/mach-types.h>4 L$ { {* `- r- t
#include <asm/mach/arch.h>; X' o2 [1 G" U9 J! v
#include <mach/da8xx.h>! a! _1 ~. ~. ^/ B) `( y7 U
#define SYSCFG_BASE 0x01c14000
: M* K, ` x ~#define PINMUX1_OFFSET 0x124
% |# _1 v% j5 z5 o5 J( p E#define PINMUX18_OFFSET 0x168 % I+ q5 s# S1 P9 G0 d; n+ Z5 U6 ]
#define PINMUX19_OFFSET 0x16c0 H5 \$ v6 g; R5 r' m
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
% X+ H* Q- V, J( p9 [#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
: J$ {/ Z* _- H% s9 V#define XCR_ADDR 0x01D11010 //MCBSP1_XCR' a% B+ n9 u0 e4 K8 d2 }6 r. D
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR! J& g7 d9 W9 F! `1 P, m
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR0 v9 m7 o; H t1 b- D0 ~
% B, ]. w R) L% | M
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
. z& F6 p7 @5 J- ^$ v% y {#define DRR_ADDR 0x01D11000 //MCBSP1_DRR H. j! U k. }! N+ Q0 q' v) |
//PSC
. `% w1 a, q# C' D3 f5 l: `#define PTCMD_ADDR 0x01E27120 # L) J) k9 e& @) U& E6 q# ~
#define MDCTL15_ADDR 0x01E27A3C
5 b: o: U$ ~5 Y" W$ U, k% d#define PDCTL1_ADDR 0x01E27304# T& u" c2 q! E% q2 \+ _; R1 o
//GPIO8 direction
3 U6 @% n& T4 z#define GPIO8_DIRECT 0x01E260B0$ _' [; \& Q& _% X6 G! c
#define GPIO8_OUT 0x01E260B4
7 i4 P" l/ R9 p: v#define GPIO8_IN 0x01E260C0
?& E5 T" h d: C* ]3 L% |0 }1 d2 Y6 Q+ T
//#define MCBSP1_RINT 99
5 G) _) z: H2 \" w, ~1 l7 V//#define MCBSP1_XINT 100
0 Q6 _2 U6 ]* t" dstatic int MCBSP_MAJOR=239;' k1 F' a- ^# e
static int MCBSP_MINOR=0;
" E! V1 c7 |/ O& p5 V" h1 M! V: @7 `static int count =1;* @6 a" ?3 j6 e: I T4 T
9 V* u9 ~$ Y( S# j* Q/ z#define MCBSP_NAME "MCBSP-device"
1 t# x9 N& F/ i( n; M: o% n
: T a& w( R, u" K: T' ]- S7 Zstatic struct cdev *mcbsp_cdev;) ]0 w: Q Z( A9 v* X" P" o
static struct class *mcbsp_class;
/ \; ^. p2 ?( G* i# }! Z Ystatic dev_t mcbsp_dev;
) n6 k- l$ \- M& k7 wunsigned int DRR_data;% e8 H5 G0 ^# h$ n
unsigned int DXR_data;% F0 O7 S# {3 j& w/ C% Q* q# q
static int mcbsp_open(struct inode *inode,struct file *file)- }6 a7 X C9 P. J. b# W- m
{
2 K! r$ C q w; x) R9 Y5 S% q
$ A( |$ r$ \7 q e$ i1 ?% W //interrupt enable,initialized+ `7 z6 N, ^& J5 k8 m& r: D7 ~0 X
unsigned int temp;
# _8 F7 y0 k# v8 A //SLEEP_EN(GPIO8[10])---0
) c; L% S x2 K& | ^ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 X8 g- d7 u; O9 T' n temp=temp&(~0x00000400);
c, J; r+ n! a! [- |/ j% o* x __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 M) ?. [" p8 j: {0 B //RESETn(GPIO8[8])----0----11 {' Q- J' b5 n' B9 q$ p
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 y h' u# f/ W* i: m2 y
temp=temp&(~0x00000100);
- j3 w ]; @( q I# S __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
# r" V! K+ Q% G( k R. Q udelay(100);
: h I$ E: u, G9 ~0 T, N temp=temp| 0x00000100;
# ] J( g" r+ H __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; |1 @* n8 o& W! ?- R& L udelay(100);3 j& a' e9 `/ ~" f. H& c) m; s1 z
printk("open success!\n");
; ^0 A7 B) r, @+ D3 U! R* P return 0;& ?8 Y, n8 E# G& s, y; u% O
}
1 |. G: h9 @+ h' d. y2 u1 ^1 A! V. r
static int mcbsp_release(struct inode *inode,struct file *file)( C: L+ l3 l: E/ [4 e( C
{
9 {3 F" V* y* Z printk("release success!\n");
& {6 B8 s, c7 U* v* H" y& ?3 q9 a return 0;* T' L* X: Y7 p4 \
}
+ }7 w0 s# V/ |/ y7 z8 M
7 C. j! |" x b7 Pstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)! a* I5 p, m* @, @2 `
{% z) U, Q2 I* P
copy_from_user(&DXR_data,buf,len);
* R* o$ X0 q+ ~0 N: E f iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
# T/ { v0 H1 T" ^/ a return 0;
+ P. r5 B- P j# ]4 l$ ?- E+ x4 c 7 u+ |8 m+ w0 Y8 k& G( X8 w1 g
}! a0 y1 F( [1 m& v$ R0 ?" f
9 S) V& i4 H- _& ?5 h( ^( p- F
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ x7 V3 l! ~* w( n" e{
4 J) o$ `! ~+ I4 T: \! n: O. y2 Q DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));* f3 s( E, m% v4 L7 u" l6 z
copy_to_user(buf,&DRR_data,len);
2 l! s! e8 P" D% | return 0;
l4 a1 d, N/ l2 g9 r" A& e# E}
( e9 W: ~' C' j+ n& r/ @+ ^+ r) o5 _0 ?$ s
5 I' C3 X- o" O0 {6 {static struct file_operations mcbsp_fops=% J, _/ Y/ D& s0 ?/ t& h
{% N! G# {& E4 ?) c- S
.owner=THIS_MODULE,
' v, K9 _5 A; o2 w% A .open=mcbsp_open,5 h5 c' O3 ], p6 P
.release=mcbsp_release,
/ }$ d6 n9 N K. X9 ^ .write=mcbsp_write,5 q2 M9 b6 O) ^4 L
.read=mcbsp_read,( }8 x0 v1 m; h( Z! B9 P
};
$ i( A' l2 B( T; ~static int __init MCBSP_init(void)0 z3 s1 B; X v7 o4 s! \2 v* i
{
4 l; K+ b# x0 B2 b# `1 q5 z int ret;
5 {* k" k/ v1 \. n/ m% |/ m unsigned int PINMUX1_REG_old;
' `3 ], b8 f8 X- h) w. n: R5 O unsigned int PINMUX18_REG_old;
3 j, `$ a6 n+ b) c! q unsigned int PINMUX19_REG_old;
% w$ N7 |. H/ z+ a- P unsigned int temp; % S' Q* ]# _- R9 j: N# V
if(MCBSP_MAJOR)* ?9 v b4 S* p! u
{
& C) D5 F* o7 |1 a mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' ~$ j# R/ ^/ ?7 M: V ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
" b6 n" |$ A) @" ~: \ S9 }' v; ]4 x }' r a) K: m7 ~6 W
else. \ K0 Y4 [3 z7 Q9 _
{
, K! w3 R" o w! u2 H' e ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
" _ ~2 ~ u" Q3 E6 h6 b2 x6 ~ MCBSP_MAJOR=MAJOR(mcbsp_dev);. L: s7 K0 u/ a5 `7 }
}$ ~) F; l7 Y2 c
- I- z4 N ~6 U if(ret<0); U* p) |7 a8 u9 A! y
{ H* D+ I. c2 a6 D" E* @( Z
printk(KERN_ERR "register chrdev fail!");6 V" x- F m3 d, |! K8 R8 V: \
return -1;" |! ]$ |+ x# S4 j! Q7 d X
}
4 x/ m% i T: Q! i6 v2 A
# |. t6 _& L. ?5 R/ y mcbsp_cdev=cdev_alloc();, P# o1 q# i5 {/ H2 B0 X( ]6 H
& ~5 _7 k" j3 n5 [& Q6 F
if(mcbsp_cdev!=NULL)5 B K7 ?& C: q6 M4 Z9 E
{
5 @4 F* ?* c9 G: W y; B cdev_init(mcbsp_cdev,&mcbsp_fops);" I. E1 V3 f( O- H, g1 y
mcbsp_cdev->ops=&mcbsp_fops;
. g" f- L* S& J. f3 g$ e. v mcbsp_cdev->owner=THIS_MODULE;
: t: d7 ^! S1 H, P4 U2 [: I 6 g9 `6 I4 P" h: I p
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))+ S6 g, S3 D- N1 D, P- V9 N8 a5 N) O
printk(KERN_ERR "register cdev fail!");3 {: R3 j# J6 b' T+ Z# f7 T
else6 t8 V" G/ w( n }+ M2 F5 Q9 E
printk(KERN_ERR "register success!\n");
5 w. g9 x# H# \- | k" t& [# O }! }. K, \# _" h6 y6 b. j( @
else% ]( W! ~' X% J( a6 a' O
{
0 m1 U7 G c5 ]. B printk(KERN_ERR "register cdev err!");
8 `" Y3 ^- R& b# M m8 d; j& E return -1;
4 S7 P: h: I0 R( l# ~) I }9 h8 ?. |! F% V. o, B6 ~7 J0 @; Z
& I/ O+ N$ N4 r% p: X1 H6 L
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);9 n6 ~* {8 j( O* x+ M: c
if(IS_ERR(mcbsp_class))
3 B6 M. P2 A0 b {# T/ X9 h' l1 e. a
printk(KERN_ERR "register class err!");
/ y/ Y( g; b( g! @" n) }6 I0 N9 D, q& ^( j return -1;
% N/ D5 h! q. K. n$ P }
5 l; U; Y; l4 G3 R: c$ F* y, \% N device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 O8 `+ I; O0 E" o2 d* d+ j2 w
: i5 J* `, N/ ^3 n( v1 l, G! | //PSC
: Q9 G6 B& s5 p1 I //add Enable MCBSP
, O( t3 X) d" O$ h1 y r( V //test
- \) t3 E- o# K- C( q8 D; V temp = 0x80000003;3 s3 F& h/ C; k6 w6 w. Q) Y$ v8 s; R
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
6 ]% K2 o ^9 N: w+ v0 s" z temp = 0x00000003;7 S$ z: L# I$ v4 C9 T! `& }
writel(temp, IO_ADDRESS(PTCMD_ADDR));2 q3 O" b! z+ r
% M8 r, F2 a4 r9 t/ M `
temp = 0x001FF201;
/ g5 v7 L' u: \7 }, B" e6 P- p7 r writel(temp, IO_ADDRESS(PDCTL1_ADDR));
8 B, Q/ X j' ^# i3 m- ^; n
1 M& K7 N6 l9 T3 @ //PINMUX ( z/ X7 |# `# I
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: T8 i! S, c( B* I: j
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
6 n8 u G6 l2 Z8 {8 _$ v$ C PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
1 B" k1 I5 A( w% a; X- V) F2 l) S writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);; N2 H9 T* Y& c
1 s5 N- D0 s0 Y0 ]
//SLEEP_EN,EPR,L138_SHK1,L138_RC
. b' O9 Q9 Y- M2 C! U9 E) ^ PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
T9 I) d h# ?, K& t PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; . u+ i2 s9 q+ O( B- F% p
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% s5 [6 \9 T3 p$ @ % x0 v5 q+ @, D8 s
//RESETn,L138_SHK2
9 `0 c7 e4 m1 {6 D ~ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 2 `0 r% ?! @$ K8 b; @% X8 C Y3 O8 n
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; `: P; Q* n. Z" t% \ a& j& C
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);+ @, Z0 T) u& c& [
0 d; c/ K1 ~$ _" m
7 A6 b' c4 {7 ? z& ^ //SPCR Register
: f# U7 E1 Q0 m' {" l1 V" j2 V. O //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
1 t6 M- b. C2 k f. q1 W( M* f- K temp = 0x03000000;//(DLB=0)0 j1 l; r5 T1 S1 R1 {' a$ r
// temp = 0x03008000;//(DLB=1)2 W) ^1 R) Y- y" @
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
" a7 R" K* |0 q9 z t; ]7 M temp = readl(IO_ADDRESS(SPCR_ADDR));
6 t; @$ V6 W4 \: E: ^% o, K printk("temp=%x\n",temp);% W8 u# Y; I& n4 f! n8 W- c0 @$ G( i
# f' W8 F5 H6 j" f; n //PCR Register
n! Z$ b7 W: `# p5 @! j //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0' ~% D" N6 U M; h3 p# Y- t
// temp = 0x00000F0F;
& z, T; |: B, \, N9 M' _- A temp = 0x00000B0F;
! a- K2 K/ f; Z, P' t7 G6 L8 ^% Z: a writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 2 `# l' n) j8 R
temp = readl(IO_ADDRESS(PCR_ADDR));
. ]) f+ p7 Y: }' m# [! O printk("temp=%x\n",temp);
# o( ?1 N2 o/ B0 a, B7 b6 v //SRGR Register1 i2 v. g4 c9 P
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
9 h" \# o) h9 {! G5 h5 _' ? //temp = 0x301F000B;# d& q. X, J" i4 _( v4 Y
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
, b" c8 `7 Y, E* {* _2 Q+ g+ X7 U temp = readl(IO_ADDRESS(SRGR_ADDR));- l, q; E' N% K" ]3 X e# q
printk("temp=%x\n",temp);) |, n( t/ L/ r
//RCR
% V$ i, M% S1 m, p+ y //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,+ E s" _- ~+ m4 b- i
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; e+ ?0 g# w. Q6 M# O: K* g" ~7 z temp = 0x00440040;( y( f9 ~/ i& q7 D7 L, q
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
; @6 b4 O4 I: S3 v' Z2 P temp = readl(IO_ADDRESS(RCR_ADDR));* G+ V3 Q3 F4 z
printk("temp=%x\n",temp);
- p+ j. B7 d/ g7 B4 D2 N //XCR
* F# O- W. B j9 M) R0 a5 U //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
4 e: {2 d L' ]$ x9 _/ F2 t3 v& h$ t* `# g //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
/ b5 [; P# s5 ^% D5 n3 w temp = 0x00440040;
* j6 p. _ g" p writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
( a. k( @$ j7 R' m- ]3 Q temp = readl(IO_ADDRESS(XCR_ADDR));' n1 {& ]% J N h) T
printk("temp=%x\n",temp);. U% ]+ j8 w8 r
udelay(100);
" @7 Y+ a$ V' P0 Y. g; m/ z- s' r0 N //SPCR Register/ Q" W& P3 w3 R/ w l* u7 X
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
! K# Y6 Z9 m$ v# T9 P temp = 0x03C10001; //DLB = 0 VS DLB = 1
; r2 G3 i) B& _# C writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
% ] S# h8 R( T$ M8 R& j% B$ p4 o temp = readl(IO_ADDRESS(SPCR_ADDR));5 e" S; M' C. S$ m' N. O `- Q
printk("temp=%x\n",temp);+ l' h+ o$ s; e2 o6 M* K6 ^
udelay(100);$ l. [0 ^0 x1 L' B$ }
* C) d" ]. I9 P: T ], s6 s
//set GPIO direction
# Z+ z* Q$ Z3 T, r' I8 l temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));/ K# t4 N. |+ y( B
temp = temp | 0x00000100;//EPR----input
. o4 I, J" ^5 [ temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 w: z& c* E) h) y __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); * G# Z; Q) A( i
5 ~( N; ` R. Z) ?8 a
return 0;
. A8 i, c! M& k4 k6 C}
' ^- b3 F" F! g; K, {static void __exit MCBSP_exit(void)
5 O, I! Q' r. Q$ N! w# o{+ N; H- P7 t) {4 T0 b5 b& a
printk("mcbsp chrdev exit!\n");4 W0 ~& f9 `' \/ R8 Y; \
cdev_del(mcbsp_cdev); |9 |; A, w* |& u. i1 \
unregister_chrdev_region(mcbsp_dev,count);# K+ l0 z& [8 w' N- R. N
device_destroy(mcbsp_class,mcbsp_dev);4 t& c' j; j9 `$ V" v
class_destroy(mcbsp_class);
& u5 |# @: N) ]* h# O: ^5 X. I7 O3 t}8 o6 @0 p. T8 g9 j1 c1 v/ L
module_init(MCBSP_init);
9 k- \& X; \. V" @- q0 v; r" Zmodule_exit(MCBSP_exit);
7 i# q1 }+ E! z# c9 p# D$ O% J$ n" {8 E2 J1 p/ n! T
MODULE_LICENSE("GPL");
- q6 P6 t a7 K8 e* \% W! {( d' \( Q* W M" k8 v
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* f7 s2 T6 S3 X( [& b5 Y
我的应用层的测试程序如下( W: P6 z7 m/ r8 c8 C8 t+ O$ O" U
#include <stdio.h>3 V% t+ @! c/ j g& i: U' u" {# A, o) I
#include <string.h>/ e; c9 ?7 q$ b
#include <fcntl.h>6 y8 f4 T4 u/ u0 b( K
#include <unistd.h>
1 X) j N: p7 ?8 y6 V, H#include <signal.h>3 v# n, }! r: B9 h& y: }
#include <pthread.h> //线程4 g; P$ {2 \4 b$ G
#include <stdlib.h>- [( i$ s3 E1 l5 J9 c6 |1 H, S
#include <pcap.h> //捕获网口数据
- Z! e3 u$ F5 o5 T9 g#include <semaphore.h> //信号
8 g( l/ ` C6 {. N4 b/ m, o$ r5 P7 `#include <sys/types.h> //消息对列
% K8 s& R e ^/ }3 X4 F$ r#include <sys/ipc.h> //消息队列( O- T$ N% ~2 b. ]
#include <sys/msg.h> //消息队列# [" Y* ^5 A* e& E8 E% \
#include <sys/select.h>
, m: R4 \& n; O1 J6 y. T2 d" L& o#include <sys/syscall.h>
g) A! T, Q Q. x" z8 Z#include <sys/stat.h>; `: X& ?$ ?& D
#include <sys/mman.h>. a4 Q. n+ f: ~: j3 U- d! ~: o
#define msleep(x) usleep(1000*x)
; F: ?2 {& n9 \" ]1 t
! G7 n7 A- I9 i+ Z! r4 s( Z& yint main()% H# A$ U/ O6 S* H/ n
{ $ [5 }: |* `3 C& X. K' o
//MCBSP,ARM与AMBE2000交互设备% T0 A# r) `2 e$ |7 w$ ^
int fd;* {# z7 Z* p3 g o" @9 T
unsigned short data_write = 0x5555;
: `* V8 A& @) W: Y) X unsigned short data_read = 0x00;
. }" A3 J+ q6 H% B; s fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);. P) N" U6 ^& @ S
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);7 R# s7 B, f3 |5 N9 P
/ h* W6 I& [. h if(fd < 0); G- t# q1 }; I: x1 r2 ^
{
4 j& B# [' j, B6 | perror("open failed\n");8 ~' C1 w' o. f7 v0 [: I
return -1;$ g- ]3 m; L8 p4 @
}, _9 Q* s' b ~5 n5 M% I1 u$ X
5 l$ {4 O+ w" r, _
while(1)5 j7 X( c1 O4 ? Z: k
{
* ]5 W* _% Q4 ^7 w$ n & I0 |. f% c; d: `& q5 |
//AMBE2000每次读写是24个字为一帧
- |& U( c# I8 J5 x //写数据时将数据在底层存储起来,等到中断的时候再发送
; d9 ^3 \: q! a9 J6 o2 |3 R //AMBE2000输入数据是以0x13EC开头的' z/ P! v) `- |3 [- Q
write(fd,&data_write,sizeof(unsigned short));
1 l ]+ p% _+ N7 p6 \
* f; |, O, l5 q6 W% b! r //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
3 I! i) h: w, T4 d read(fd,&data_read,sizeof(unsigned short));6 J$ D3 Z1 a& S
9 ?# b0 Y; S8 m8 O if(data_read == 0x13Ec)
. f( }! X% u4 e7 J: ~ {
6 X+ I6 F& Q3 }1 B0 a$ _! [1 D 2 N0 Y6 v# |! ]5 g) L! }. s! H
printf("data_read = %x\n",data_read);6 l( |. x% h& W: q1 Y+ n0 s% Y
}" V @$ F- w8 ]
% r) N, J3 |+ f, h' m6 g% ?. Y Q0 E msleep(10);
% j9 v5 R4 W" N3 L8 A( P' U5 a1 K
9 k: P: c, _ [ /*4 }' H: l* \) V; e
ioctl(fd,1); , q7 b1 S0 B* Q( }0 M" A5 L; h) ?7 E
sleep(1);
$ ]5 q1 I, z, c7 d4 M2 `% p ioctl(fd,0);9 r+ D' K- y n$ E/ Q0 u: `
sleep(1);
5 n ~: M6 [( h, V6 i5 z1 {3 G0 i0 @ */ % }, f- `7 p0 L5 z) t9 t; ?
}
2 h9 {; q' G _8 r return 0;( y0 [8 T$ a/ P6 b
. k# |, d# z& n5 S* R2 c' ]}
/ m' L0 Q3 K% q' B" K
B& g5 v8 C1 ~5 q' q1 I多谢各位指教,谢谢! 急
7 [% w5 {/ D/ W: Y& D# k. y# X
$ @2 _6 K+ B. h$ g0 [
f- \: s/ |" i
) Q$ o, m8 [2 i8 C) h, [
" m5 E t4 s1 |& F% V0 ?# J9 z; F1 J5 l9 n' D! h
|
|