|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
1 X% F/ b* F# R+ I$ k4 j/*3 F s9 m8 J/ c9 n
* Copyright (C) 2009 Texas Instruments Inc
" Q% i; d' c3 a5 z+ C" g+ `- h0 ] *
4 W% X2 n8 Z: } * This program is free software; you can redistribute it and/or modify
$ }3 g+ C! O& o# I. W; l& Y$ b * it under the terms of the GNU General Public License as published by; A: Y% L8 E6 ?$ A7 i" G
* the Free Software Foundation; either version 2 of the License, or
" a9 ~% q9 e% y0 t8 Q * (at your option)any later version.+ V/ I% Q ^ r9 [! ?
*0 ?8 i$ ^* x8 s
* This program is distributed in the hope that it will be useful,+ n# D/ C: I. H# K1 D3 ~: t
* but WITHOUT ANY WARRANTY; without even the implied warranty of
4 w" J0 ~3 I3 I, ?+ d) a * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the2 J4 R% Z; ^# Q9 y* R' m
* GNU General Public License for more details.
6 R- m2 Z& R8 i" k2 B5 K *9 K4 o3 k) E0 U, _0 O( J2 d
* You should have received a copy of the GNU General Public License
- S+ B/ d: Y8 g+ r * along with this program; if not, write to the Free Software
# p4 E, ] t. f- U$ C * Foundati
5 g4 ?! k# B B6 k3 N*/9 b6 \( A& L, q- p) w. d" ?% T' @, j
#include <linux/module.h>% v* v ?+ f1 ~- c( M, W6 H' A
#include <linux/init.h>
. J, p O! ~$ Q) p: {' X#include <linux/errno.h>
; X5 B6 ~& l3 E& }#include <linux/types.h>
$ E2 V! i+ Z8 n8 ?9 K" `% I#include <linux/interrupt.h>( e4 Q0 \$ o @0 T! m1 {0 E
#include <linux/io.h>5 V V" ]) S& H5 p! R3 m; v
#include <linux/sysctl.h>. M/ W5 V, {; a
#include <linux/mm.h>: t2 i* A P; d& f
#include <linux/delay.h>
6 G# A% ?0 q: q! U' A#include<linux/kernel.h>
) B, g2 ?: v4 u+ Y' Y" F9 W- N0 J/ `#include<linux/fs.h>
! O- G- \* _1 U+ p6 k' |- P& I#include<linux/ioctl.h>4 q) H# `+ T7 u$ w6 g( x, \% ?
#include<linux/cdev.h>- X$ O/ ~) ?1 Z# ], e, X
#include<linux/kdev_t.h>0 \, X, @, u* U
#include<linux/gpio.h>& M1 ]' i' q3 u! d& o! ]5 V! W
#include <mach/hardware.h>
; c9 u3 x7 Z/ u#include <mach/irqs.h>
# j5 j" F0 f" `, `" w7 [3 z3 ]' @* v _* h, b) p/ X4 l. |4 k# [/ E5 L1 O
#include <asm/mach-types.h>
; h% F6 x- k. [" Z5 @$ h3 M#include <asm/mach/arch.h>
' {1 {! c' G& i3 N! u- K#include <mach/da8xx.h>6 K4 Z: X; _ S; e, S9 B3 C% q1 z
#define SYSCFG_BASE 0x01c14000
1 q$ t% F9 _. D* l#define PINMUX1_OFFSET 0x124 9 p" k8 Z# w Z& k' k5 b
#define PINMUX18_OFFSET 0x168 - Z; M7 T+ \8 ^% d: B, P. _( j
#define PINMUX19_OFFSET 0x16c3 s' c" Y- P' n/ u! j( d& ~- ^ |, q
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR; Q% I# ^3 u; o \8 [
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
7 I2 p# V- T/ N3 [6 [ w0 E0 G1 U#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
' \( B9 ]+ |( l3 q: k1 b3 |+ b) L#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR" W( r: |. f" Q' _5 h& M4 T
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
5 }0 F! q/ [& `& A2 o5 B
, k0 [2 f9 N" I% g2 J#define DXR_ADDR 0x01D11004 //MCBSP1_DXR- V1 m5 u- i3 K$ i
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
# Y. D& [! u, t7 R: d& l) k//PSC
! \7 \3 y, _' P' D3 t#define PTCMD_ADDR 0x01E27120
; m; A& @& D# N1 u$ G6 _#define MDCTL15_ADDR 0x01E27A3C7 u6 }: v0 f4 v5 [
#define PDCTL1_ADDR 0x01E27304
! y, N6 V- D9 C1 E9 [//GPIO8 direction3 D! r0 p/ r. y7 q1 ]; w
#define GPIO8_DIRECT 0x01E260B0
; E/ W0 R! q9 e' t9 ^3 l$ f#define GPIO8_OUT 0x01E260B4 ]4 _/ m7 g2 i* i
#define GPIO8_IN 0x01E260C0
5 W# X) q& M' h2 G0 [: j8 i: x2 C2 A7 o7 \: o$ Z
//#define MCBSP1_RINT 99 : J7 o6 q W5 S$ i
//#define MCBSP1_XINT 100
1 L q8 {# b+ O% G# N0 }) b1 j2 O sstatic int MCBSP_MAJOR=239; a2 a% V' y( A! ^
static int MCBSP_MINOR=0;: f. _+ T, f" }7 U# G' g, C9 A: @
static int count =1; L- e' E1 x% m6 q( H3 B. L
' @2 `' L/ f* A9 D' W x
#define MCBSP_NAME "MCBSP-device"
( q& h5 c/ t5 A5 S9 ~7 G* e# W! k9 n) I1 e& V* m& Y
static struct cdev *mcbsp_cdev;
4 m* F7 h5 g' W# S9 Wstatic struct class *mcbsp_class;) g$ K. P/ e9 ~
static dev_t mcbsp_dev;' M$ O0 T. r* N, i" M, _6 Q
unsigned int DRR_data;
* M3 [! d+ t+ Q- B$ Wunsigned int DXR_data;+ \3 d7 f7 _! \* q+ L
static int mcbsp_open(struct inode *inode,struct file *file)0 ]# ]7 [- p1 a1 `0 w" p4 C/ Q; p
{
) k" ?8 l/ y- O4 o, c' n4 I
/ n- ?6 q+ S& W4 ] //interrupt enable,initialized
8 R4 w7 f2 b; q unsigned int temp;
* s, g6 z7 ?: m% G5 n% m& _* o" l$ @ //SLEEP_EN(GPIO8[10])---0) L% [+ g' _8 @- m1 L8 Q# o, f5 r
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));& B$ }% J8 G& C$ T8 m* ~8 j
temp=temp&(~0x00000400);! s: b( y6 ]! U% e" g, }
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ {# V1 ?+ y3 Z% f
//RESETn(GPIO8[8])----0----1
, C) a4 y6 D. t8 i0 w3 U temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 u, M9 U) d; R; y+ A/ R temp=temp&(~0x00000100);
+ V6 J% u4 {% V4 l. W- g __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---01 Y' G# i3 F3 Q- E! {
udelay(100);
6 Z F& G i3 K: B! c temp=temp| 0x00000100;
0 j8 H6 }, F/ o2 @, V) t __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
7 I1 A9 }; P* s' C) ?8 E udelay(100);
: }6 _+ y4 N# u printk("open success!\n");
& _1 D+ f% u4 k, [2 f$ C/ } return 0;' Z8 y- Y' f$ c' G
}
& u% i* m6 a/ u
0 P9 J L9 J: G2 y% Z- Gstatic int mcbsp_release(struct inode *inode,struct file *file)
" n6 I2 ^( x5 L/ A( N{
( a. F$ k2 j( h( U" l printk("release success!\n");% w6 o7 W' D% F/ E* a0 e
return 0;+ R0 e8 n6 ^$ T6 l, }% R6 Q Y9 k
}' D: S, E4 h6 Y/ ~2 V& b# Q
5 [) {# ~; b4 A: N. q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)" J" H4 L6 U* U' L' D& Y' W
{
; `0 h6 I2 ~' w) O1 m copy_from_user(&DXR_data,buf,len);
- {! k, l# W @3 q+ C7 R3 h' r; ~/ R iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
8 z7 ^8 E5 d7 D4 q4 ^: D9 B return 0;7 w4 x2 V4 }/ y1 u7 U; }- U
. e8 H# _' b- y- N3 J' S3 _
}
0 G& B ?7 u8 Y6 I
# Z) V) H; Y" n3 i! o+ P2 D/ Z4 \, Rstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
+ i/ U1 x7 R% g{
4 }6 ]% f n6 }# n/ g DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* C5 l) v/ k r8 M* d9 {! j: K copy_to_user(buf,&DRR_data,len); ) t6 S& \8 i5 w- \2 b5 G3 w
return 0;
6 H8 U# g/ R% |( n) f5 K}
7 x' p2 o! D, X" I" S0 l9 h) m4 h7 g4 x
0 z- v8 ^$ {3 z5 u; J9 D% s
static struct file_operations mcbsp_fops=' i/ o8 e+ c6 [* C Q2 t( ?" _# H
{( I7 G$ M( Q4 Y ^4 u5 j2 x
.owner=THIS_MODULE,
+ f# n0 I) w" q1 d9 r .open=mcbsp_open,
" [! m$ m( h9 D .release=mcbsp_release, y5 B6 c+ p- T2 o8 Q4 d
.write=mcbsp_write,. C& B5 _: X, k
.read=mcbsp_read,
" Z+ `' u- v0 N% N4 D};$ m; t+ r/ z* e. Y1 A4 p
static int __init MCBSP_init(void)
; Z0 F- o0 |+ p t{) x; {2 r9 G5 K8 R$ a" w: q- e) r
int ret;
5 Q8 L! _: A) [) c unsigned int PINMUX1_REG_old;2 R8 _$ T' ~5 B: J: Z. E
unsigned int PINMUX18_REG_old;
% R' Z9 S% T2 M) R unsigned int PINMUX19_REG_old;8 ?- X; H; W- @1 t- g+ G' Y
unsigned int temp;
2 |; r( D+ O" W7 U if(MCBSP_MAJOR)4 G9 a) U& s4 k: J' w7 g
{
8 F. O5 |+ E5 Q0 A mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);. b# @9 X' Q: S6 M+ o
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);9 S9 O8 R7 e, s2 L0 K( U6 @
}
6 N9 Q- p+ h4 z else7 \) Q7 Q" g1 g |5 ^+ n* Y+ N( Q
{3 A$ c% T+ n+ M
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ L! k& ^( N( R; ~2 H
MCBSP_MAJOR=MAJOR(mcbsp_dev);# w, H0 o) n& w, A5 N
}
/ k; z) V- i ~$ X2 J/ U5 m6 J8 V ; s9 H. ?: e7 X8 Q
if(ret<0)
4 I4 x; z0 t& C9 d9 V } {
# D0 x$ \: q# y7 W" b6 @$ W0 K printk(KERN_ERR "register chrdev fail!");
# l5 E1 \3 {6 l$ E; Y: C2 m2 Y1 T, b4 H return -1;
2 c! A# o" M5 @4 h }
7 v1 r, C1 j/ c4 s7 ~/ V ! d* }6 u2 i1 g# g( P
mcbsp_cdev=cdev_alloc();
j0 d; |% C+ L3 D% ` " n& u0 C+ {9 B1 ]- ~" s0 t
if(mcbsp_cdev!=NULL)- ]* R/ d7 c* m$ A+ | H% O
{& s; D1 D1 i, F4 a/ i9 @: n
cdev_init(mcbsp_cdev,&mcbsp_fops);
% l' B1 d" m' S. b) g mcbsp_cdev->ops=&mcbsp_fops;* J) F, G4 m8 R( p1 K {$ H4 B
mcbsp_cdev->owner=THIS_MODULE;% A J" N1 I- e( I, `, u/ i
/ p9 v6 l3 F5 S* x
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
" ?6 D. g" j9 i( X printk(KERN_ERR "register cdev fail!");0 ~ A' j! X3 d: h( K
else
: ]7 T# {, d9 z% P6 b; A9 k$ T printk(KERN_ERR "register success!\n");
: p8 y& s; t7 L/ [ }
/ }9 `+ o# ^* d5 e else
, w: ?0 |. y: H/ q! S6 h) Q0 f {
$ |3 J2 r' L2 i4 R6 Q7 | printk(KERN_ERR "register cdev err!"); k+ T* D# U) f m2 t
return -1;1 B4 r7 J/ E8 @& O" g& R& t
}
9 K; ~& l D% y8 @. W
& P" h% c9 I6 W* W4 s mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ L. _4 a+ w4 {9 I* q* q! ?
if(IS_ERR(mcbsp_class))
1 P! L! X: C* t4 O: ~3 P {3 P" P+ ]$ ]! ?9 B! A
printk(KERN_ERR "register class err!");
+ R4 Y0 D% P7 f: O! b3 P return -1;. ?) ~3 Y, T$ [8 Z8 b5 e' ^* `
}/ J' A; c6 w. d3 v! w# G3 N, ^4 v
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 C1 O: L- z2 a3 s
! j2 y' X" ^( u, o5 X& B //PSC
6 C1 n/ |0 c# N' s* K+ j g: q- G5 R //add Enable MCBSP; H' M# a) `$ Y
//test/ A1 W$ o) N. x6 z0 T% U) O) M
temp = 0x80000003;; w, `! \$ t! u7 D$ S4 }8 ~
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
* s- n) S7 Z! Q7 Y u temp = 0x00000003;
# X+ C$ `* l( c$ j% o writel(temp, IO_ADDRESS(PTCMD_ADDR));
' w$ d0 R5 Y7 |" }. w' v
6 w6 ^; W8 b7 I9 F temp = 0x001FF201;
. W" q$ `( y. |0 W' Y writel(temp, IO_ADDRESS(PDCTL1_ADDR));' \0 ?" M! E2 P8 ]
5 b3 W' M8 c1 t7 ^( D1 u //PINMUX
2 A/ a7 C" K7 d7 W //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
8 [/ W5 R3 [& P9 c$ a4 ? PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
5 \+ l0 k! @* C' S: j8 Y( ]' c" s PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 7 e; z2 u# P% |, p
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
) b: G- G- H7 V- x7 Z$ v2 b 3 b j9 N7 r& d! t! k& u7 v9 j
//SLEEP_EN,EPR,L138_SHK1,L138_RC; G' L1 j5 B: E# S7 A8 v& h
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% o* K. h. Q; ]+ e PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
c, m9 B1 I4 i) F; g writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);" g) _3 s+ K6 S' l
0 ]3 I9 _: i! \) G: o% r$ n
//RESETn,L138_SHK21 d( ~- U" A- K7 \% x7 A, z
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
0 c* x! h& { C. L, e2 n e# _+ t PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; / B. `# b' J' Y# v% b+ j% E8 y
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);6 H8 d3 g2 H$ Z" j- T9 a7 O
. ^4 h4 T w& d' m9 X% P 4 q) v( Y& k4 g$ K
//SPCR Register- r2 |" C/ T: T& w5 }
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- F& `9 F9 S) ^3 k6 C N, N temp = 0x03000000;//(DLB=0)
# S" Q7 g2 h# I3 F% m% M% ` // temp = 0x03008000;//(DLB=1)- F4 U f5 i$ |% p2 |* a. n
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset% W" ?, ?: Z1 N5 ^8 G
temp = readl(IO_ADDRESS(SPCR_ADDR));( Q, m G: B8 t+ q; W$ T+ z! T, D' W1 E
printk("temp=%x\n",temp);
& P7 T5 W/ a- ? |5 S
9 t7 p" a" j7 G# A1 m* I! p) S //PCR Register4 P% E# K$ N2 a/ {
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-02 ~% v. H1 x9 \ Y( U
// temp = 0x00000F0F;
. \5 }; H7 Q9 r% D+ S temp = 0x00000B0F;6 a1 J- R: M5 w3 g# |4 V" N. x% Q" ^
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized : n. a( X# @/ `$ Q! b
temp = readl(IO_ADDRESS(PCR_ADDR));0 Y; k% k8 Y" X q
printk("temp=%x\n",temp);
$ {+ X, o1 g8 _! R. u //SRGR Register5 z/ S. O+ y: |) h- _- j$ S
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 X0 P. \8 C4 [
//temp = 0x301F000B;
1 c+ n% M S9 ? ? writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 0 R' B/ F) p8 ^7 f
temp = readl(IO_ADDRESS(SRGR_ADDR));$ o9 X6 P+ x1 o; ]4 E6 b
printk("temp=%x\n",temp);
/ |: r0 l- c7 p" _ //RCR
7 P+ ?$ Y2 S! L+ A9 T //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,9 r/ Y; x0 [- L7 v. u2 z# J- J9 F
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
; Y% G3 k9 }) E D temp = 0x00440040;5 V4 q% K* p6 @/ y3 b
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized , v M Q5 I, X
temp = readl(IO_ADDRESS(RCR_ADDR));
- L% G& L- X' Z& W% l printk("temp=%x\n",temp);% g0 i' v* q/ k1 C$ I& x
//XCR
! S' v/ E7 i% @ //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
4 r7 P$ @) Y0 V* g/ Z& @5 Z$ { //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) b; E- b) f0 d5 _, k4 O# `1 ^
temp = 0x00440040;
: V9 o h9 O" `6 O7 w writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 3 i! z7 K1 B+ v
temp = readl(IO_ADDRESS(XCR_ADDR));+ `& v5 v* |$ M+ K. v5 c: G
printk("temp=%x\n",temp);
" r" i# h# ]( {) x9 d. ] udelay(100);: L w$ D2 b: ~9 J% Z
//SPCR Register3 \; T. d- N6 P5 |# \6 d8 d1 ~+ @
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 D4 F. Z% x; S4 h* o9 A* A temp = 0x03C10001; //DLB = 0 VS DLB = 1- B1 ~" Q# a2 s7 L9 \' d
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled* b. G. }1 k) _9 g, d. s; ~6 z# Y6 r
temp = readl(IO_ADDRESS(SPCR_ADDR));& a- F" j. ]* C( l. J6 |
printk("temp=%x\n",temp);3 R. ^3 x- n% `; h% X9 V
udelay(100);# j v6 a, g- R. d2 r( W
6 b: D0 B& m" q' u- H8 a+ w) ~
//set GPIO direction
N+ S# B M: A$ U! w4 E2 m: v temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
6 ?# I. j V+ [6 T5 B temp = temp | 0x00000100;//EPR----input
! @4 I% n5 r& `; L5 P& C+ x temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output, ?- z1 D4 D( i9 Z& {9 P4 x) [1 i ]
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
9 \4 L0 g0 B% d4 p
$ V' q) N4 `/ g3 \/ ?& `' Y0 l9 | return 0;
: _% ?* |/ a! m$ @1 |}5 ]" m0 e I- h$ @
static void __exit MCBSP_exit(void)5 t4 U* o+ m5 e# v1 r% @5 N
{8 B' ]1 h% U2 Y: m& i. s9 Y. z5 D
printk("mcbsp chrdev exit!\n");/ o7 g$ q- E6 E) [
cdev_del(mcbsp_cdev);
/ C/ y' x4 u+ ^4 o unregister_chrdev_region(mcbsp_dev,count);" A* O/ B6 o' y: f
device_destroy(mcbsp_class,mcbsp_dev);
- ]; i1 _' F4 w/ ?6 N( Z class_destroy(mcbsp_class);
4 N2 t# E9 X3 e3 E, [" r' D d}
4 u" o( N6 I8 H! V# Z# pmodule_init(MCBSP_init);
2 J; A/ {& `, V/ v1 U4 [) q3 h7 rmodule_exit(MCBSP_exit);
$ d- K5 z. f! H# m! \4 Q6 T. h0 L9 Z( @- {# c/ Y! ^8 `9 [# e
MODULE_LICENSE("GPL");
9 o7 [+ ^4 o1 w" n1 l& t! g7 i4 x3 x8 W) L- P2 N* w) O
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 N4 ]1 A3 V1 o2 z2 D我的应用层的测试程序如下
: A0 y/ L2 W& T' U, w/ z, T8 F#include <stdio.h>1 p1 Q T4 m4 U4 R# X" f
#include <string.h>
3 k- M- D+ J4 S1 |#include <fcntl.h>" U4 k' `: Y+ c- e6 C8 q
#include <unistd.h>
$ |/ K4 I5 z. G0 r# d. E#include <signal.h># a0 U0 T- `4 S
#include <pthread.h> //线程 J4 w+ w2 }9 K& v( h* s# O9 L
#include <stdlib.h>
3 `+ j( q' ^! k" j0 i#include <pcap.h> //捕获网口数据
( p% X+ t8 w2 c+ L" F#include <semaphore.h> //信号1 `# \/ O# k d# s m* d
#include <sys/types.h> //消息对列
' d7 }/ z8 v8 F6 N#include <sys/ipc.h> //消息队列
3 z, ^( s- ^' x- Y1 q' u#include <sys/msg.h> //消息队列
$ E O' e+ }" B5 c7 x/ I#include <sys/select.h>
/ h0 s1 f1 g" O3 B _#include <sys/syscall.h>3 g* V: ]$ T+ j$ l3 e
#include <sys/stat.h>
' Z$ l$ b- Q, ~. c. k4 H#include <sys/mman.h>
& }% T! M4 {3 F#define msleep(x) usleep(1000*x)
: E; g& f! k& m# `$ Y) p
! m' p5 C$ u! |; t pint main()& R- n% J2 b; v% a) g* E& h
{ 5 z% a, w2 ~% r5 r' l+ g
//MCBSP,ARM与AMBE2000交互设备
9 d5 ] v( G0 ^$ E, v* ] int fd;
9 o. N2 b R( {5 A unsigned short data_write = 0x5555;8 v! X2 {: ~0 C& F$ T
unsigned short data_read = 0x00;
G; j2 L1 Q0 N fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);/ v; |4 d* c- w! J; h
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
% }; ~" ^5 p" p* q% a {
6 j8 R4 p' \0 W6 H1 Q& J$ d% j9 N7 u if(fd < 0)
1 g* l7 l+ M0 u0 ? {
1 G% J/ t% ]" l9 B: q perror("open failed\n");
# Z' `$ j, k% h8 s1 o return -1;: K) u% z/ z3 F1 W
}; \; \+ y/ T8 j* `
$ L% I+ o% P7 R3 A+ G" Y! J
while(1)
% M0 {) Y! p1 L {
& `" p% C( \! Q- i* _ ~7 P7 ?4 E 0 S! J3 _8 ?( X
//AMBE2000每次读写是24个字为一帧
% u9 E1 }% \1 U X9 o( d/ a) D( Z //写数据时将数据在底层存储起来,等到中断的时候再发送
! `* N9 x F- u- Y/ \; E" Y //AMBE2000输入数据是以0x13EC开头的$ I2 F! _0 X' O% t: _7 \" _. j
write(fd,&data_write,sizeof(unsigned short));
0 ]# c ]' A! l
. W9 B) M2 J! @: D% x# g //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
% {2 T v* I6 x) m read(fd,&data_read,sizeof(unsigned short));3 { C7 \5 l2 J$ I3 f/ V# Z/ K
6 T# R8 e4 c$ \( M' V8 d
if(data_read == 0x13Ec)
& h. e. V2 B: X% j {' @* B' o& x1 T9 h- H( c5 n) d
& p. |8 O: f$ Z4 c# ]# y/ ~
printf("data_read = %x\n",data_read);
n9 b6 P7 R5 V# W& t }
, w' q& M2 }3 d: Q; G5 H W
& y1 w, j2 B- q msleep(10);
% o& @* a# b- A6 }6 d # F' f0 J5 G( {3 a1 h% }1 {
/*1 b2 E. t7 p8 ?
ioctl(fd,1);
& U: J5 E% h8 G- p% i9 { sleep(1);+ L2 R }8 b1 A' r {
ioctl(fd,0);
* x- r5 q9 N/ R3 G/ F) N" M; Q sleep(1); t0 F' y6 `% \
*/
# Y% P# q' e$ |" x$ w } 0 ~, ?2 V8 F4 h5 l9 ~3 w+ H
return 0;4 J4 s5 K/ B; F6 e0 T. N
- \+ M; I% \( H. i
}
9 k% m; G- C0 Y* H- [4 E' C# h
! ~ B& ~1 Y) H! D* k6 ~+ `多谢各位指教,谢谢! 急 x+ \3 p J' g7 @/ a
$ z+ Y0 V. Z! Y9 S, O7 k, p" c; X! J- Q( o0 r/ k
" u( j G2 t% A; e9 u9 H
: `- d; p5 T* N' ?2 C# ?' Y) Q& e; T- {9 i6 |& \
|
|