|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
2 b( B4 A+ ^) B/*
5 B# @9 m+ x0 j( \4 x+ v6 K * Copyright (C) 2009 Texas Instruments Inc
' A( C" ^) M/ o. K *2 N% c# m$ l, t+ Y
* This program is free software; you can redistribute it and/or modify
' A" y6 G. e* p5 b# o * it under the terms of the GNU General Public License as published by
! E! `4 N" a) ?$ W* j8 Q * the Free Software Foundation; either version 2 of the License, or
& e$ \# D* u9 ~5 } * (at your option)any later version., A# R7 ?# \' j) J0 r
*( B/ n% V& j) {/ ]. N3 Q* {% ^; n% W
* This program is distributed in the hope that it will be useful,3 W8 [# K& \& x8 z+ I2 E( g
* but WITHOUT ANY WARRANTY; without even the implied warranty of4 D! i! K5 y2 H1 y1 A/ E
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
( t q/ Y7 @1 J9 K. ] * GNU General Public License for more details.* C/ H0 f- N' z
*5 [( x$ j& O( V4 N1 Z l
* You should have received a copy of the GNU General Public License
+ F) Z2 P! t( e; J * along with this program; if not, write to the Free Software `6 u% s7 Z7 H% M) C
* Foundati
2 ~( A$ o, n2 p3 P*/( N! H) P; V+ k0 a) q! L+ T6 M' I8 y
#include <linux/module.h>
3 l( {( k$ h; `( l5 P# F+ m3 s8 A#include <linux/init.h>
- I) c% ?' ?% \1 ^; z% P) L B#include <linux/errno.h>
, G& j7 \- R) }7 B" j) r6 K* z2 n#include <linux/types.h>
( r2 R# W1 s4 w. E F#include <linux/interrupt.h>% P# N1 s4 |, D/ y3 B3 F
#include <linux/io.h>$ g, N' Q/ E7 N% ?
#include <linux/sysctl.h>" r7 b# c6 X# i! L( ]/ E
#include <linux/mm.h>0 J7 k9 W9 Z8 J0 r3 J) f9 q
#include <linux/delay.h>+ A( Y5 ?; P8 p. J4 P, Q0 t; ]6 i
#include<linux/kernel.h>' y7 k2 s0 C6 }/ N& a% J# [
#include<linux/fs.h>& | G) ~# Q- ]9 n8 y
#include<linux/ioctl.h>
, e2 C$ s7 q) e0 D% M#include<linux/cdev.h>
0 s9 H Q; O) O3 p#include<linux/kdev_t.h>1 G% e4 ?# }# D: y" r
#include<linux/gpio.h>
* J: V q; T+ C4 n r4 f' p- _#include <mach/hardware.h>5 r+ Y8 Y% S: R! w0 j
#include <mach/irqs.h>
" E( E( \. {. Z$ q7 k _0 S: J1 S X% c3 ]: s' D5 T
#include <asm/mach-types.h>0 N2 H5 Y' |) a" Q9 w" b! q! p
#include <asm/mach/arch.h>, n( g0 V& r6 Y) O
#include <mach/da8xx.h>
1 }8 @! Q# y4 q0 O#define SYSCFG_BASE 0x01c14000: s, V% p/ k& R# l+ o
#define PINMUX1_OFFSET 0x124
5 @, {, [9 I- B$ l#define PINMUX18_OFFSET 0x168
! ]/ ]1 w' t4 f3 @3 p+ O#define PINMUX19_OFFSET 0x16c% n4 V' ~1 O5 l3 F! M( e
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR% @4 G. L+ s3 E0 }: X
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR. ^/ F7 U5 ]: B* ^7 p7 H4 J% M
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
1 B. f8 n$ e G% c+ n#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
, z# ~- e# d# y, O: q#define PCR_ADDR 0x01D11024 //MCBSP1_PCR% O, D! a9 v. E# D% [7 W
! h0 u7 u& t/ U# t
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR7 ]- n6 r' w. X* ^; |
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
1 D- C1 n4 R7 v1 |//PSC+ _* P* s7 u7 e6 U" X6 d2 q2 p0 f
#define PTCMD_ADDR 0x01E27120
F# c2 l: t, S$ M#define MDCTL15_ADDR 0x01E27A3C
$ Y2 f" U0 H1 m# t' T/ O$ D#define PDCTL1_ADDR 0x01E273049 Z6 F9 H, U: Q% d3 j9 V" {0 d+ ?
//GPIO8 direction% d: } T! m4 C% P
#define GPIO8_DIRECT 0x01E260B0
# a3 X: U5 i( ]6 F#define GPIO8_OUT 0x01E260B40 h6 Y& ]* Q+ H" a$ {. N
#define GPIO8_IN 0x01E260C00 U! u4 k3 S# O- O
. o5 }0 F5 E7 _* s; F//#define MCBSP1_RINT 99 4 X9 P8 Q3 y( x& A" p
//#define MCBSP1_XINT 100 ) L( Y$ N) l% Q! T! B7 o. V
static int MCBSP_MAJOR=239;
4 A2 ?8 q* Q/ a7 kstatic int MCBSP_MINOR=0;
6 Q5 N1 W' W& S- r( fstatic int count =1;* P+ [1 V) x+ ]
3 c) w7 X6 |/ J/ G) ^( l% x
#define MCBSP_NAME "MCBSP-device"
; X9 h- i& s- c0 O% K5 _( i8 J. y, g0 z# X; z4 X- r6 K
static struct cdev *mcbsp_cdev;
! M# j. ?! S+ q7 b' z8 z# I3 Jstatic struct class *mcbsp_class;; e& I- L( k1 ^: k# P
static dev_t mcbsp_dev;/ z( N) v6 |: O" V# i
unsigned int DRR_data;- h! `7 _" g _
unsigned int DXR_data;
q- u7 S3 T# L7 H0 Xstatic int mcbsp_open(struct inode *inode,struct file *file)
2 O! g" i# b' r+ [4 r q{( r! b( ]2 W( |' g: H0 f
! ~/ C9 b& h8 M$ N% [
//interrupt enable,initialized) P( e0 b# ~9 Z6 v3 e& ?, I6 f- _
unsigned int temp;
1 D: S6 `3 y/ s' L8 F& n //SLEEP_EN(GPIO8[10])---0
; N# Y5 ?: Q8 v$ q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
c/ ^) Z" _3 x8 v+ [/ M5 b temp=temp&(~0x00000400);
" W6 o6 K' k- Z$ p3 I3 t* e/ k$ d y __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: Y8 a5 ^$ Q7 I& h //RESETn(GPIO8[8])----0----1% D/ o' n- n6 F: l( E) t5 Z8 k
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 }2 t9 ^5 g' i) }2 z5 ~ temp=temp&(~0x00000100);
$ L- E' J z, d" c7 o __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 T/ Z2 w% t* d5 ]1 L! m+ ^
udelay(100);. [$ ]7 l! I y. c
temp=temp| 0x00000100;
! q8 s3 Q7 D2 {7 @: [ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
+ ]/ P1 a. {4 |# m4 W3 v udelay(100);
Q' g$ L& r3 I6 }3 O printk("open success!\n");) k2 i+ d4 @- r0 _- @( l
return 0;
* m+ Y; f+ E2 ?) J}
9 F6 A" z7 X1 l9 D6 u' Z9 g. H" v# z$ L( I
static int mcbsp_release(struct inode *inode,struct file *file)
) d! P9 f( G+ u8 {{
[9 |! q$ t% g5 f printk("release success!\n");+ {9 Z: c; W1 V N1 a- i) Q0 k: _5 m8 n
return 0;0 h ~- v$ @: o0 w$ `
}. w) A- [$ u' F0 K! J1 E- ^
( |. _+ L4 X+ [4 ?( j8 r, p
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ P& B7 f8 ]( L9 i8 c{. ^4 B q' q, w3 Z8 L- ~
copy_from_user(&DXR_data,buf,len);
3 K0 Z; _' m- T8 W iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ; A p, L( {$ H' K5 U
return 0;
5 [3 |/ Z3 a4 v$ ~: e* | ' X" U8 |" f/ |/ R k3 h
}4 W) ^5 ]" B. [4 ^' ^1 a- B* y+ I
5 t2 M& T `$ ~5 y: ?static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)7 ]8 V- u& w! w. s
{ 2 v) l# F8 M4 A) A9 I6 M1 V
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, c+ q/ y4 I8 N( I copy_to_user(buf,&DRR_data,len); , S/ T! b, c) H; a9 Z0 }
return 0;
: y* m/ g' f- s1 ]}2 q- Q2 C0 l+ ]1 S j0 Y
! I3 y z& G, z( T
3 f0 X" a" b$ Rstatic struct file_operations mcbsp_fops=& {! J5 f) u* I( f& T5 R* s4 r6 m
{
5 M: ]9 A( P) F .owner=THIS_MODULE,
2 |, }; C u2 N+ { .open=mcbsp_open,
+ e8 v* U. C9 n& g .release=mcbsp_release,
, r& z* u' d6 ~% h# R- c! s) o .write=mcbsp_write,
1 Q4 n- E0 a( d7 W9 B .read=mcbsp_read,' P/ }' Z/ N1 _" }0 p5 m+ r& n/ @
};
G0 q8 H1 c+ S( t$ W0 _; p! bstatic int __init MCBSP_init(void)
5 o; `$ s a& w{
: S b8 |4 I R- } int ret;. c+ r, J+ T2 q6 C
unsigned int PINMUX1_REG_old;
, p0 R4 k J- {1 Y3 }: c unsigned int PINMUX18_REG_old;& F% R( g! M' S) V
unsigned int PINMUX19_REG_old;
' d j# ?/ {3 j% V unsigned int temp; . D6 W- I/ A9 t& b1 _- p/ w
if(MCBSP_MAJOR)
0 E: o7 s0 n& Y# d; }- S" ~5 M8 F {
. }2 o/ r' p# h+ d mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);+ D5 Y& U: U1 ^# w! B# y9 [* \
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);) }# `3 D V2 O. x& a& V0 |+ N ?
}
4 u |0 }) _3 @) W7 L& m else
; {6 K+ w+ A+ ^6 b% B" i) M {+ H2 b/ S/ n0 W( x& b( o( p
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);) F: ~1 N5 v# G2 m$ ?' Y
MCBSP_MAJOR=MAJOR(mcbsp_dev);
1 W% d' F( I: ^$ e" x: O2 ` }
9 C. {' K. d7 X; u8 g8 v4 ?5 M* Y
4 I l3 J1 P, Z& d4 M( U1 i if(ret<0)* b j9 q1 i h
{$ {# s/ W& D5 G, g* R
printk(KERN_ERR "register chrdev fail!");% M4 ~1 P; N3 D: R# @
return -1;7 R6 N0 o4 `6 H5 b# k8 t1 A' j
}# J$ _; U/ W: K( c
# r4 `0 r4 W% ?- G; O mcbsp_cdev=cdev_alloc();
( ]2 V4 D& t6 a* p7 t6 R
9 K0 o& f0 E) ]5 O% F9 d, y1 s if(mcbsp_cdev!=NULL)
; V) R% T9 u1 ?- }4 `6 W {
% x8 h% A' I& |! Y2 c+ s4 s cdev_init(mcbsp_cdev,&mcbsp_fops);, H4 T3 a- D1 W3 s
mcbsp_cdev->ops=&mcbsp_fops;
) G# T6 N9 }# E+ T mcbsp_cdev->owner=THIS_MODULE; Q+ P7 e3 o& p+ g
1 G$ ] z6 n" S if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
5 W0 k, M: D$ r* O) K printk(KERN_ERR "register cdev fail!");8 N W/ ?2 J# P* h, ^
else
) L+ C" y0 [- M( o* ~+ f printk(KERN_ERR "register success!\n");; _3 H% g1 D( G9 ?* K X
}' t! H7 R+ S! o) S
else, ~9 ^2 Z w; Z: ^' p% B$ h
{
* U/ |: v U& x8 b% ^5 @" s printk(KERN_ERR "register cdev err!");) q1 }- a t! e
return -1;9 O" A3 V! n2 E" g
}5 V5 {+ I7 s6 H2 f) p) M5 i& ]
8 t& X" |# _0 p& { }3 Z' p. x! N mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
/ }* H! O5 m& F# r' H3 N! t- j. y if(IS_ERR(mcbsp_class))
, X# j: q- C4 W, w* w {: [3 O1 D7 T2 _' [) `
printk(KERN_ERR "register class err!");+ O4 P: T) I. f) |
return -1;; b9 C' o8 K; T& o- U
}( I4 h4 ]4 J( o [
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
7 [& S5 C% O4 C4 V: e% |# N% ]8 _! u5 s9 y" x9 G, r
//PSC
4 b6 E6 t2 o" n; n //add Enable MCBSP. s. Y3 T6 [" A; m, b
//test
0 a, A6 [$ x/ i6 p temp = 0x80000003;
# P: e$ X4 [1 ]) I1 K" L( s! E6 ~# T writel(temp, IO_ADDRESS(MDCTL15_ADDR));
, D6 m6 g3 b4 k& D& s temp = 0x00000003;
4 ] \/ }4 l- V' s$ y7 O/ u writel(temp, IO_ADDRESS(PTCMD_ADDR));
7 Z; Y' M* L ]5 @' D, C6 O1 k 6 q$ E$ M/ q/ x1 I) E/ R+ A5 I
temp = 0x001FF201;5 ?) {9 U* }' {8 [, n* \
writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 C& [# h0 C! R3 b7 _/ B
) b, V$ [, y8 I0 k1 o* l9 p //PINMUX
5 d. W; {5 ?5 {8 p* l, { //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,2 m% `5 Y0 h! C& }' n
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ l9 ~ d. D4 F- L PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
* I: k+ K# `% {3 G writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( q- M6 _; g( ^. Q3 f
3 \" ?0 [& l/ V o* K L //SLEEP_EN,EPR,L138_SHK1,L138_RC
6 W- J/ B3 V2 [* ^' L PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
( F1 n6 U) k% D; p PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
" g# f+ q# v( |# r- s. C writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 \1 `3 ^: S2 s
% y" F8 |: D. s" i5 T ` //RESETn,L138_SHK28 i6 [# U$ q' {5 W3 k R
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
4 [6 Y8 c" |2 |% n PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
6 _7 I9 [, g1 L" Q& M1 h writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
+ X* Z ?7 a0 |% | v8 P
. ?+ A L4 x9 i/ c M' d1 @
. ?8 I5 ?- `+ p! w //SPCR Register! y6 b* P3 _/ P& E* e+ S" f
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) Z) y5 q4 h% q i, }& E
temp = 0x03000000;//(DLB=0)5 u1 r3 e- [( I
// temp = 0x03008000;//(DLB=1)
6 T* N5 v# C1 B0 z4 n' @ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset4 L1 z5 Y3 Q) m/ G3 U3 p) I
temp = readl(IO_ADDRESS(SPCR_ADDR));
& L$ o# [$ Z% p6 Z2 y printk("temp=%x\n",temp);
7 s: `' t# ]6 c
* U2 ^1 i) o' n$ v9 v //PCR Register
0 u: n9 H" i. h3 k/ L8 U [( M9 R- T //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0 A2 O9 L; E% |, ]
// temp = 0x00000F0F;
& U9 s2 m& F" ]4 o8 z temp = 0x00000B0F;$ F, V9 B r- D1 ~( O
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 9 s$ z! K! n. p) K
temp = readl(IO_ADDRESS(PCR_ADDR));5 ]2 @. B; A0 H
printk("temp=%x\n",temp);
- k! f' P5 ?7 S: Z //SRGR Register# f4 t8 _. o: l- e% s9 R. O* \4 o
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
9 n' K4 i6 B1 H6 d& C% S2 h //temp = 0x301F000B;
: z+ ]3 J5 o* P/ r& o$ a4 [ writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
9 E# {% K5 ?1 i% M temp = readl(IO_ADDRESS(SRGR_ADDR));
& }6 B, g3 A3 i: @. A* ? printk("temp=%x\n",temp);" W y8 j& x* P: i- c9 F; q
//RCR
1 b8 R: C5 @* q //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 w1 J, v# L7 V, |# G //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; k6 e* z( X% O, M- Z% U( X# b) O
temp = 0x00440040;8 ^' _) o$ F3 g
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
: B# @# e/ v7 D# `. w temp = readl(IO_ADDRESS(RCR_ADDR));
& N! i6 \# k8 T7 k3 X# M3 v printk("temp=%x\n",temp);0 l1 V4 S/ P3 p* {! Y1 L
//XCR
3 z# a) J- R$ }7 e //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-12 f# ]2 E6 e' D* f
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0, t4 f4 x% E, t& N/ w0 E
temp = 0x00440040;6 Z/ {1 _ H! W
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
/ o2 [/ G' w8 g$ J, R% ]* S- Q temp = readl(IO_ADDRESS(XCR_ADDR));. e) N& R; Q W& H' {% m3 B9 G
printk("temp=%x\n",temp);
# r$ y) d- r. i0 B0 k! w5 ]' F5 i udelay(100);0 J! a' y" y9 J$ y7 Y
//SPCR Register
: G9 t) X, B3 j' z- o S //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 A& P2 u+ C4 o7 t0 C. ?8 E% r temp = 0x03C10001; //DLB = 0 VS DLB = 11 L% a% O( u6 d8 |+ S
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
1 W, E0 g _; s" M% H D9 s temp = readl(IO_ADDRESS(SPCR_ADDR));7 u+ Y9 f* C. a! {
printk("temp=%x\n",temp); t, L3 L' n X$ U0 V3 M( q- o
udelay(100);6 @& y/ e2 \& A# W4 C; f$ ~3 ?
9 z, r3 g( O1 e; W/ }6 N3 V; x
//set GPIO direction
" L) h6 ~' u+ J temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));& T0 L/ X8 o3 ` H. C7 t4 F
temp = temp | 0x00000100;//EPR----input L4 w* u- V9 ~
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output9 ^" C. K( g2 s
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 8 N) x9 {$ R: U. z" ?
+ w5 T/ r6 ^3 o. X4 D( ] return 0;7 K0 v1 \2 m% Z+ t; A
}+ O" D% R5 c, |, v, g2 q9 w- W5 E
static void __exit MCBSP_exit(void)5 k" K/ K: T. o; S k/ H5 X! l
{
/ S9 y$ ]! Q! ~# A/ P/ A printk("mcbsp chrdev exit!\n");# D$ @7 r& D' Y2 [' X2 T
cdev_del(mcbsp_cdev);
2 F# ^4 P0 V( a; z7 T: @- o unregister_chrdev_region(mcbsp_dev,count);
, Z/ b, b& Z0 e% g G+ O1 h# k9 e device_destroy(mcbsp_class,mcbsp_dev);0 f9 ^2 c, ?* k1 ^' \$ G( c
class_destroy(mcbsp_class);
" c- x/ p8 L6 H2 @" k$ o3 c- [* ^" ^}
4 Z6 @9 J- {0 mmodule_init(MCBSP_init);
5 W N! S* s4 D2 a1 D. a$ Smodule_exit(MCBSP_exit);2 s) H! `5 N- o2 K$ C
' U p: a+ j1 V6 c7 SMODULE_LICENSE("GPL");
, k' `& K5 {! r1 n" C( b, N# @8 x, P4 i b" x/ C+ \: h
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。. U* I0 t9 ~( L, E3 k1 f6 T m7 N
我的应用层的测试程序如下- J) o1 }2 u9 u! z; Y$ d- T( v
#include <stdio.h>
+ W, |* L* A( D8 z W#include <string.h>
# L* r; H' E$ }9 q#include <fcntl.h>1 P* L% \* f. S) r- j7 Q: a) o
#include <unistd.h>3 l5 A$ z( Z q( ^8 K4 P; X
#include <signal.h>
* a( g9 T. m# B#include <pthread.h> //线程; i; N" `# A5 j# G
#include <stdlib.h>5 J* A/ @" l& ^ {) u0 {' q$ e
#include <pcap.h> //捕获网口数据! r) r6 g. f" ^3 _7 e4 @
#include <semaphore.h> //信号$ x$ Q, h! `4 u8 c! M) J
#include <sys/types.h> //消息对列
$ [- \7 ]) l1 j, m, L& Q#include <sys/ipc.h> //消息队列
1 [, z0 R3 Y/ T7 G( g) g#include <sys/msg.h> //消息队列2 L& W r7 y4 M" R
#include <sys/select.h>
% D9 M1 b+ ~- u/ @: {7 k#include <sys/syscall.h>( l; Y- ?5 ^4 V* y0 Y# h# q: q
#include <sys/stat.h>
/ A1 U" z* J, ]8 A- w O#include <sys/mman.h>
, I J) U M$ H) Q6 P( p#define msleep(x) usleep(1000*x), f0 d+ b+ j0 {" p7 _: o6 N- X, h* I3 Z
4 c8 X* x6 b4 V6 N
int main()
3 t9 [2 z9 ?; ]' c3 y# J1 D{
$ {2 q) a8 Z" V# I# d //MCBSP,ARM与AMBE2000交互设备& |9 T9 T6 n6 j1 I4 W% v+ Q
int fd;7 {1 h: G6 P; @6 W$ U# P2 U
unsigned short data_write = 0x5555;7 `) s Q3 V- B0 U7 w* G
unsigned short data_read = 0x00;7 n& i1 J) \/ P1 x+ B% `
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 u; f) [/ `$ _5 g) O // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
% A `" H2 C: r4 C
& g5 | A3 o/ x if(fd < 0)
9 S! E6 H% N* ?7 o. i" b {
, Q+ w5 m' [$ g) I8 ?3 U) H& _. \ perror("open failed\n");
2 t! c% E( s! \$ H; H2 c9 w& c return -1;
( d, r" a/ ?" y }
% N% u4 A. y* B6 G3 }8 \4 F
2 L3 | \9 e6 b2 \( o; `% y1 ~ while(1)6 H! |8 V) T. [3 }
{
; }4 f# [2 }7 W* C+ T" K* U+ p5 E # G, O" |) ]4 ]' q; _1 ~
//AMBE2000每次读写是24个字为一帧% P: Z: w# p* d( g$ E
//写数据时将数据在底层存储起来,等到中断的时候再发送, L/ L$ n* i9 O+ o. z7 Z7 R! k: z* P$ F
//AMBE2000输入数据是以0x13EC开头的! o2 \3 s4 r, h3 U! l @. ~2 |5 l
write(fd,&data_write,sizeof(unsigned short));
$ C9 y/ F+ U+ K2 J- L' ?0 } \
0 a* L/ p0 n$ O //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
) q& H: |/ t ~ E# {3 }- c read(fd,&data_read,sizeof(unsigned short));) U6 p6 x# k& A
2 n3 I5 O6 S4 r6 q8 `) x# Z# ^, ~ if(data_read == 0x13Ec)
- R) T1 A) v8 x4 H$ j {7 G% g7 o$ @. c" M ~
! @3 v: Q: U2 v6 D printf("data_read = %x\n",data_read);
. m! B7 S' l- _- L3 d( i5 U }4 W9 D! ~; W; t' b% S* ~. X
8 o0 {4 r6 }6 O2 _% z) {7 s msleep(10);& J4 i- ^2 z- x6 A
" h$ y/ W7 g; @ u3 U8 z /*
9 z( H. w" K# {) s i ioctl(fd,1); o' a5 ~" P. ~2 x$ K
sleep(1);
. y# \" B V$ ` ioctl(fd,0);
' G8 B& K& d/ Z/ P. w6 d sleep(1);! s" T( f b- x; g$ u/ A' G' U
*/
* l4 H" O# Q- x/ A! K; s g }
z6 ?0 T- E3 r2 x return 0;
" k0 n" _/ c+ C1 N- a' m2 @6 O 1 m9 d0 P- P( _# h# t8 X
}
2 `( A4 ~6 B, E: Z1 a) O
( m* B6 _0 f v1 H( _; o8 M多谢各位指教,谢谢! 急
+ ^5 S( h" O) ~2 T/ w8 |" d& A9 ]7 ~/ E. V$ `' t
' ?* u* S" z, W6 x
6 x- C( c6 x+ Y) C7 N+ E
& M+ q* q: v) C! U5 V% s
$ j+ T0 Q; g# `
|
|