|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: " N2 z/ Q8 [' x0 ~( W
/*
0 M2 _* H8 l$ s6 V+ T/ A * Copyright (C) 2009 Texas Instruments Inc* S2 f. H) @% c t
*
7 @6 Y) X/ f1 [- G' i8 m! W- p * This program is free software; you can redistribute it and/or modify
) y" \. [% `: B" b. P* [2 R- a * it under the terms of the GNU General Public License as published by
6 L: T) L# O( k, A/ r9 L * the Free Software Foundation; either version 2 of the License, or
5 F$ J E0 x* D* L" i S" | * (at your option)any later version.
9 b+ P! a$ p5 w) U" _ *
" ~1 g$ c/ D2 L2 d1 { * This program is distributed in the hope that it will be useful,
0 _5 _7 e2 a% {* Y0 _# ] * but WITHOUT ANY WARRANTY; without even the implied warranty of
W! R; x! V) t6 R% R * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
/ k4 l+ a9 x" a( A' a- i; m * GNU General Public License for more details., r% m5 B- {0 _9 G7 R, f
*! b' z9 ^0 X7 j. L
* You should have received a copy of the GNU General Public License
1 f/ ]* A6 G- |8 ^0 W% [! \ * along with this program; if not, write to the Free Software
w: L- k) {4 P3 i% o& z * Foundati
" H: E+ `6 _5 x1 [' @, _*/; ^, d9 {# s7 I$ a! |; x9 G
#include <linux/module.h>$ x6 Y4 s6 ^( ?' |) c1 |1 C: d' ]
#include <linux/init.h>& P' u) {' D) p+ Z5 P6 U# q( g
#include <linux/errno.h>7 I( }9 G/ F4 v1 h5 I
#include <linux/types.h>) \/ _& Z) K' p- Q) E6 l0 |
#include <linux/interrupt.h>
/ \) |- @& z; K0 n2 r#include <linux/io.h>; r# P# E7 Q1 f( ^$ k
#include <linux/sysctl.h>% e+ _ G/ \( P% I$ _2 A0 K
#include <linux/mm.h>/ M3 y* C* a% _7 R0 v" G$ ]2 l' X6 r( W
#include <linux/delay.h>+ O$ |+ k b2 S, c, C
#include<linux/kernel.h>
- j# y9 U- k# m" n! {0 S( Y#include<linux/fs.h>
" `. J$ W+ d* z# D( q#include<linux/ioctl.h>
8 J/ q+ B. s& U: \#include<linux/cdev.h>
# d& L7 ]9 G) {#include<linux/kdev_t.h>5 u* U6 @9 v G+ S! i5 k
#include<linux/gpio.h>
! c5 t8 C8 i/ ]1 _- n#include <mach/hardware.h>: ]8 p1 B% q$ f" N6 O
#include <mach/irqs.h>" f. i/ T, n2 B# I S. z
( u/ q) f: F+ G# Z! n& r( U#include <asm/mach-types.h>) @% C7 k0 W; w5 K
#include <asm/mach/arch.h>0 _2 m! ]% ?) g0 \: \
#include <mach/da8xx.h>
$ m1 S0 j) ]* w1 s5 k4 M6 @#define SYSCFG_BASE 0x01c14000
6 K0 l* S! T2 e5 M" A0 f# T( C#define PINMUX1_OFFSET 0x124 8 P& N) P% G4 ~& @1 w3 B
#define PINMUX18_OFFSET 0x168 1 U) q' o9 Q+ e9 v& Z5 E- Y( p, p. ?
#define PINMUX19_OFFSET 0x16c
3 p" i( }0 |4 s4 t#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR& m9 T9 |& K, h' k3 U' N
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR8 C7 c- P/ E. {
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
1 @) |, }' F! y4 N- {#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
, R7 ^. c3 C6 w+ V( ?# P' w#define PCR_ADDR 0x01D11024 //MCBSP1_PCR; b6 u" m& y7 R( b1 q. d" {% \4 C
5 W5 ^0 U* T9 A* |- R T8 H) z#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
I, e. I- m4 ^9 L7 Q#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
5 n& \& p. m; A2 n$ c1 I//PSC
) G. \7 x6 F' _! w#define PTCMD_ADDR 0x01E27120 - b8 n% g- F, C
#define MDCTL15_ADDR 0x01E27A3C
" F; v% W- l4 F; L" H6 m#define PDCTL1_ADDR 0x01E27304
. f: ^5 B7 H7 N3 w8 e//GPIO8 direction4 w9 n' ?' k. S5 D8 J' v3 B, _, ?8 {
#define GPIO8_DIRECT 0x01E260B0
$ c5 R* B" u, u7 ^4 m* r e0 A- `( X#define GPIO8_OUT 0x01E260B4
/ J9 [2 U" \6 M. w#define GPIO8_IN 0x01E260C05 q0 ]- R$ o, p8 c2 ?
( i2 [' B' y H
//#define MCBSP1_RINT 99 6 Z3 G. x: h0 P
//#define MCBSP1_XINT 100
3 j/ I3 T7 v/ y, Q" U: fstatic int MCBSP_MAJOR=239;
! S0 I& L! z( u* ]# l% Z: Q* G4 o: g5 Pstatic int MCBSP_MINOR=0;4 ^, l# ^- j7 T7 f
static int count =1;
9 S# ]( I, K& Z n. V9 o e4 z& C u- S& {+ Z! M: x8 b8 u1 k' M
#define MCBSP_NAME "MCBSP-device"
' y/ g, Q5 \+ k4 b3 E v6 Q- t$ l5 I/ |) W8 O( H
static struct cdev *mcbsp_cdev;
4 r! k2 ~, v- p# L( ~0 C; I2 mstatic struct class *mcbsp_class;
5 C) o5 ?% p4 rstatic dev_t mcbsp_dev;: n# h# D. h% y3 x
unsigned int DRR_data;7 U7 l4 t: I3 T
unsigned int DXR_data;
8 a+ d' B8 N! r7 O7 p$ D2 h- ~3 xstatic int mcbsp_open(struct inode *inode,struct file *file); H7 f, H' n0 o' D+ i: U! d$ E
{
$ z+ K! `4 m. _ ! {7 w) X8 E! ~
//interrupt enable,initialized
5 X8 ~4 d6 d. C unsigned int temp;1 E; N' M. F6 I7 `1 D# S, L$ _
//SLEEP_EN(GPIO8[10])---0
4 z# J' s7 m8 f2 V& c temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 V4 v3 y3 c& v x
temp=temp&(~0x00000400);
9 K g" I* e( O* S& D* v) l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]2 O" x8 ?: W0 y
//RESETn(GPIO8[8])----0----1
. Y F- ]9 P* A/ Q3 Y7 _ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* n+ i( V7 `+ T, z
temp=temp&(~0x00000100);1 u( b/ e" `' Z1 c7 _& P1 i" c8 D
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, ^1 J6 u0 I& F8 \- g5 T' O
udelay(100);/ G0 w& Q0 @! A6 s9 F0 ?+ y7 a) f. Z
temp=temp| 0x00000100;# S8 L* Z1 W, z
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
* A9 \5 a! E) r2 \ udelay(100);2 ?% u% h' \ a/ z& ?
printk("open success!\n");$ x1 u" |: u* b/ x9 t% ?# B( F
return 0;3 U8 U: P4 g* }9 P& _
}, n# _% H$ Z2 W7 ]) {6 p' k
" ?5 q$ F9 j8 ^6 h
static int mcbsp_release(struct inode *inode,struct file *file)0 e1 I% Y! ~/ [' N* O+ p, T
{7 U$ ?/ @* N% z! D
printk("release success!\n");- K. Q2 ]5 ~( a# N* X
return 0;0 e- m! u/ u/ x
}3 r" }) l1 E: m _( a3 d
( a7 u4 ]: `2 Xstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ }9 y2 V/ |& |' W{, T! u. G( |9 Q- d P: R$ }, h
copy_from_user(&DXR_data,buf,len);* N( Y" ~& h# Z: i5 g& h, E
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); % L1 h# h+ g$ h8 |9 H
return 0;8 M* a% d% B. e% I$ E6 p, Z
( k' Z: N( V2 `}
6 T$ q6 q% e' Z& \2 k, Q' E3 W k m7 ^" q# A5 ^
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)% }) l1 c$ w, z) ?2 K& W+ U
{ 9 C7 g$ l6 a) X- N7 p" @
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));) T0 t- s0 z$ c& O. z
copy_to_user(buf,&DRR_data,len); m4 d; u# }* j' A
return 0;; I/ i, u7 Q" ^9 v% n& U5 H
}
& X) q$ K$ T$ t4 {4 v
/ b6 @. `9 g2 _: v
$ F' g7 R9 {, x8 I. k# g& ustatic struct file_operations mcbsp_fops=
8 L, p/ i. x# Z j5 B+ q0 M4 ?0 v{
7 l$ Z$ I0 H0 ]. e# G .owner=THIS_MODULE,2 d% o8 ^4 J/ S( C
.open=mcbsp_open,
& d! ^3 P" a+ `* ~ .release=mcbsp_release,7 j* n$ J- O% E" }" I
.write=mcbsp_write,
, U7 q5 i E4 J .read=mcbsp_read,( ~: A+ z! u" }
};9 o! K& K) ]! G/ J& W! X% V
static int __init MCBSP_init(void)
' w% ~8 m( M: d& A* a{, G( M- v9 K- S. w! P* ~
int ret;: I! q- z) i Q. ~/ l) C9 p
unsigned int PINMUX1_REG_old;- s' K/ N! a7 u9 h
unsigned int PINMUX18_REG_old;! u H4 v% b) \$ h% e/ t W w
unsigned int PINMUX19_REG_old;
3 |& ?( V7 c7 H# T, M4 ?% w unsigned int temp;
, O1 h2 [3 {' y" {$ N if(MCBSP_MAJOR)2 N: F$ d( f. l+ C
{
2 R C8 U# E5 @, \' e5 h mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' d- Q: x, v; ^ H, `4 f ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);& V' x% i! ^% ~/ X/ {0 R
}* g+ d/ x+ P+ D6 t5 ^' U4 n
else5 V' T/ ~* l/ P8 p
{
! J. U+ h' O4 Z9 S ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
S# G3 i6 I9 I1 l% k. x1 S+ Q MCBSP_MAJOR=MAJOR(mcbsp_dev);
! W/ }8 V! b- X/ l5 G5 y }% x I* o- B* b& }; c; |
' E' [3 ?7 F) S5 M5 T
if(ret<0)4 y, c/ S3 A* s& X' Z) K- |
{! i. f: b/ o+ T8 H
printk(KERN_ERR "register chrdev fail!");/ F0 u) w* `4 @4 g9 G8 p# P! [) D6 ]
return -1;
* G3 ~- }1 U- g. c3 t- f }0 O, C8 s3 E, K' b6 \
3 Y$ R' N0 l& v% ]4 n# F mcbsp_cdev=cdev_alloc(); J! e7 B/ b3 j! L$ d h: @; q
$ p; J- M0 }7 g5 c8 ?0 F if(mcbsp_cdev!=NULL)
" c1 I1 {/ r, x2 q( |( O* f {
& ~! v+ V ~* d cdev_init(mcbsp_cdev,&mcbsp_fops);
4 {* c. R" I3 x p& S" e! E mcbsp_cdev->ops=&mcbsp_fops;- i1 \! P6 o b Q
mcbsp_cdev->owner=THIS_MODULE;
. j7 U; g7 Y8 w+ ] / R( S/ H( W/ X8 J" x
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 [) B7 W+ w/ ~4 C) \ W: |
printk(KERN_ERR "register cdev fail!");- F6 Q# i8 p0 J9 n* s" U
else
8 P( f3 Z f) n, y printk(KERN_ERR "register success!\n");
, i7 |1 e8 {& `; n( p8 P/ a7 L }+ R0 \" O. e' S& w; r# e+ M6 o
else
" x9 l5 |2 x; ^4 \ {
! T' L; q u+ Y% R+ V+ e y printk(KERN_ERR "register cdev err!");
: `8 i% l8 |" q% S return -1;
# W# F; x2 o' J+ W }
2 N* p, M( a# h4 p2 r: J) H * h8 e) t: ?, k3 A' U m
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- z, n% @% S$ e( d2 H/ G if(IS_ERR(mcbsp_class)), d- I3 a; t d! x, T
{
% ]' P$ Z: B9 ~) `3 ? printk(KERN_ERR "register class err!");. d9 `* C8 C6 S3 Y8 p# M5 g4 f
return -1;* [6 b! B( r& B+ i% x
}) d8 Y% x/ O7 ^
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
4 T- N4 T! D1 K1 u8 l# P( w
- L$ Y" z2 k! b# f2 J //PSC! ?7 t. u2 [" `( P- ?
//add Enable MCBSP$ ~& S C7 a0 |- p2 V! h* @
//test- M+ r+ w5 k6 X/ M2 Q8 X# C X
temp = 0x80000003;
3 S5 _/ D( l% Y( f& h3 W) b writel(temp, IO_ADDRESS(MDCTL15_ADDR));; I5 U/ r. V) F! k3 A3 d
temp = 0x00000003;3 k/ R0 y7 R& w. s
writel(temp, IO_ADDRESS(PTCMD_ADDR));& R8 ^" X1 ?' l1 g! }8 u
& N2 s. w$ S2 p6 o
temp = 0x001FF201;% m9 p, Q6 }5 J3 w, E7 d! ~, N% A1 [
writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 z5 z$ W- Y9 r1 N* P+ }
& `9 ?( c4 h7 h( w/ M- v. {
//PINMUX J7 E ]6 n U. b' J0 o
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
# Y* v( n6 M9 \2 i# A PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 o9 _3 X2 u6 H! \ M' M# B PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
, T# r& I# v: O* W writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 q9 ~9 v7 Y4 A" d9 r1 Z
3 {# ]# Q- p J' n2 I //SLEEP_EN,EPR,L138_SHK1,L138_RC% i7 y/ c0 e* X* H9 n6 S
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 9 P2 p. l7 Q$ A& h5 `
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; # g( J+ J8 ^7 x4 Y
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);2 K3 U5 p8 C% D4 A+ [
! _4 Z- \$ ]0 C- r5 p' a) W3 V: U+ ? //RESETn,L138_SHK2
+ ^3 O0 m7 A, }* J PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
* \ ~: }$ u$ t+ v" O& z4 Y PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; $ v# I7 ~9 Z* c; S: Q7 z$ c. [( ^
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
# N2 {9 i. m+ y; d+ p - W$ x' B8 z% u% N( f
* _) e1 H* l# c; o. @4 [$ `
//SPCR Register) E5 n1 ]5 i0 [5 T* L- v
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
; o' @6 n+ Z9 M7 B" c temp = 0x03000000;//(DLB=0)
/ t1 k# x' m" T3 w$ [' U2 W // temp = 0x03008000;//(DLB=1)
+ Q+ s( z2 B: p& U writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
6 Z1 R1 s x- O temp = readl(IO_ADDRESS(SPCR_ADDR));
, \+ l3 B: Z7 K# a- w8 A Z printk("temp=%x\n",temp);
1 m2 ?* g, ^/ C8 \/ F) r8 R
8 E8 V4 Q% [) ^+ \- r; @ //PCR Register
; `% V: }- ]5 _6 K# [+ r0 P //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
; N6 X. N; \& D // temp = 0x00000F0F;
1 X- t, @* ]0 w temp = 0x00000B0F;8 g7 T( q6 X w: L
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ( K' v" i6 i* |# n B, v& J. T5 E# A- a/ u
temp = readl(IO_ADDRESS(PCR_ADDR));: F$ t7 P; \9 Z+ j8 Z, `1 e! S
printk("temp=%x\n",temp);
, O2 f u. L! } //SRGR Register: _3 F ^( n, g& c; P
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==115 `: j" W6 B0 `$ n9 @2 h
//temp = 0x301F000B;
8 \# P9 ~; j7 R4 x writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized $ Y. s! I$ [* i' x/ C8 z
temp = readl(IO_ADDRESS(SRGR_ADDR)); K1 T, O- o3 ~2 b1 k; X/ \
printk("temp=%x\n",temp);
' V% a; `( x7 N4 g. H6 @$ R- q+ E //RCR' c: V. ]1 K5 F3 z0 Y7 T# x
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,% F7 {2 T) G, [& A7 q; A: p; ~
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
% d6 e4 d F# e7 M, w; u% N temp = 0x00440040;& d; S" V7 G* R
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
( w) i. n+ w4 [* p temp = readl(IO_ADDRESS(RCR_ADDR));$ o7 {0 b# w* I2 ^
printk("temp=%x\n",temp);
2 z* }+ g* g- b& j8 N& K //XCR
7 f+ J" Y: d0 i$ I' e //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-17 L$ W3 U2 f. c# y1 y3 O9 Q7 l
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
: D) U5 I' w" v. b temp = 0x00440040; q' j& k B( c6 |
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
( [" K) Z5 ~1 r# V8 h2 s% Y temp = readl(IO_ADDRESS(XCR_ADDR));7 m. h- W7 L7 Y8 I" B
printk("temp=%x\n",temp);
* L) Y7 {# ^0 n n9 X0 l udelay(100);
' x! D4 j! E4 n$ x //SPCR Register
9 m. S; T$ u1 D6 z: i0 W2 } //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-17 Z0 U( C0 l- w" K
temp = 0x03C10001; //DLB = 0 VS DLB = 1, i2 e/ u/ e; l* X
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
, w2 G5 g# Z$ r C9 W* _ temp = readl(IO_ADDRESS(SPCR_ADDR));
$ D* ?6 l# s1 j3 E2 F; g printk("temp=%x\n",temp);
7 E1 c8 e& w# z udelay(100);2 ?4 t" G' e9 S% S
9 V; n# w0 R8 x) H$ r" p3 _! Q
//set GPIO direction5 ]. S$ |8 s B$ c$ f* D0 \9 ~- o/ M
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));6 Y) Z1 g7 I0 Y+ ?( q/ L
temp = temp | 0x00000100;//EPR----input: K( o: k0 |/ S
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
& @' d" r; V/ } __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " a# N( C. Z1 K# y
! d; e) |0 R: S
return 0;
, o' Z, n" \$ o( _ p& _}
" n5 f. E! Q. A3 Z! i" y5 O0 q/ Lstatic void __exit MCBSP_exit(void)
6 Y( d- v4 S: ~5 \{
! W2 o% c0 y, O% n# ]1 X7 g4 @' x printk("mcbsp chrdev exit!\n");- J& p/ o7 q2 c) R7 f. s6 [4 ^; `
cdev_del(mcbsp_cdev);" p- ]$ l% ^1 t! Q" M% [6 p
unregister_chrdev_region(mcbsp_dev,count);. q0 g8 O$ m7 f4 n. q. q6 w
device_destroy(mcbsp_class,mcbsp_dev);
9 h4 J$ I- z9 K6 y) ]. |9 n3 c class_destroy(mcbsp_class);" z3 ^7 t; \7 I, r+ M% D
}0 r2 d- C2 Z- b+ O; f1 P5 ~
module_init(MCBSP_init);
9 m: g" u. w( Emodule_exit(MCBSP_exit);$ y. s O: P1 e2 V# h
! c4 B6 ^6 L* z% K+ aMODULE_LICENSE("GPL");
/ G; B( F. t, b( c C0 w" \. O
$ D+ N' j* T% {4 x9 n( C( ]7 e7 y& E/ J我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。$ `0 H& Z3 G( W% ^( W9 Q' P. F
我的应用层的测试程序如下0 X2 D3 r/ |! Z6 R
#include <stdio.h>
1 r6 G( F* X- ]% F) i4 p#include <string.h>
. Y: X; b/ E) I#include <fcntl.h>+ V. a( Y. m, }5 |- E# g
#include <unistd.h>8 S* ~8 ?' h& C8 F2 F
#include <signal.h>1 l4 p) Z+ o5 j+ T5 a
#include <pthread.h> //线程 ]* j% A( |, _+ A
#include <stdlib.h>
5 p" S9 y6 |8 \$ ?; y& N* k#include <pcap.h> //捕获网口数据
2 W/ [- X# i- r#include <semaphore.h> //信号6 Z4 G! }0 S; Q. m9 b
#include <sys/types.h> //消息对列8 b4 w3 ^ |( u- [) E6 \. T
#include <sys/ipc.h> //消息队列& E; }& b C2 P; q
#include <sys/msg.h> //消息队列- a3 b- V R7 l. R$ W
#include <sys/select.h>
' h# d& P$ L1 l# [ @#include <sys/syscall.h>
) u* u5 _: x2 O6 p9 L4 x5 h$ P* L#include <sys/stat.h>) b2 B* c( c( a4 z# H6 D. k
#include <sys/mman.h>
9 E6 t2 ?% i b#define msleep(x) usleep(1000*x)
* d1 W6 E: M5 q }3 u+ S- d2 J3 v, |& M9 {" g
int main()
P1 i) Y8 e7 s. |4 u+ R9 i{
, @, F2 c6 T0 m6 \1 o! p- E- L7 w8 ~ //MCBSP,ARM与AMBE2000交互设备3 I/ o+ r& P9 [. |
int fd;; t0 V3 r9 k& e9 Q
unsigned short data_write = 0x5555;- s8 I& A6 v( s. C# r
unsigned short data_read = 0x00;
% b$ q: Q6 ?* g% Y fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
) K% Y$ i7 p) E2 _ // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
w5 A, A5 L9 v# f: ~
! v A6 d0 B/ L8 }( b1 U5 F if(fd < 0)4 l9 P( X* P# m
{
. t& ^% e! D- i' }( O perror("open failed\n");
, f' q3 z6 I! w; N8 z' ^0 ` return -1;
6 J) k+ b1 @8 F# W }
' ^5 Q0 ^: W. i Y' c1 l0 `. U3 M
l$ ` W+ H1 S; A6 F! a+ u$ H while(1)
/ ^3 z# y- r9 P4 G {% I; D& c. O: A' \9 k
/ _& c7 g ?' {' d
//AMBE2000每次读写是24个字为一帧
7 O6 F) B( @2 K, v- v- ]. E5 K //写数据时将数据在底层存储起来,等到中断的时候再发送
/ c9 V" E6 V" f- E5 n, M/ B8 a) l8 s //AMBE2000输入数据是以0x13EC开头的0 Y- k) K# _9 e: ~2 o0 Y
write(fd,&data_write,sizeof(unsigned short));
9 w6 w% |5 H4 B$ | $ o1 f. W! p8 A5 K. z2 }" U+ a
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 $ `3 M& H8 K, ^1 G8 z3 P
read(fd,&data_read,sizeof(unsigned short));
' q5 ]) @' Q! Z6 l: Z1 ^
! S/ c% v/ n$ x6 x6 M if(data_read == 0x13Ec)
2 {! f9 o( r% s% S {
4 y8 T. _5 D7 { c( U$ P7 h. d
5 i/ m8 P. _) E. ] printf("data_read = %x\n",data_read);
% |- S" b4 {2 E" a5 d2 P) U$ I* B }
' c2 a3 W8 _+ l5 Q6 [2 M/ ? / E0 v3 I, S8 r& w! P4 s
msleep(10);
3 R+ f0 ^$ Q& z' G c- _" Q
' f. a) l6 L+ y" M /*7 t$ [4 \0 z; J- p$ ?) v& ~
ioctl(fd,1);
% `2 O$ N1 h; O3 v" _3 `+ [ sleep(1);* T ?% G* M% [6 f% }
ioctl(fd,0);- Q' c1 O' y; O5 z G4 \
sleep(1);
& Z3 n7 O! `5 n */
- y- f+ y/ O# p3 b# v5 q4 s& D }
# H! ^, k; p; P; Y return 0;9 q! s0 D% V: a
\; V" C) s8 D+ D0 Q2 ]; z3 K
}
# R v) \* V6 `3 p9 R1 l% D
' e& `/ C" p2 P5 l多谢各位指教,谢谢! 急
8 Z0 a) j4 G2 a3 W9 `: n9 Z* y) ?# e2 G! s" \' O! ~4 h9 V
0 U/ F8 x( |% e, y/ r4 S3 m B9 }7 p. o% p
R0 h& ?9 m( ~2 H6 S* P
; \" L4 o% J* x) x" `, i
|
|