|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 3 O: V6 q; U3 I6 Y
/*0 C' }' q0 O }0 M) I) M' l
* Copyright (C) 2009 Texas Instruments Inc
' e* c4 u& x. j& Y+ _) z n% z% K& O *: A: ]8 _, @5 z6 B( D5 ~
* This program is free software; you can redistribute it and/or modify; \3 C) Y5 o* K* N9 z
* it under the terms of the GNU General Public License as published by$ h9 h9 {& w! M
* the Free Software Foundation; either version 2 of the License, or
8 [' V, q, S5 }! f r0 Y/ P * (at your option)any later version.
. i2 a; Y! D6 t4 `& B; O *
! U" ?: b; u7 D4 R* {) ~$ ^ * This program is distributed in the hope that it will be useful,
$ L% R9 n, n2 b! k( o * but WITHOUT ANY WARRANTY; without even the implied warranty of
" S9 L4 A7 D8 P6 ?0 V2 _! ^ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the6 V! k1 M q7 M" H @4 {- {4 K6 L
* GNU General Public License for more details.
' z; O. Y' O% I: q4 n7 ^3 s *
c9 x+ i0 X& f# e3 w! [ * You should have received a copy of the GNU General Public License
. i9 t6 L% S$ E1 R * along with this program; if not, write to the Free Software
. E: \. K1 ]6 L0 m * Foundati5 g0 M* y* T0 y% I1 S' ]
*/) ]' r" I. j8 ?! Q1 R/ F7 j
#include <linux/module.h>
k4 J8 }$ `1 t; E# V. n#include <linux/init.h>
0 }# Z$ ]8 R& b; i+ R7 s4 \6 C# P#include <linux/errno.h>
" Z% `* C* B8 B" p) n#include <linux/types.h>
( x: m- i4 F+ S+ S#include <linux/interrupt.h>+ t( n. a, `& e. Q3 e
#include <linux/io.h>
% D; g6 A+ W! k$ e9 N#include <linux/sysctl.h>) h1 A# [6 X6 i- K6 B
#include <linux/mm.h>
: H; K# V8 e! F, U4 h) q#include <linux/delay.h>
6 W) x5 F# c( w4 a+ a3 [, R#include<linux/kernel.h>6 B; E5 T$ y( N: K
#include<linux/fs.h>- w) C7 O# F8 S$ q0 T0 ?4 f
#include<linux/ioctl.h>! p( g; ~- `9 z& t+ O
#include<linux/cdev.h>
. n U3 `7 b1 q2 c#include<linux/kdev_t.h>
5 h; |) J, x; U% p! p2 U; ?#include<linux/gpio.h>" [+ E4 H) s" x4 A, v
#include <mach/hardware.h>7 e H# T' [0 ~& W0 v& N5 F) B
#include <mach/irqs.h>
5 g1 Q( C& N) y
) p. E }* ]& r# ~" M6 Q4 c4 A, g#include <asm/mach-types.h>' F2 j }2 P+ ^$ J) K1 J
#include <asm/mach/arch.h>
7 O# \# M& h; ^& x#include <mach/da8xx.h>
" o% b0 t5 ?1 p) v3 C* t- c#define SYSCFG_BASE 0x01c14000
7 F6 o, U/ m( X& z#define PINMUX1_OFFSET 0x124
, m% F( ?* O ^: X#define PINMUX18_OFFSET 0x168
! X" V0 t# {" D' y7 E7 X#define PINMUX19_OFFSET 0x16c8 Y0 h- I8 M- i
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
$ D4 G) ^( x5 ?#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
3 ?% g. o$ K- Z( R6 [3 y% S#define XCR_ADDR 0x01D11010 //MCBSP1_XCR6 z( p3 Q0 C6 m: U3 S* m
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR$ o, P: z* e. L
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR# K) U" \( _% y$ \
' p" z4 }; l ]7 |0 ~$ ~0 ^5 W5 }#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
% g; v8 Y. I5 V! {+ w#define DRR_ADDR 0x01D11000 //MCBSP1_DRR# y/ p! e( |: y! l
//PSC6 X+ p! s) k( {) }& w- P
#define PTCMD_ADDR 0x01E27120 , X( m( }& l0 S6 V
#define MDCTL15_ADDR 0x01E27A3C
$ k! P" V$ d1 J/ F9 V" A8 U5 \#define PDCTL1_ADDR 0x01E27304
, l1 a- K2 B3 L) I, `3 J# q0 `8 q//GPIO8 direction
4 m" @8 S8 S; O& {#define GPIO8_DIRECT 0x01E260B06 \6 V6 A& c% K; w
#define GPIO8_OUT 0x01E260B4* c3 M {" J. ?- s3 j5 C# j
#define GPIO8_IN 0x01E260C0
9 K* S) M) J, D5 O" S; a- f3 t$ O( }4 G) M) x9 _
//#define MCBSP1_RINT 99
5 H1 r6 Z: n( p* _//#define MCBSP1_XINT 100
8 J5 ^) O& D/ F( _, h M/ r" ~static int MCBSP_MAJOR=239;
( m: {- E2 X: n5 Ustatic int MCBSP_MINOR=0;/ S! g7 x% w( a4 I- v
static int count =1;
- u, i; g) K0 t# e5 w6 U
* O1 [' X( y6 W% b- r9 ^, s+ U#define MCBSP_NAME "MCBSP-device"
}# r$ z6 W. t3 I
6 h( a/ j! g' p6 }static struct cdev *mcbsp_cdev;, `. Q. O1 L; B$ Q; L2 H0 C1 G
static struct class *mcbsp_class;
- H) f, F+ _, T9 o. Mstatic dev_t mcbsp_dev;
% D7 G% \# t8 iunsigned int DRR_data;4 E" Q5 S- i) [
unsigned int DXR_data;
( ~. ^2 |/ E2 gstatic int mcbsp_open(struct inode *inode,struct file *file)
- L1 B5 b9 u- s! ]/ ]# `9 K* q2 w{( l1 T% e' e: N! K0 R/ S
- ?7 r( ~. q) D f+ e7 l1 x3 B
//interrupt enable,initialized! Z" K0 B' _1 f6 v3 T0 s% [; _! t
unsigned int temp;% A6 y& f+ M$ i$ F
//SLEEP_EN(GPIO8[10])---0# v5 c3 v! o- D
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 d" E0 g" R, s# ^; l; Q% e9 T temp=temp&(~0x00000400);& B0 N" m3 \$ x8 ^' \) A; k8 {
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]% o, T5 c8 O" _, w7 v' G
//RESETn(GPIO8[8])----0----15 \ I& `0 X9 {" j0 B5 r: \
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
% k( C/ p, Q( q temp=temp&(~0x00000100);' G9 C1 M8 U7 d) G D
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---09 ?8 ~; J# A2 x, M6 x; u6 @$ \
udelay(100);8 J( q0 d1 e- W# K
temp=temp| 0x00000100;
, ?/ j4 \% `& H, _- p, b; M/ o7 q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
, o8 R4 r; s- O& ]9 C" y udelay(100);
4 A" j8 t- D& p0 N1 O printk("open success!\n");
- i. b m' m3 M return 0;
1 i. p7 g% x' `9 y P' z}
/ ]; O- K: o1 ?1 E/ S1 ~, f$ j' p9 B; T3 x/ Z. ]
static int mcbsp_release(struct inode *inode,struct file *file)
9 Y# |% [2 Y. W4 h1 V8 v+ K{+ x' A4 P5 j5 y; }& Q5 U
printk("release success!\n");2 t. ^# |( o+ e ?; O& [8 c2 j; o+ F
return 0;9 ^$ n1 R- |! ]% B* B
}
A' y1 S* _; R5 j% J3 I5 B" O4 P# Q3 _8 y. ~- V* e9 y% y
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
: V. p+ q2 [! Z5 M4 g& N. E+ D9 c{
. x: y4 M: I9 p& f V4 M copy_from_user(&DXR_data,buf,len);
2 ^3 b6 X7 K2 X6 T A0 x; K iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* e6 ]- h; ^* H* p8 N1 o& s return 0;# T8 f( _5 e1 A/ n- Z7 d
* G! m4 Q) H$ M) a, S" Z1 e, n
}4 A/ O) O: S) m$ F0 n+ k
& i7 h8 p4 A' i$ k+ ^0 ^2 X# l6 w/ x
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off): \( [& [4 I& C! a, n% D3 k# Y
{ + R" v% g; A6 _' G) T t
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* f8 j. s) E$ j( x7 C7 @ copy_to_user(buf,&DRR_data,len); . T9 a# C0 J- s
return 0;6 p9 c% R- u# f4 Y2 {- U
}
9 N- P% q+ I% o" G y/ S7 U9 U: S) s% _! B2 T( u* \
( m3 s$ v& X% g7 n4 T# Y) F* ystatic struct file_operations mcbsp_fops=9 W- R: o Y7 \& K7 p
{
; |7 Y9 s; z7 X8 H$ c! l .owner=THIS_MODULE,! K* N$ |$ d& I' o6 J. x" c8 V( D
.open=mcbsp_open,
) b2 G# v s6 I! i .release=mcbsp_release,. ` I# `5 K5 R
.write=mcbsp_write,3 M. ?/ ~1 J! c& `, u& l% T; ^0 _ T
.read=mcbsp_read,- u4 `- o7 a% v7 _2 p* h! R9 Y
};$ y3 ]% j. m! T3 i5 t- z, S
static int __init MCBSP_init(void)
3 H1 }1 ^, h" M7 A$ n2 o{
/ B3 d- j8 J6 K. C$ R int ret;0 k3 f9 P6 S+ Q7 t# T. i
unsigned int PINMUX1_REG_old;1 o# K; q( v) v" ]
unsigned int PINMUX18_REG_old;
% M* X+ U+ y* M( @8 V0 w$ J unsigned int PINMUX19_REG_old;
+ b& g* R! m: u: K* d unsigned int temp; 8 k K' a9 w. M4 s
if(MCBSP_MAJOR)
# k# ^0 w5 f( j {. `' \7 [8 Z. S
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 C6 ?+ L8 L8 r; [" x/ X
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);" @3 G W6 i! i3 e( \' Y- ]4 ?
}$ Y0 S1 h! @2 V0 N: R, t
else% X$ ?8 O, |: z8 r
{
# {$ g6 a, b( u+ P! l ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& @ v' P$ Z% d, b& q8 L8 k. J MCBSP_MAJOR=MAJOR(mcbsp_dev);
( {% ~, _9 V4 u1 Y0 y }4 [1 g A* K. U7 o' T/ c+ ]5 Y: U9 c1 J
7 H1 |8 _% ^) C& |9 I' z6 [ if(ret<0)1 _! |: ]8 \& n$ X$ j& H
{
( ~# N6 v9 f F. J printk(KERN_ERR "register chrdev fail!");
: `: C) m2 M8 V; j6 c# E return -1; V9 D. W1 I# [$ i6 J
}
5 u& ~! d: O% |9 @* M$ X* Y
1 E& M, u2 o$ [ mcbsp_cdev=cdev_alloc();
; U( }% u" ?8 T; C4 ^. X6 P5 e) ]
; u' R ^1 G, ^5 W2 ?$ b: [ if(mcbsp_cdev!=NULL)
/ Q7 p6 e. t/ \1 a: g; J {" r) ?4 t) [) x1 i: ]
cdev_init(mcbsp_cdev,&mcbsp_fops);
+ \/ s* Y, S! Z- e# K4 G mcbsp_cdev->ops=&mcbsp_fops;
6 [& d0 R A8 t mcbsp_cdev->owner=THIS_MODULE;+ s; O z4 J G% O) |& }7 ^9 r
# i3 A( V* m; n% M( }
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))( ?# A$ b2 [9 p- s. w( l
printk(KERN_ERR "register cdev fail!");
( S+ c. `, ]8 q/ w" P' N else a/ Q- Y" P$ l6 k
printk(KERN_ERR "register success!\n");
- F, x- X) E( A- D1 ? }0 m) {" `, P& F
else
, A1 \: r: N# T$ w0 n1 ^0 d {
1 A4 J6 C% K% R$ S printk(KERN_ERR "register cdev err!");
$ s) p& u7 O$ y- {; c& J return -1;8 a$ }" y& H4 ^( _2 i6 }
}
. X$ s7 ?8 ^; g: h( W 0 d) r% D# X: t) K* [
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);0 L9 z3 d" _! X, ~: t7 a
if(IS_ERR(mcbsp_class))
8 `6 Z* f, E5 v4 \' W2 c {3 ^& |. i$ W- Z" m/ |; j/ j
printk(KERN_ERR "register class err!");
8 N+ H2 B& G5 I! } return -1;
# Z. u) P: H3 C k/ v }2 u$ c# X5 ^* s0 d) S. q6 F
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);: ]" x% I9 ?7 N: W
' A: S9 e! g% ~! N
//PSC' O5 z( v4 O! _
//add Enable MCBSP6 ^- P- |6 n: I% H" a
//test- X, {, F& X! V+ n0 E! I. j6 {
temp = 0x80000003;) P! a2 ^' m# L' s% K
writel(temp, IO_ADDRESS(MDCTL15_ADDR));: |0 o& |7 |; c5 b, y
temp = 0x00000003;$ S1 \: o1 E0 W9 m$ q
writel(temp, IO_ADDRESS(PTCMD_ADDR));0 K3 S5 d( f. L% { \
# q4 r( A4 } X& u, Q8 I+ }" s temp = 0x001FF201;& M' f$ K! `' Z+ V ]& |
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
* R' P3 W3 n8 n; `5 b 9 f0 U9 W0 x" z1 j
//PINMUX * F1 D8 W- e( S8 G! T% G
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: q1 k6 d% h& }- M
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); , e+ @; Y' N# x' @- a
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; * ^( f" j* L' [6 E
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
8 I" e1 b! ]0 N3 h8 L5 v1 C
+ Z1 H8 O0 s3 x* D/ J6 A //SLEEP_EN,EPR,L138_SHK1,L138_RC& Z* s% }& F, c! ]
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) Q6 q5 h) D; X8 H PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
% @# [! ?1 T$ x) x; x0 [4 t writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);6 w4 v* |2 |2 z0 Z# D; [, N+ q
. ]! e( U+ X# L
//RESETn,L138_SHK25 x4 F/ m+ Q3 V/ W5 [( U
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ) c& U. J- O) K& g; }7 H: h
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
- A, Y4 Y4 u; n7 |. J" ?, O writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);: R* }/ Q) g: b- L* ]2 v _. } W0 A9 k
; P' J8 j2 F6 l: O1 ?* _
' _# g+ _3 x9 w6 Z/ Y
//SPCR Register8 f7 x( H) ~9 `/ M/ s
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
: K1 S6 e$ L$ z$ v! q temp = 0x03000000;//(DLB=0)
* k% ?5 l: J+ A: G // temp = 0x03008000;//(DLB=1)8 @( b4 f& }$ V9 _" G( b) F: V; @
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset. Z( Q$ O0 i# u/ W, v1 h
temp = readl(IO_ADDRESS(SPCR_ADDR));
$ q0 I+ ]5 N, l/ i printk("temp=%x\n",temp);! b. _; e& V7 z% G! X
, i) p- p/ @7 O c) c0 H& @' k //PCR Register, E8 H& D! ^5 v
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 b& q. L$ \" ^) e
// temp = 0x00000F0F;. T( Q; ^) Q: X3 N5 H
temp = 0x00000B0F;
) ~' F$ T/ ]9 C8 y5 A" o) k; p; } writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
. T, g3 M/ d" `4 P2 b( d& \8 Y# m' ~ temp = readl(IO_ADDRESS(PCR_ADDR));
' r ^- i: o( B @ printk("temp=%x\n",temp);
6 y2 Y' p4 S! N' l( C8 [1 K //SRGR Register
0 t3 ^" @0 {' K) P/ o //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11, v* k. Z# Q3 ^9 ~+ A2 [, h: W6 H( j
//temp = 0x301F000B;
2 r) t6 K5 M+ m) |. ^, x& N" ? writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
- |: v; G& N- y% j temp = readl(IO_ADDRESS(SRGR_ADDR));4 j0 C1 w& q. v$ {, \6 i1 ~" t5 x* i
printk("temp=%x\n",temp);
! J7 Q1 `- L$ a. B- g+ z //RCR& b/ p' E* f3 y4 V5 u
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,0 W+ q( v* ~( w6 F, ?: {7 E) d% p
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
6 w8 V" ? X' c2 a2 ^5 i' p) _+ E7 F temp = 0x00440040;6 F, X* y% x' }. b
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
6 n% T. f8 [7 T- p6 c b temp = readl(IO_ADDRESS(RCR_ADDR));4 N" M; y G9 Q# i& t! k8 ~+ P
printk("temp=%x\n",temp);. ?- L+ q- l! L+ u' r6 N. p( i
//XCR% x8 B+ P- T% K7 {
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 V& x8 b" }+ \' m& C# s
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0' _+ i' }/ Y9 d9 [/ E
temp = 0x00440040;. ~: v# C7 L+ c; F
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
1 S" x$ A/ Q, K1 i temp = readl(IO_ADDRESS(XCR_ADDR));
3 ~7 @- z/ W& } printk("temp=%x\n",temp);! H& H9 z$ C& u. u. u
udelay(100);
, C8 i. i4 N/ p //SPCR Register
+ e& K3 z: O. [ //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1/ l$ ]9 k1 D9 d8 s9 D3 C5 `
temp = 0x03C10001; //DLB = 0 VS DLB = 1- A, G# ?( n2 h b8 E& k6 j- t9 N1 }
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
1 T6 v+ _' `' c temp = readl(IO_ADDRESS(SPCR_ADDR));! k m8 J+ y$ \' K. I
printk("temp=%x\n",temp);6 N% ~& O8 }" C# {( P9 \) T2 z
udelay(100);! Q7 D3 a" G ^
- B9 S& H5 f- h. B! ^, D
//set GPIO direction$ G4 X2 U( K# g: v1 x
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));* ?3 b4 g5 R. e
temp = temp | 0x00000100;//EPR----input! q) M: \( n, i! `. }) ^
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
; e2 j9 k3 d1 W1 {2 j __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
6 i8 R+ b# K+ v4 D2 E 2 x. `0 s( L M( t& s( y
return 0;0 h8 s5 u" A$ Q8 J. e4 u
}
2 l I! `& W3 S; A9 hstatic void __exit MCBSP_exit(void)1 s* n7 ?3 o$ h0 e4 [: J7 x. ?8 ^8 j# U
{- s9 b( w- Q) X) p3 \
printk("mcbsp chrdev exit!\n");
% M; r. i3 f* P8 p cdev_del(mcbsp_cdev);
, x3 }7 s) C( u6 I t unregister_chrdev_region(mcbsp_dev,count);
5 G8 H9 y8 `% ?. r, \ device_destroy(mcbsp_class,mcbsp_dev);
. u1 ]0 Y, f( N) d* Q class_destroy(mcbsp_class);
$ Y0 u: R( L7 n# k+ I+ F a}
) X7 X1 R4 r8 p0 Smodule_init(MCBSP_init);0 n2 Z2 ^# m0 F/ S( A; p
module_exit(MCBSP_exit);
* Z" k# ~; n) c9 w! G
, e7 A; [: ~9 V& y! XMODULE_LICENSE("GPL");( m; Y+ p& V4 ~% ^
7 P% e& i7 R: e" b+ z) U2 e9 \
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
5 q2 ^, _2 H) S, i8 }4 d0 @8 J我的应用层的测试程序如下/ t2 e: O! a. m7 _5 d6 n" u
#include <stdio.h>
$ A$ s$ b9 G0 F; Y#include <string.h>
' R- v& [' B) a0 Y K& }#include <fcntl.h>) F7 F+ s: M/ u& g3 ~# z+ B
#include <unistd.h>- }. ]# j. C0 X
#include <signal.h>% @) G% c l% v! O- l
#include <pthread.h> //线程( f3 t6 d7 g% Z$ P
#include <stdlib.h>
. ]) F3 ^7 i- W" d% ~#include <pcap.h> //捕获网口数据8 g9 b: ]0 P1 l- H
#include <semaphore.h> //信号
# q6 Z% b( E# G; Z; Z7 | k* S#include <sys/types.h> //消息对列
2 t3 d7 m3 x6 M7 n' W8 T! Y" `#include <sys/ipc.h> //消息队列& X& J8 A4 a/ T) i s$ I7 S
#include <sys/msg.h> //消息队列2 K9 J. z, O& i$ D8 K
#include <sys/select.h>& Z* s$ R5 x2 y. Z
#include <sys/syscall.h>. u8 T# x$ i0 e& ^) W
#include <sys/stat.h>
' |) @ u5 @, D& N7 V- P" @5 R#include <sys/mman.h>
/ O8 m) o7 d' K- ~9 E/ S: z& V' C4 L#define msleep(x) usleep(1000*x)2 K( n, J) T3 p4 ^- Q7 l
! d& r U8 e3 t6 O- L, y) u# }
int main()
9 a: |) o; `4 ^1 }$ ~1 S8 J{
8 g0 [' w* n% h5 n- w# v, o //MCBSP,ARM与AMBE2000交互设备
( r$ k6 T- {- E5 p int fd;
$ t( F- g' z$ j/ [6 w1 N D1 S( L unsigned short data_write = 0x5555;
; K% r+ W% |9 r# I unsigned short data_read = 0x00;
! ]- ]8 A* L' V* n5 r8 M fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: c- H' m& E# N: V5 m
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 @. l% o D+ J; F2 b
/ q9 d+ I2 k( l if(fd < 0)
+ h2 d( l0 p, H T% R/ ? {
% h) b- e( q. J N perror("open failed\n");; z/ Z1 [* M& C! {9 M! q
return -1;. H) z' G. V$ T8 |# B# ]
}
, i1 Z! h5 A# Y7 W* E1 J 8 L8 ~3 N3 o9 I& w# C1 ?
while(1)5 K4 Z& Q! w1 o; X3 O$ Z
{
0 `8 R8 t: f$ E7 i- P* g7 F% a: b & i* ~( O( ]0 l4 G- I# q' R
//AMBE2000每次读写是24个字为一帧
" q; B" |8 b' w* W% {0 z% H //写数据时将数据在底层存储起来,等到中断的时候再发送0 f6 x0 M; R7 J* b% T7 Q
//AMBE2000输入数据是以0x13EC开头的
" h# X4 \" g' C9 _6 w! r- v( m write(fd,&data_write,sizeof(unsigned short));
* L; N( C" t3 N R& j" K
. |0 T& D5 Z+ ?+ H7 { //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 + { z( S+ q0 Y+ z' r- Y% I- T9 m
read(fd,&data_read,sizeof(unsigned short));- t) F0 l+ e2 P9 |
2 n- I% H; s/ y
if(data_read == 0x13Ec)
1 K8 ?% G) H) {+ ?( l: |5 F {
1 T5 N4 ~0 O5 x' r
1 }( {" U! l" A. j$ ?" J! K1 A printf("data_read = %x\n",data_read);! n( I: _4 O1 A- A) R/ ?
}
0 \# r3 T' V$ ~1 U 5 f# y3 O t6 b4 P: c/ x$ E
msleep(10);
" b/ \2 l7 L& T5 l
9 `2 m% O5 A: C4 v /*$ ?$ N+ R6 J- ^/ Y2 U
ioctl(fd,1); 7 i# d7 t9 ?) Q' m* b
sleep(1);
' x' ~% O5 F6 I) z7 D ioctl(fd,0);
3 d* k5 ^$ _/ T+ n4 \' x% f sleep(1);4 y, e; l& }- X8 T K3 y% m1 i
*/ 8 W1 z/ U) `& [* {0 g8 @# S2 [' q* x
}
z1 ]! S& A; @& }- G' @$ q return 0;. I; z, O# v, o, ^& K/ l+ H0 O
! Z! B) O9 \; ]& C# C5 f$ r4 F8 I" j
}- ?' `8 y& I: K# ?/ P, O
1 v* K; u2 T9 t9 x" F多谢各位指教,谢谢! 急4 |" [$ i' }) z" t% ]
* K% f( i5 l7 k( u8 I0 x2 n+ `1 O# Z: [/ x5 |
& i2 _ {7 ?5 T( ^3 }
4 h6 `! Y [6 v& v1 d7 d* I9 q. f8 Y6 h6 [ }
|
|