|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ) _3 ~4 ]6 c6 [# E# W2 ~' W6 ^
/*
0 C# V2 K# t6 U5 W * Copyright (C) 2009 Texas Instruments Inc
+ ~5 B- R6 N! o* e* R *
, m* y5 G! d4 ^4 K0 w3 t4 S2 M0 \ * This program is free software; you can redistribute it and/or modify% B& Z0 H! Q/ d) V; G7 ] @
* it under the terms of the GNU General Public License as published by' P5 ]& \7 ?% J# [0 N9 z+ W
* the Free Software Foundation; either version 2 of the License, or
z+ W; K Z% s# C! ~, {' A+ X * (at your option)any later version.
. l2 c, b+ [" } *
c$ v- o- s' F7 Y * This program is distributed in the hope that it will be useful,2 A& a; ^, E: Z5 x" `% g
* but WITHOUT ANY WARRANTY; without even the implied warranty of, y& S) Z z; o+ {+ v3 }% X' L
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# y( X# M; }) P. w/ t' n * GNU General Public License for more details.
% i3 M0 _8 g0 {5 F. [ t1 O$ r. T *
2 s8 b5 v8 G" b2 l8 I5 ]2 q * You should have received a copy of the GNU General Public License& B2 N* z- K4 U3 U4 r
* along with this program; if not, write to the Free Software7 o3 i3 `9 M# q; D$ z7 ^4 ]: }
* Foundati
" w0 }3 w3 g& I3 q. V; {3 k# p- e. u*/& ^0 ~' _/ x! I3 p
#include <linux/module.h>
7 q4 @1 J$ d7 K& p" h- N6 {7 X#include <linux/init.h>
7 Q! M9 X4 o# z# }! c% ], Z5 }- T7 C; D#include <linux/errno.h>( y2 C& C9 l% K8 Q" a: E
#include <linux/types.h>( x9 n4 E0 k8 x+ Y- ]4 W
#include <linux/interrupt.h>
5 z6 \- ]) m3 e2 e5 f$ d#include <linux/io.h>! V4 q; w- O& J( w! i5 l
#include <linux/sysctl.h>& o% n3 ~ E! h, j1 u2 P2 \6 Q
#include <linux/mm.h>
3 Y0 P# f- u* o+ |/ P! C! [#include <linux/delay.h>
3 u! {+ Q7 z1 y( s" y4 O#include<linux/kernel.h>
" u' r" J6 m9 H9 q, U$ ]. H#include<linux/fs.h>/ I4 P6 [9 }' Z* X. p* w- D
#include<linux/ioctl.h>* w4 H! M# a. z* w
#include<linux/cdev.h>8 l9 ] f& e+ V2 h m" m2 E2 j8 H8 m8 h
#include<linux/kdev_t.h> v; w: [8 ~; J- W, N" }* ^. q
#include<linux/gpio.h>
0 f% O: H- d* s: n$ @- u- ^0 s7 e#include <mach/hardware.h>5 N- R5 T4 G! |1 m: F
#include <mach/irqs.h>
6 Y% P9 w$ G) k
8 h: R3 a: e1 V2 |( ?; _2 F#include <asm/mach-types.h>- T9 G: ~- P' V+ O
#include <asm/mach/arch.h>
7 t; u% [# i! m. d: z9 L* s#include <mach/da8xx.h>
2 `9 S! Q. V" r#define SYSCFG_BASE 0x01c140000 r" T' T( J* ~* F& _; G& t
#define PINMUX1_OFFSET 0x124
+ f4 n& T- g8 f5 M6 Q7 X#define PINMUX18_OFFSET 0x168
; b0 a, O! }/ F8 Z#define PINMUX19_OFFSET 0x16c p' Z: d1 \, f5 y. K
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR2 Q0 A- i( }. e4 ~/ i0 L
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR" j$ W: u3 J; b
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR b/ m, N. O% r$ Y
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR, f3 B1 \, f$ s* w8 m
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
% s1 [ p1 I+ G" p |& \2 e
0 q- l7 W1 n# }; ?- t! D0 L: Y#define DXR_ADDR 0x01D11004 //MCBSP1_DXR4 L* O$ D$ p. h
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
7 M. t% R% z9 ^ H1 c4 j//PSC3 x1 i# }6 m) ?+ ?0 _) ]3 h
#define PTCMD_ADDR 0x01E27120
* P* J& U8 g- |1 L U#define MDCTL15_ADDR 0x01E27A3C
/ K- B+ m& q6 l#define PDCTL1_ADDR 0x01E27304. m7 L$ U4 t+ \* ^
//GPIO8 direction4 @7 a# d8 t" w
#define GPIO8_DIRECT 0x01E260B0
' J0 q: v- x7 C, i0 r5 S" ?$ V9 j#define GPIO8_OUT 0x01E260B4
' p m' h; A- q% N. D) t#define GPIO8_IN 0x01E260C0
8 d2 X7 \9 R# ^- z
) X: T" |( P5 |/ L8 ?. u//#define MCBSP1_RINT 99 5 E/ g. u& V3 R6 D7 Z( G
//#define MCBSP1_XINT 100 ( N. \# J9 u+ `# X0 ]/ Y1 e
static int MCBSP_MAJOR=239;0 Z2 K3 h% `* w* A7 I% l; M
static int MCBSP_MINOR=0;
/ n; u, W: a. ^$ Ustatic int count =1;
2 q1 S8 U) p; y
% z' c) k, f" z( s7 z p; e#define MCBSP_NAME "MCBSP-device"
" P8 ?: |" H8 k! ^9 A/ w
" `1 E0 S0 T8 z. s4 x+ \static struct cdev *mcbsp_cdev;) }! Z ~" b+ e, ^/ X; G
static struct class *mcbsp_class;
8 R7 `, a) Z; v, q% M. dstatic dev_t mcbsp_dev;
9 y4 N1 x6 P3 u% h" Xunsigned int DRR_data;
9 f# O, Z" P+ b0 lunsigned int DXR_data;
* }& ]6 _5 w: n- I% g- z N- |static int mcbsp_open(struct inode *inode,struct file *file)1 C' ]5 V, [( C/ U) e- p: ]6 v5 J
{
2 C! O: d/ `6 h% | % ^0 M# v* [9 [& c v
//interrupt enable,initialized
' w$ D4 o1 C/ G' S! R n1 C( v unsigned int temp;
6 g0 a! Y8 G' r //SLEEP_EN(GPIO8[10])---08 Q% e% L: s! l7 W
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 J) {" j {8 g5 M temp=temp&(~0x00000400);
2 i/ C5 p Z2 g! e- S8 w __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
0 q: o: B& K0 C$ o6 y. {) s# ` //RESETn(GPIO8[8])----0----19 w- [7 ~' A# V% `
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));% X! x# v/ D" K' i4 u
temp=temp&(~0x00000100);
! q: M, Z2 v; d0 @9 \( }4 p __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 U3 W6 z1 ?( d c udelay(100);/ b' m1 e# u1 R
temp=temp| 0x00000100;
f+ y$ b$ E/ ?% a, L3 { __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, t: Q/ c, y. K; h( d udelay(100);2 Z% v1 B2 s; I$ p" ~9 `
printk("open success!\n");
! b9 U( P: j1 R2 D return 0;
) z; h# `- \; j1 i I! K d}
& e& F5 c& s& L/ t/ ]6 k( t+ u2 f* d+ m" j
static int mcbsp_release(struct inode *inode,struct file *file)
4 o7 C& s5 S! F. d- X{, C* j3 P% N: S3 O0 b
printk("release success!\n");
1 u* t5 ~- q' Q1 s! k return 0;
2 x P/ L/ t# @, k# G$ B1 E' D}& Y$ q+ g J3 \, W- e
1 w5 p" Q( Z" H- E1 Dstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)5 `/ B, W; P% Y; D1 b3 `
{3 W+ g( y) w! K
copy_from_user(&DXR_data,buf,len);
4 f1 [, ^0 Y5 t3 L7 I9 L9 E iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); % a9 j) {, C9 q- b
return 0;' m0 x' q" V/ `* ^' o4 @; p
3 S$ d% e. B" n; ~$ G+ ]
}) h3 n ~- w6 G8 X
- T1 g, o2 ^( v" T, ]1 A; Gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% K# ?; g2 p! ]' |{
7 M4 d& ]. J. X5 @8 D& p& x8 p DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
5 G' l; U8 }% X( z copy_to_user(buf,&DRR_data,len); * n1 T0 D9 r7 t. k
return 0;% h. G. Z w8 o. q2 n
}
6 j% g' |: c2 [0 R% q7 o, K$ z% n2 |7 V* d% @
5 a8 f z6 K/ @static struct file_operations mcbsp_fops=
; a# n+ j m2 _{/ ?3 x: B8 o! V7 Z% t8 |! Z9 Z1 V; _
.owner=THIS_MODULE,
/ ^0 U5 R+ }6 j .open=mcbsp_open,
# _3 x0 E5 X3 k8 } .release=mcbsp_release,
6 A' m2 e* w$ ^4 Q: W8 j .write=mcbsp_write,1 e0 A& y2 [1 f+ _ p8 O
.read=mcbsp_read,9 v+ S" h& ^& [% H8 v
};+ ^3 U! U# c/ F7 F
static int __init MCBSP_init(void)
3 r/ t5 X; }1 ^) b, [7 L{
3 z! v* ?7 f( d- [8 ~ int ret;+ X( n9 e& F& h0 n' l' @: M' l7 k
unsigned int PINMUX1_REG_old;% j# j+ \& I8 p- [! @, Z9 d. q) `; i
unsigned int PINMUX18_REG_old;
$ X& Q Z- B' g. c/ q2 E unsigned int PINMUX19_REG_old;0 |" M+ ~( h2 ^! `" u9 j0 L
unsigned int temp; % S! z1 i- m$ ~: k/ ^1 L
if(MCBSP_MAJOR)
$ }6 M4 V+ y" r, _7 P- H! D {: ~8 Z* R3 P0 Q- E9 r* v+ s+ x! b5 ~
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ {0 q1 `# k! P i ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* F- N! e* O- ]# s1 @# ]( j
}
; ~' s; p( i3 v w else
& b* o* o9 B- d: U1 s4 M {
3 k/ F: L; v( I2 h, H+ E% U ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);9 T6 ~3 }" y R: E& P& J5 u; J
MCBSP_MAJOR=MAJOR(mcbsp_dev);
% A7 r( C0 w d& _ }6 C3 `- k- l5 G( O
% q8 y0 T# x: U z if(ret<0)
/ [: R( y9 S# ^. P6 ?( N {% ~( a' m3 ~& G% S( a/ d
printk(KERN_ERR "register chrdev fail!");
% G- T& H2 w. v' t' j, A return -1;6 g. v/ }9 x3 @' Q5 I0 F- H4 i
}0 v! H- O+ l1 ]- O
% ~: j6 x2 \4 b% p- K/ m- g
mcbsp_cdev=cdev_alloc();
' w! o9 x4 }8 Y+ B; f( N; c S
; A4 q$ V/ d! `7 r4 X* ]+ D* u if(mcbsp_cdev!=NULL)0 U: p- l5 p# t* s1 ^4 c* u5 j Z
{$ V& }* h8 q) G. _5 Y' U
cdev_init(mcbsp_cdev,&mcbsp_fops);
5 w" W( g+ E: a0 x mcbsp_cdev->ops=&mcbsp_fops;& `2 F1 N6 D6 l5 L2 n" t
mcbsp_cdev->owner=THIS_MODULE;# b8 E& d Y1 W4 x H; d1 R: C; F+ n
- v& e, o7 G8 [ if(cdev_add(mcbsp_cdev,mcbsp_dev,count)); P4 x% e$ o% n
printk(KERN_ERR "register cdev fail!");2 M" ?$ r+ W0 n1 Q% b4 ?
else
7 x2 S0 C. ]6 `& j* Q2 N printk(KERN_ERR "register success!\n");+ P" l% W. O+ H0 v( }* {
}
, p& f: m3 d3 b& y9 E9 B else- ?. |# ~. [& s% C' `; k2 Q
{
) f8 H. C: l% z+ G printk(KERN_ERR "register cdev err!");& b+ }( D5 L1 a
return -1;/ V0 V5 f! r3 g7 X
}) j$ J3 [/ u0 i2 E# r9 h6 l, U2 Z
7 w8 r7 U4 Z7 \
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);7 _, P/ l1 e1 K( M% n- m
if(IS_ERR(mcbsp_class))
+ c* S6 W/ }" s( x. Q {
+ `0 T8 w" Y" b( v# G1 v& h printk(KERN_ERR "register class err!");2 ~. C) g0 ]. F- r0 F* f* y
return -1;4 d6 z& |2 H+ y: {& ?" c; K
}
% N0 |) f" F' d0 { device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
# T! I, E9 x+ a. F Q9 U" [
1 r8 p* c( e4 I; T& ?0 |3 q4 M //PSC E8 ^0 _$ I: @% l) E' z3 q- Y$ T
//add Enable MCBSP
2 Q0 [! S8 {0 i( H) `7 ^7 z //test6 Z: R) h! G( r: ~! [9 y
temp = 0x80000003;& o, P& c) B* C8 w; }
writel(temp, IO_ADDRESS(MDCTL15_ADDR));# K, m) g j6 E; s4 B) X
temp = 0x00000003;
4 R5 f/ o/ @6 Q7 c writel(temp, IO_ADDRESS(PTCMD_ADDR));0 A4 c' x$ f' N o$ l; S
% S/ r: e3 L+ x temp = 0x001FF201;
1 {$ d/ W. H: C- u5 k" Q+ c( R/ L writel(temp, IO_ADDRESS(PDCTL1_ADDR));/ O8 x3 ? n; z* a9 e, i* Z3 @% O
6 B! D% {& E& z8 W //PINMUX
! Z% h5 B0 _* R3 U, x* { m% C5 G //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
) p2 H, O& B# L1 p: D3 V$ A PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ j2 W7 D, e3 W; I. A7 M PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; , _/ u V& v$ o* O
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( f! m. \: }3 }4 @ ( `2 |& [6 [ s% g0 W9 y) a% x2 T( @
//SLEEP_EN,EPR,L138_SHK1,L138_RC1 G* x! Y ^! l% N7 o$ W$ [! B
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 S1 J5 T; p) J- n PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 4 W1 I! M* v4 p& E0 _# l
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);1 H/ e. j& ]; |4 a1 B% H
9 F0 u4 T7 S- x% C0 v
//RESETn,L138_SHK22 n7 B7 n& b) r1 C
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ; n2 @. T/ B; y* S. p u( g1 N
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
3 C: M$ X7 X1 K, X) ~ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);( \) a6 I4 Q" K, ~
5 _% q% M8 Z. T7 i; ~. p
0 U# d6 C3 Z _6 C+ E. S //SPCR Register
9 ~; g* N* h& c) d" m //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
. F3 U& i' ~( c. l temp = 0x03000000;//(DLB=0)
$ f4 }; g+ |" y4 J" Y- F$ U // temp = 0x03008000;//(DLB=1)
! W! @* ]+ R7 w1 D) w writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
. d" F& A' `7 s6 ~# J. ~% S temp = readl(IO_ADDRESS(SPCR_ADDR));
% Q; U+ U0 @( m printk("temp=%x\n",temp);6 M! Z# ]) |8 @# X' V& f
4 |, D% B; C: \% e7 s3 X; Z8 T9 U& F //PCR Register
$ Q7 r5 N. C7 D' s( O. r! w //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-09 W# x0 ?- q+ D/ F5 L# e. V
// temp = 0x00000F0F;
. v2 i/ Z: e" `7 w& G0 D temp = 0x00000B0F;( T$ ]0 ^- B* ?" a- Y4 R( f
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
7 z* U! O7 R6 R$ i$ h temp = readl(IO_ADDRESS(PCR_ADDR));, k3 t3 y' j. l0 H0 [5 W! E
printk("temp=%x\n",temp); 4 \3 r! i2 `0 h4 w# D
//SRGR Register, [$ R) v- K4 b2 j
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* Z1 g& g( I. [3 [5 r4 D% O# M //temp = 0x301F000B;
6 ~" F& W4 C* b5 s5 N8 f! ~ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
% r6 v% A# A/ m! ?5 w { temp = readl(IO_ADDRESS(SRGR_ADDR));
. v) J2 C3 H; h' {! P/ Q printk("temp=%x\n",temp);! O7 N5 `. l. @& j* D
//RCR
- h: ^+ i, a1 I8 F/ x$ n //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 e4 j& J) i1 k. b, P$ |0 ~ //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 ]) k4 u6 n6 Q- `" o8 \5 H$ V# g/ W+ ^* A temp = 0x00440040;3 p% J$ A7 |, T$ n5 d7 P
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
" K6 i* R# D) H* G& A temp = readl(IO_ADDRESS(RCR_ADDR));
$ F- M0 M& @$ p% V: E printk("temp=%x\n",temp);( ~: T7 h9 G6 k; O0 x
//XCR/ m; a4 H" R* ~+ v) G# B. i
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* a! u k6 l- ]4 Q0 p8 x# m; U //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0' E: I! n2 c( }( W% X
temp = 0x00440040;
, m7 I! [- P I" X) X" E writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
8 {' T( D* R+ v4 Z2 Z6 T temp = readl(IO_ADDRESS(XCR_ADDR));& s# @ N, J. T- k3 x" p# Z$ @
printk("temp=%x\n",temp);
0 O0 _; u5 k! t9 a udelay(100);8 T: \+ ?/ a' q
//SPCR Register
$ L4 R" K7 `' j //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1- `. H& ^3 r7 O9 b1 ~; i# \, Z+ |
temp = 0x03C10001; //DLB = 0 VS DLB = 11 [, @* u/ ~* L: N8 ^' j5 f
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled6 I0 p/ o4 q$ A$ l
temp = readl(IO_ADDRESS(SPCR_ADDR));: B3 ~0 H6 B8 I4 L! v1 z+ T* n7 {
printk("temp=%x\n",temp);
$ g0 G) ~1 U/ W udelay(100);
* z* v c' e0 e t
1 N' C) O0 s/ t4 Y# K //set GPIO direction( Z0 g9 W) ]4 [& ^- P& T6 I
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));# ` l$ \- p, [6 j
temp = temp | 0x00000100;//EPR----input
3 x6 V* y2 T9 \2 |! u( Q temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output$ B# v A, r0 t
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 y$ S6 X% _" z, k
- h4 T9 \4 l9 ~) k5 h% M' r
return 0;, i$ U- {# g) u
}) h: o/ f! E2 X
static void __exit MCBSP_exit(void)
' v3 T/ l: @, [* O0 l& R{& V' e: \8 P: L' y
printk("mcbsp chrdev exit!\n");
" L- g, ?/ \8 |% w. z cdev_del(mcbsp_cdev);
1 \" p1 }' ]5 l- I7 w unregister_chrdev_region(mcbsp_dev,count);
) o) V% E6 o* ^" M/ Z# Q device_destroy(mcbsp_class,mcbsp_dev);
- J; ?! p; t7 u class_destroy(mcbsp_class);4 m% t. K$ d* V N' B1 ^4 b
}
1 f) N1 L$ c! Gmodule_init(MCBSP_init);
7 N+ S, L' V) f5 m- s4 gmodule_exit(MCBSP_exit);! ?7 D" J, R5 w( l
3 F& N; n! p! @7 [; OMODULE_LICENSE("GPL");( N- V, { J3 N* n) E6 s
& @5 B5 ]5 y, H E+ a9 E
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。# a$ R6 D6 }. v& [; U, F) T8 Y5 {! @( s
我的应用层的测试程序如下
) w- }, M/ X- V#include <stdio.h>
% K$ p/ a1 g8 R9 z#include <string.h>
+ C' i. V% J% |1 V5 E9 [#include <fcntl.h>' h- \2 D. V1 p T! P
#include <unistd.h>( G9 F# |0 _! y* E/ C" X* t
#include <signal.h>
( F2 o* t8 c l: J |% T9 R#include <pthread.h> //线程0 M& @' B0 o9 A9 p2 g
#include <stdlib.h>
" ]- @1 F. P& h$ T% U#include <pcap.h> //捕获网口数据
+ \# x1 V- t' a1 t#include <semaphore.h> //信号/ w$ D+ d( |5 | ?
#include <sys/types.h> //消息对列2 Y$ d1 E" n" D, ^* p3 ?4 n9 Q0 T/ c4 @
#include <sys/ipc.h> //消息队列
2 B9 r% o- f( ~: Z1 H8 W#include <sys/msg.h> //消息队列- S, B. j7 y: d# N8 _- Y
#include <sys/select.h>
7 l* c9 }( L- W: U* k1 U0 r8 W#include <sys/syscall.h>
7 ~( @/ }7 |0 m#include <sys/stat.h>
, B; J( w( O% h#include <sys/mman.h>! Y' e. R( V) Q
#define msleep(x) usleep(1000*x)& ^. Q* c! O( Z% X4 I5 g
3 j# a( L% N1 w: F6 d/ F* kint main(), H: B& d# R. ^( G. u! v+ P
{ % y4 K2 o4 W1 D! V1 ]% k
//MCBSP,ARM与AMBE2000交互设备
3 x S! O$ q) O/ F int fd;& l ? K# h+ |# S) g4 @0 d$ F
unsigned short data_write = 0x5555;
% P9 O6 E( x, f+ p1 y7 X unsigned short data_read = 0x00;
5 p/ ^, T$ r( I5 W( } fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);% |" ?: W+ G# F! b
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);2 u/ \+ Y) \3 Q& t
: N9 ~$ S E* I2 G4 o; w
if(fd < 0)* W" p5 Z+ ^' x
{
) v" i% O% _ E: A perror("open failed\n");
{: T! h7 K& G4 j6 P! C6 I/ n return -1;
4 S0 M7 ~2 h$ E% ? }" Y. ?" b. i5 {' B2 k. m
# P' M. n+ u& ?* Q5 r& F while(1)
9 C# p R: F- r* p* h3 I, @+ M {, z3 V5 a6 X8 D: R: p! e
8 a; l; c* Q7 ~& [& V- V
//AMBE2000每次读写是24个字为一帧
3 E/ V- p$ L( z; D' O' ?( } //写数据时将数据在底层存储起来,等到中断的时候再发送
# U- H+ P1 V6 W //AMBE2000输入数据是以0x13EC开头的( ]. w6 M: S2 W9 \
write(fd,&data_write,sizeof(unsigned short));
- `; w4 t) o% x1 M! X , v4 F$ c2 H: A7 l4 v0 q4 _ t" a
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 $ R7 c/ Q1 i; V3 b
read(fd,&data_read,sizeof(unsigned short));
^, p! R0 R( j% `
% b" e" l% S* f: s$ S. U if(data_read == 0x13Ec)' i" u1 W( x( ^
{
9 J4 L+ O- f9 _. O( k H2 N0 R6 `) Q. y) Y
printf("data_read = %x\n",data_read);
& P1 d. l1 s, b7 | }
9 L$ F; M- d3 v2 i" c! v
; d! y9 y4 r( K4 q3 R msleep(10);9 L! q: E5 j% j1 v+ c( N% E
' w% M4 e: |% O5 @7 y6 o) @: I /*
7 G! a! G2 \2 a. N ioctl(fd,1);
; F! q7 N( X+ x* k* T+ v sleep(1);
$ @9 }4 `* r3 ? ioctl(fd,0);
9 y- j* w+ v, \5 v' D sleep(1);, I4 W% N2 H8 E U" n0 A
*/
" O: ~1 Y( y* [. K" J } ( ^/ I( q) Z7 T* [5 O
return 0;4 m$ e4 c- s1 u' |" c8 \4 n1 t
8 S0 W. V7 m; Q4 Z' x; c
}
4 E$ X6 g V! B: p3 `5 v/ ~' H' U3 L9 O6 g3 ]% W
多谢各位指教,谢谢! 急1 u: k" n! k& e; A. H" ]' W& c
* |7 J( Q) }; M6 h. B, Y
6 Y3 n2 x$ v) L; Z4 `! x+ Q% f
`& w( |8 I" U+ j9 ~3 R5 {# ~3 ~" o0 ]: H
, ~" ~) A1 _% Y9 S: ?* q |
|