|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
% E- g2 q2 I1 R$ y, [$ y$ ?' e/*, A3 u2 O& ?, ?3 \7 a
* Copyright (C) 2009 Texas Instruments Inc. L# s% R1 w! J& l
*
* y9 D2 F2 p- |. d * This program is free software; you can redistribute it and/or modify
9 N" w& V1 }9 x: X; t, {! z! ` * it under the terms of the GNU General Public License as published by$ z) ?6 M I* M3 G6 t5 W0 `
* the Free Software Foundation; either version 2 of the License, or( r6 }6 y: e5 O1 N& }9 {: `
* (at your option)any later version.
! A2 E) u4 I% W# n8 G+ q *
& e' E& k3 l9 ^5 _/ d: ?9 E8 a: N * This program is distributed in the hope that it will be useful,
. v, V8 [# a2 G4 Z# |7 P- { * but WITHOUT ANY WARRANTY; without even the implied warranty of+ L* G5 j1 c5 H. e; J: Z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! ^3 t ~, K8 h+ S h5 B$ h' i * GNU General Public License for more details.$ \9 v$ |6 q2 P/ d( Q
*
7 c U, P- x9 f7 v2 e5 c * You should have received a copy of the GNU General Public License5 b" F$ I4 d0 G+ U
* along with this program; if not, write to the Free Software9 B# G- f% C: @
* Foundati0 y. D% c- L& a+ d# O# [9 D3 n, l- q3 `
*/
1 Y6 m: u1 }* C% N#include <linux/module.h>
8 O% f0 v0 d1 O; D, O G#include <linux/init.h>
* M0 Y a/ S, E+ H% e% X4 X/ N6 i#include <linux/errno.h>: ^7 h/ e. z: c3 y$ j" K8 ^
#include <linux/types.h>
6 C3 B" `1 X/ {! }; ]1 F5 a+ D, q#include <linux/interrupt.h>+ G5 r7 m; o+ c9 q
#include <linux/io.h>+ X& F( B$ q7 C2 \. `& ~1 n2 j
#include <linux/sysctl.h>
7 E% r2 g7 t6 |" k3 }#include <linux/mm.h>
4 |0 C5 Q& Q4 `#include <linux/delay.h>
- B4 f+ F: S( X0 b0 Y7 d#include<linux/kernel.h>9 b4 V4 `3 D7 l6 x' W( ~' s4 h
#include<linux/fs.h>
; `. Q9 z' E5 K#include<linux/ioctl.h>; {/ m7 m9 ?" W# Z
#include<linux/cdev.h>0 E6 T! T$ B. z2 H' \: ^$ ~ c
#include<linux/kdev_t.h>9 B; J6 i2 b7 r
#include<linux/gpio.h>+ R' i$ n" Q; E/ a+ C# X6 k
#include <mach/hardware.h>
: ^- Y' ?: R9 t#include <mach/irqs.h>
& F9 u9 s7 y/ D& ]' C- ~( X6 y& l `- m! E
#include <asm/mach-types.h>5 d5 r9 ?% }! S/ J5 Y
#include <asm/mach/arch.h>
2 S! g1 x1 n8 a1 n#include <mach/da8xx.h>
. J: D5 m0 @- ^! j#define SYSCFG_BASE 0x01c14000- R) p1 Z/ r0 j+ G& x( b0 O
#define PINMUX1_OFFSET 0x124 " `& K0 Y1 F4 z% h3 E' I+ \
#define PINMUX18_OFFSET 0x168
2 q, D$ }. M, Z8 o" i7 P, m3 U#define PINMUX19_OFFSET 0x16c
! m6 m3 C4 Q% }* h#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR7 O% p* c" K* g$ l+ n
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR' |- B# T5 Y$ W2 s0 b
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
( F# j% {1 R, y6 I% \. P1 X8 ?#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR0 ^3 T" U* `7 K1 [* F. F8 g
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
, X# L$ O/ E+ d1 r% Z7 i. o5 Z 4 u* e* H+ j5 K3 v: _1 `) M% h
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
3 c' g4 J e H9 r, H#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
# k" o. X, g: Z# \5 N! o/ @# r//PSC4 W) r1 p: }# F) Y
#define PTCMD_ADDR 0x01E27120 : i/ ], l9 F; I
#define MDCTL15_ADDR 0x01E27A3C
( ^* A9 H, K% R' |2 A' V#define PDCTL1_ADDR 0x01E27304
0 [" C) P4 h3 `! B//GPIO8 direction* f! p; r# i8 D5 `; _
#define GPIO8_DIRECT 0x01E260B0
( g# N! I- N; _" m! N3 W#define GPIO8_OUT 0x01E260B42 ?9 |- M3 S& m
#define GPIO8_IN 0x01E260C0
4 T3 K8 l* n5 h
% {0 T& l# y' A- ^2 {/ j//#define MCBSP1_RINT 99 . O4 P- D1 ? v, w( M
//#define MCBSP1_XINT 100 # h$ ~3 q" G+ I5 w8 Y
static int MCBSP_MAJOR=239;
V9 j, ?- ~* v) d% ~" |% qstatic int MCBSP_MINOR=0;1 }8 s: p0 [4 ]5 J+ R, \& V0 P2 n0 @& r
static int count =1;* [8 A$ p& p1 {+ n
. Q6 X; |) o8 H: J8 H _#define MCBSP_NAME "MCBSP-device"
8 a/ j* n" M; n z( @5 v# X; U2 [. L. r
static struct cdev *mcbsp_cdev;
. Q4 F- t- A* @" W" bstatic struct class *mcbsp_class;
' r% H0 H5 J. J1 Astatic dev_t mcbsp_dev;
4 y& t7 f4 Q: m4 Lunsigned int DRR_data;) F* n. K# U+ g7 m
unsigned int DXR_data;
& M6 d( |; l( {' F. Cstatic int mcbsp_open(struct inode *inode,struct file *file)
$ M& A% w- I# _4 B2 [; r% L{# ?- W8 s1 {9 K+ ^0 E2 \
5 a1 M% p/ N( }: ^
//interrupt enable,initialized1 U4 t( i% g8 t' |8 a
unsigned int temp;
! h8 L) G; m/ e) Q; E/ x //SLEEP_EN(GPIO8[10])---0
. e0 D: y8 ?; h8 f j/ J temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- c: Z, S. B) L" |8 q: K7 ?' H temp=temp&(~0x00000400);% q: r n: _2 o1 A, `& j7 I
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ I1 |0 E+ | |
//RESETn(GPIO8[8])----0----1
1 a% T3 V x7 i temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 j* L! R3 k: s' ~; j; h temp=temp&(~0x00000100);( T6 H9 R1 J2 H8 k7 ^6 q- C
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 I0 \) Y7 N# v8 m udelay(100);
4 |4 S3 R- H6 P+ s temp=temp| 0x00000100;4 O' p6 D+ ?, T* U( r; j; T" m
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
. ^* Z* X4 [/ i5 B udelay(100);; U( Y! z* `) q, F4 ~: g* `) V
printk("open success!\n");
X" k! B$ B2 U return 0;, T6 o# s( }) y# Q4 z5 E
}
" n0 f- q; P9 b0 V8 Z+ V X
. w; h5 o( H1 Z1 T( Fstatic int mcbsp_release(struct inode *inode,struct file *file)
* [( x* i. x; [, d{
5 _6 ^. O; |+ U. F, Q( S- _# ` printk("release success!\n");
+ \8 u3 ^* W9 h1 S! T3 r return 0;, z5 y9 l. Y: s [6 f
}; U& D; `* R1 o2 f
" R W* j5 k% T8 a- I
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)9 ?8 O C9 s0 ?6 I0 V: y1 C5 g& B
{
0 P2 ]# K& w# z3 } copy_from_user(&DXR_data,buf,len);
- z y9 u0 p$ g6 L1 J c iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); + l3 y& `3 j0 |( o
return 0;
! _- @( W( M( s$ ` " J4 h, E$ j' o7 G2 B: u- K% B, }" U
}0 j+ m' _2 v u9 ?/ w" r
: D4 M5 }7 [3 e) @6 B. [* @
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 Z+ O' M9 \; M6 B) q& g$ {{ * p$ H& p$ K- L' c9 F
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; A0 Z% O5 L d3 u+ L$ W: L copy_to_user(buf,&DRR_data,len); n$ X: t( ^0 u3 h$ D
return 0;4 h! X4 F( d9 G
}
, ?* d$ s9 T; `* J- q' M' R( V8 B3 }7 }# y% i% U/ @0 ~
( `' D- p, H" h7 a; F+ K
static struct file_operations mcbsp_fops=
; D/ \9 k& t+ i4 a* p{
+ k( ]# k* Q2 f% [* c .owner=THIS_MODULE,1 S8 A; H# J! k! a$ c- I% @
.open=mcbsp_open,
% R# B, M, B# ]: F# T. | C .release=mcbsp_release,1 Y' |# M7 I0 ?: f9 v
.write=mcbsp_write,! L: s" e. g7 V9 v6 q7 A- T
.read=mcbsp_read,; i3 }% o# V- v! `- t: u! Z
};2 x# Q2 V& B9 g5 p W" N% U
static int __init MCBSP_init(void)
3 U- P2 `; J, P" ~{
1 d0 V) P- |# i, h1 N int ret;
1 g. d& a6 ]. Q# } [" x unsigned int PINMUX1_REG_old;
- e! M# b9 ?& Z! O6 h5 ?+ n unsigned int PINMUX18_REG_old;
6 }7 X: s5 D! s8 s" R6 q: Y0 y unsigned int PINMUX19_REG_old;% K. I4 R8 I$ p. u
unsigned int temp; 2 a! r- A% |3 b
if(MCBSP_MAJOR); j, W7 S1 A+ O: ~/ g& U
{
& N6 v) B; N. H) w1 [2 } mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);5 V# D6 {4 X% ^4 l' x% r, A/ u
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);' D" `9 k0 O! L, e7 |
}" {* ]; h; F- L
else- Y5 T G( @1 _9 q7 Y6 _& I' i
{, k$ R' M1 U/ f2 w
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! i, a) |9 k7 K C2 S MCBSP_MAJOR=MAJOR(mcbsp_dev);" @2 T9 q+ [* ]% n+ g9 F
}
1 b+ z6 ]+ v& `1 J4 p8 T$ h, I
. w6 _! V% x4 P. s1 D5 l1 z" I if(ret<0)
% u+ c, z8 |% M5 y7 o0 z {
+ g1 U( [$ \ \! O3 |# z) E( O printk(KERN_ERR "register chrdev fail!");0 I0 y, f+ b- G, b
return -1;& R* B" Y( m4 u ~/ m% \, d
}# H- }1 M/ _$ k# y& A- H' j4 _
z" g7 \+ C( H* e4 D$ J mcbsp_cdev=cdev_alloc();" z% A) z+ |1 @/ F0 K! T$ ~9 H
+ W* Z2 E. Q- ?& ] if(mcbsp_cdev!=NULL)
9 R1 _, s0 `( y' g {2 S, W4 `+ b1 b4 }8 K) _# R
cdev_init(mcbsp_cdev,&mcbsp_fops);
& X' {# l0 W6 m4 A mcbsp_cdev->ops=&mcbsp_fops;
6 b8 i# Q- G- f |! H T! p# {% S mcbsp_cdev->owner=THIS_MODULE;) }% _9 V; |, ?/ g
" _- V& y: ] l; S4 [1 P2 X& r, h A8 D if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! u( E# m1 g8 B- K printk(KERN_ERR "register cdev fail!");
$ p& y) j B1 C# b9 U# V( w1 l# y else+ g% a1 t1 s6 c
printk(KERN_ERR "register success!\n");
2 s9 D. |3 ?* S$ e1 ^/ |5 x; u }
" Y# @% U) j. I0 W! y2 h else& f: W" j) _9 i6 {" H
{
( |6 M* V5 ]2 h9 z printk(KERN_ERR "register cdev err!");
! p7 @1 d: x2 f2 r5 w' g4 t. \ return -1;
4 d2 V8 |! G; q+ C: E! W" p. m }
0 F1 P0 r. k* g& {/ E
; X W% U6 }0 u4 K% D mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
, a2 K& h1 W, \6 c+ e if(IS_ERR(mcbsp_class))" I. D5 c3 n9 ]0 ?
{* s" X; u& [ Z1 E+ h% |3 R
printk(KERN_ERR "register class err!");
Y% z0 T. a& ?8 L# @8 P( X) {8 l return -1;
G) T1 u$ Q7 K, X }
' f: y8 v; @" s+ X device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; r& s- g# t, X; Y$ r( C9 u! f
# O! \0 f! [0 Q9 |# r) j //PSC2 }0 ` B7 q- a
//add Enable MCBSP+ p# b s, L/ X( w- H. ^* A/ N2 i
//test5 }" @# M9 O8 f k8 N" Y$ _
temp = 0x80000003;
. d- [7 ]6 w/ N1 M writel(temp, IO_ADDRESS(MDCTL15_ADDR));' C1 Z" W/ J# M( @
temp = 0x00000003;
2 t+ `/ }$ m0 g2 k writel(temp, IO_ADDRESS(PTCMD_ADDR));; S A3 |! m8 t- d" @
0 @; R" e/ f3 `; K! a7 ? temp = 0x001FF201;
! ^* ^4 G _4 ]( ^; y! S4 y writel(temp, IO_ADDRESS(PDCTL1_ADDR)); ^* Y) |4 F) x0 B5 Z A
5 J+ w% U, i9 \$ _! c7 W //PINMUX 7 L8 v* Z$ A+ y; h
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* b1 p: M* g& Y2 w
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; N. Y2 m6 @: L8 H7 [% H; \, R' U3 ? PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; . k1 L/ [/ Q Z, p! S: J
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
; @: Z. `6 k' C6 X& I4 s
! x$ y! `. ^. I. ~& W1 s0 b1 ? //SLEEP_EN,EPR,L138_SHK1,L138_RC7 y9 U2 `' S( @1 w+ ]* h
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); - R g2 R) {* d* W% v
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ' m9 G8 P( ` y: L
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);6 D y" `9 Y8 B) `' f" Y4 D
6 q' q T- Z6 R6 D$ M0 k5 _) z* g
//RESETn,L138_SHK2
6 S* B: I& _* @4 Z+ ~& s PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ; K, s, D& j1 j9 e b
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
1 K& ~7 b! B6 _' W writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
3 d% E; r8 S2 [* |. W
7 f1 i9 C {" o. U& G( P
- F4 m( T8 }/ h) u, m8 T D //SPCR Register
. v5 Y7 n! _4 M& D4 X( S7 B/ P //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
' ]5 v% w3 u9 ]$ z! R; U temp = 0x03000000;//(DLB=0)! h9 G9 _' ?# H C3 k% E0 j# @5 E
// temp = 0x03008000;//(DLB=1), {- ?2 j5 E: V# Y; U4 b/ s
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
0 b1 R& C7 o& h7 t temp = readl(IO_ADDRESS(SPCR_ADDR));# }" O0 Z, w1 O0 h2 f1 U* ~
printk("temp=%x\n",temp);
' @9 o7 i% \+ o) o: u6 K! N# M
' A2 }8 `# O" D- d# m //PCR Register; S# l" q( K9 ?# `% G
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0" X' G( B2 r0 U; a
// temp = 0x00000F0F;
* g6 L- M1 P/ w7 @7 L temp = 0x00000B0F;
+ _& w& [2 G8 W6 j writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized + O# e* w$ G6 F' r6 f2 _
temp = readl(IO_ADDRESS(PCR_ADDR));" Z3 n L' B; T Z+ |
printk("temp=%x\n",temp);
, b; l, [+ R2 i4 o //SRGR Register
8 _8 h% F, S) l //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
& v5 i: E0 y7 @ //temp = 0x301F000B;. b/ p3 A& c# i: y1 v
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 1 s# C& z* N( F) a; M
temp = readl(IO_ADDRESS(SRGR_ADDR));
5 x; P2 r+ x6 x! } printk("temp=%x\n",temp);
$ x, [' L/ j5 P& k* Q //RCR: E( H( g& U7 c7 Q5 @$ Y+ H. s
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
$ n: ^ I: S2 P f$ {) u# y. u //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0! ?9 |! r2 z4 l5 ]9 U6 Q
temp = 0x00440040;; R& u# {5 l7 t' ~
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ' B0 c8 \5 Z( L( J' q
temp = readl(IO_ADDRESS(RCR_ADDR));( r, `6 W7 f& s# z. u0 f; f
printk("temp=%x\n",temp);0 I( y/ H& X) d4 \# }; e- P* Z
//XCR. ]$ y7 M6 ]( M$ `# U- b& S
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1' ], e+ ?+ |, {- E* I, a8 E/ I
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; t$ M' v! R# z4 H
temp = 0x00440040;$ U1 q; j5 h7 h- ^( `' a' `& A# J9 T
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 6 C0 M, j, T( C
temp = readl(IO_ADDRESS(XCR_ADDR));$ U: X0 v$ R+ o
printk("temp=%x\n",temp);9 b, T2 m/ f; S' A' r
udelay(100);
0 H8 x2 A& w: U' ?3 j //SPCR Register
* |) u6 w+ \) n5 {$ |7 X7 y o6 j //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
, G$ o' p, \2 y& D( U temp = 0x03C10001; //DLB = 0 VS DLB = 1' J. i6 ^& U: c: G
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
8 _; W: b4 o$ [ temp = readl(IO_ADDRESS(SPCR_ADDR));
* B7 W: Q/ ^7 N printk("temp=%x\n",temp);
0 O2 w- }# s' i! C( p5 |2 t udelay(100);
% |4 ?/ u7 w' u
& R; U& |% e, q( [# @ V1 t# e //set GPIO direction: Z6 P# C& B5 k- N; o
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ z* }, R) k% Z4 O" g
temp = temp | 0x00000100;//EPR----input( {9 W7 \' ? P
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output% J3 _) U8 K/ j6 F- w8 ~' _
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
. q; _& j' l+ ~+ K4 z) w, o( ^
3 w$ v$ K' R! }) \& P% E1 ?# N return 0;
1 U. i! y5 H) q0 L}- ]. g/ e) V/ j7 Q7 E- K5 e% v& t" v
static void __exit MCBSP_exit(void)
" }8 X$ m& ^3 L ]{& ]$ A1 R _2 r- p4 B
printk("mcbsp chrdev exit!\n");3 \- q0 B4 K- Y: I. D" Q: d8 Z- y
cdev_del(mcbsp_cdev);! V" N( s5 n7 @$ f; x/ ^# A# O0 v
unregister_chrdev_region(mcbsp_dev,count);
5 l' @2 M/ a% ]2 D F! ^, G5 [ device_destroy(mcbsp_class,mcbsp_dev);% |7 L0 M3 W6 W( e- w5 m
class_destroy(mcbsp_class);
' y8 G* e: M. E- r1 p}: M H+ U4 V- Q
module_init(MCBSP_init);. t; D9 v! ~# N
module_exit(MCBSP_exit);: j/ o# b0 l, K% y3 h$ F
6 H8 E, M0 A- A) wMODULE_LICENSE("GPL");
- k' e L3 R, o) N8 ~/ W( d- @3 C# i4 j; [& r& X
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。) m6 ?- L4 H( R- D7 F: ^- X7 `: z
我的应用层的测试程序如下
1 Z) i4 E7 q. F#include <stdio.h>
) _! x2 u+ x# |8 k: G7 M* n' Q#include <string.h>
4 [- _6 I2 F4 x#include <fcntl.h>0 @! j1 A& I+ K: m) F( {
#include <unistd.h>3 G( K8 Z8 J# n- d+ Z
#include <signal.h>, ~) c0 u7 V |, E8 p7 |6 B9 U7 [
#include <pthread.h> //线程
; e# T; j, I; {3 }#include <stdlib.h>+ R8 A4 g1 v1 N# k% b
#include <pcap.h> //捕获网口数据
1 Y7 k6 h$ Z# M#include <semaphore.h> //信号
% ^9 ~- G2 D$ g9 m8 y1 X#include <sys/types.h> //消息对列
$ T8 k% e- m8 c5 t#include <sys/ipc.h> //消息队列- Y Z5 z a8 J1 F( ^
#include <sys/msg.h> //消息队列
( ]# X o" {- a& L#include <sys/select.h>
( u3 d( Y ]% ]1 n7 E4 F: j) [#include <sys/syscall.h>
0 p, _9 H% h5 I# ]9 O: o0 D B# c/ F#include <sys/stat.h>
. K: V1 P, o& Y# E. q) K+ Y#include <sys/mman.h>
) q V. r3 k) x- Q7 r#define msleep(x) usleep(1000*x)
4 M' d/ I# ~5 d f
: W4 }6 f0 p% e& ~) ]6 bint main(): u) I+ ]- \: M& ?1 w
{ 4 z1 O# {3 j7 |
//MCBSP,ARM与AMBE2000交互设备
5 P! L8 r Q% g( n int fd;
, x# ^! O. b# Q9 G$ B0 H, m0 L unsigned short data_write = 0x5555;# z8 Q: k$ s2 ]& m
unsigned short data_read = 0x00;
2 L% @& Q$ \/ C A fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);2 g* W h$ L% j. h$ @: V1 D
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);3 J2 \2 C+ g( e# |# P- ^. p
5 r1 H, ~7 i& z8 u' R4 T# m
if(fd < 0)
% l3 T# p: G. @* z: } {
# i8 x" e3 L7 j! {- j, | perror("open failed\n");- I6 b3 |/ C2 }' a, m
return -1;9 I' C( B) K7 P2 ?
}
% V" c% d' K% c/ N6 D5 b P5 s$ F # W; v6 R1 _. g. |& Y! e
while(1)
2 h# t4 c" K" F7 ]7 h& y) T {
7 C# c* A$ V4 a5 K- K" L4 S0 a / ` [3 x# Q8 X! _
//AMBE2000每次读写是24个字为一帧
$ ]. v/ x& Y. g' i; `$ a //写数据时将数据在底层存储起来,等到中断的时候再发送/ D( o2 t5 {) R9 Y3 h+ g) H0 j
//AMBE2000输入数据是以0x13EC开头的
1 |3 P, A7 [% {0 M5 N write(fd,&data_write,sizeof(unsigned short));
8 I$ {- m0 k- q0 P
& \( T& z A; R# C //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 , H/ t# S" V% \+ o* V; {! X
read(fd,&data_read,sizeof(unsigned short));
. e# ]! N# z, o2 `4 z
( }9 K3 t6 O2 j# T if(data_read == 0x13Ec)+ E& q+ J- b. @- [% ]: A* S
{( s+ {; M3 M# L' K9 M: K8 p
: |! M: M. i/ x$ z' a5 B5 j
printf("data_read = %x\n",data_read);
\1 b/ ?9 r) \2 e! W% P3 }) F n) v. e }
8 B1 U8 E. R1 I9 c! Z
5 j9 s, u3 S0 L' t% D% X msleep(10);& U3 @) R- S5 A8 d& o7 `) s* K
2 g4 o% ^" p! A' h4 d /*# z7 c: O0 B0 [
ioctl(fd,1);
( ^$ g: @6 o) B sleep(1);) I* i' t$ ]- f2 G& Q) I8 K
ioctl(fd,0);
. H4 r5 u0 R0 y8 Q sleep(1);
2 K! r2 G% Z4 G# j u9 ` */ + m( i4 {- [1 t" M
}
, `9 L; Q& P: _" Z return 0;. X- q! }0 K3 M( Y7 z& V& j
2 `6 ?4 J- r( w}/ ^$ ~' p5 z6 G, J
! h7 b! K( z$ J+ p
多谢各位指教,谢谢! 急
# `4 F" V5 N2 t* ^* H$ [, N
: M( Y& ^' g/ r/ k$ f. w, |
, c* [/ h2 _7 G x: Y* L0 R* ?5 u R' f5 M2 w! _+ ?2 H9 k7 {
5 N# Q6 c( e& a1 S! k
' t9 {- H) I+ w4 D: @- l! Q |
|