|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
" u! I, H" W6 B4 v: M) a" j2 x. z2 a5 c' F/*6 Z0 ^" \# K% h5 v2 v- g! S. ]( U
* Copyright (C) 2009 Texas Instruments Inc
9 q! H- @* U; `3 v/ n *! |- V, i2 c' l: T: s" k
* This program is free software; you can redistribute it and/or modify- V6 J1 {0 x3 {% x
* it under the terms of the GNU General Public License as published by6 u, y& O. x- K3 v
* the Free Software Foundation; either version 2 of the License, or
& ]! [$ a- c$ Y$ t M# H * (at your option)any later version.: j, g( t3 g# M7 ~4 O6 W i
*( q8 c! h$ j7 V
* This program is distributed in the hope that it will be useful,
& p& u7 m1 Z! A. ?2 T- b5 W * but WITHOUT ANY WARRANTY; without even the implied warranty of
& h) B. L! n. j: F+ q. Z) e8 z * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- w4 M9 p5 o( V# E6 v * GNU General Public License for more details.5 ?( ~1 H* O7 I5 c6 c8 y) L0 g
*9 ?' T6 p, z5 M% @0 L5 B
* You should have received a copy of the GNU General Public License5 {0 {: a/ _' ?' w' Y. F& w; z
* along with this program; if not, write to the Free Software
$ T! m6 m* Y$ F' s# H; l! b8 O* } * Foundati
+ ?' l; A3 x+ l2 N*/
4 N" }; N- f7 U" d#include <linux/module.h>! g5 ?% d9 q9 l( p6 ^
#include <linux/init.h>+ P" _* T& i" b |9 V* t, `
#include <linux/errno.h>+ C) M G: j5 r x
#include <linux/types.h>
/ G1 ~# B- }& N" k1 e: g#include <linux/interrupt.h>/ F+ `. i4 M& u6 |4 [) {
#include <linux/io.h>
, ?" D9 H+ D3 d0 g9 \#include <linux/sysctl.h>
7 N! ~' y; J: I4 ~) ^5 `/ d#include <linux/mm.h>
' Y# {$ i& n6 @' D8 O5 {. W#include <linux/delay.h>
, n$ c$ p Z, e9 E+ F7 K. _+ N#include<linux/kernel.h>7 I% N. a1 y- {. d- R
#include<linux/fs.h>
2 Z5 S7 f& m) t# w7 W/ w#include<linux/ioctl.h>
% \ G" {+ [/ X: L3 g/ V#include<linux/cdev.h>6 e; b1 Y0 V1 U C" f5 ?# b0 b2 L! Q
#include<linux/kdev_t.h>
# f U% ]% O% m+ [ Y#include<linux/gpio.h>
/ p5 R9 {' o8 e6 C: @, W' z( v#include <mach/hardware.h>
! z/ n9 O& z2 U5 l#include <mach/irqs.h>
5 a/ e3 M( O2 L6 R. Y! B7 ~' X9 O7 { s4 p o
#include <asm/mach-types.h>$ N4 c" v& M- a+ o! a
#include <asm/mach/arch.h>' E+ s7 B1 A; s4 c. @& W
#include <mach/da8xx.h>
) k$ I& g! k; v$ @. v; d5 ?6 T- z#define SYSCFG_BASE 0x01c14000 U/ Y0 A6 `6 y& g' O5 r B
#define PINMUX1_OFFSET 0x124 ) n7 o( \) G! g2 f9 K* l3 J
#define PINMUX18_OFFSET 0x168 3 {4 @! |# F+ R% j0 v
#define PINMUX19_OFFSET 0x16c
+ R. z# v2 Z6 O# e4 T7 T: y#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR0 L5 H* @' f% |" v- z# f0 v1 S
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
) a! t0 t9 y, t+ S#define XCR_ADDR 0x01D11010 //MCBSP1_XCR/ o+ m) T& M" f+ H% F
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
& \+ s5 m" ~) A( E#define PCR_ADDR 0x01D11024 //MCBSP1_PCR6 B! A& b" Z0 E% Y( Y
& t4 L! H0 t* k2 b0 E0 C8 n#define DXR_ADDR 0x01D11004 //MCBSP1_DXR9 {1 U7 e5 l4 S- Z
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR' o- x; [+ ]' I
//PSC! d5 F# b( x, O, m- z0 z& k
#define PTCMD_ADDR 0x01E27120 7 y$ K0 ], X6 o5 p' U
#define MDCTL15_ADDR 0x01E27A3C
8 a! }1 y8 o; j& X$ v. }8 \0 v#define PDCTL1_ADDR 0x01E27304" N! c6 A$ v1 n8 Y" u# D, @
//GPIO8 direction
5 [: T) |7 ]3 q5 G( L: {#define GPIO8_DIRECT 0x01E260B0$ B$ a: s4 G' p& K5 M
#define GPIO8_OUT 0x01E260B4
. Z3 F' D c8 K B#define GPIO8_IN 0x01E260C0
- m( o0 k" g- Q* s# G/ \, W
' n( k4 I& {+ ~//#define MCBSP1_RINT 99 $ o. Z3 u$ x5 Q+ N2 z
//#define MCBSP1_XINT 100 3 H; x. {8 H/ T
static int MCBSP_MAJOR=239;
) H A" c7 Z/ ~static int MCBSP_MINOR=0;# J! q# e! t/ H& v2 q
static int count =1;3 J5 E" i* c* S
' l+ x0 ^/ }7 E, U! }2 Y& H
#define MCBSP_NAME "MCBSP-device"
! U2 c% j; H, F2 F2 ?
A2 H/ Z& I3 N/ c9 xstatic struct cdev *mcbsp_cdev;
8 w7 a! x8 A% r% I2 N7 Gstatic struct class *mcbsp_class;. D+ _% V+ \' u' |) y6 J
static dev_t mcbsp_dev;
, k; z3 q! r# c( s& Kunsigned int DRR_data;7 r* v6 `) |) L% d& E
unsigned int DXR_data;( f3 r8 @9 a7 C* J; M' t" q9 ~9 N8 \
static int mcbsp_open(struct inode *inode,struct file *file)
- X+ P. G" l A" {6 d# ?" N2 [! S{1 x/ [8 ?# n$ T( w
) i$ m7 T! ^: _5 J: C ]8 \7 o
//interrupt enable,initialized+ O0 m/ Q4 b) Q& z. V5 v6 O0 J
unsigned int temp;0 A* t2 b) V, G6 t
//SLEEP_EN(GPIO8[10])---05 g4 W# M7 G2 @
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! o* j, I3 Z X1 @
temp=temp&(~0x00000400);0 _8 @/ \+ g( g
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
) ~' B. u5 D/ R- b0 S# b //RESETn(GPIO8[8])----0----1
) Z& C9 ^7 J u7 }7 ^& \/ Y temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) G2 z# M' k3 e. Y
temp=temp&(~0x00000100);0 V( n! V; z; H& O
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
" _ ~: w+ b a+ C udelay(100);+ ~& X; J4 @8 S) p; `9 U4 W" Z
temp=temp| 0x00000100;; n2 V; x$ q0 d" A7 G* `+ B
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
6 }0 w* ]: M3 N ^% | udelay(100);. i$ [6 P) q1 p4 Y2 ^
printk("open success!\n");
6 t% K- P% A' Q6 y% F return 0;
8 N1 p I* N. Z4 ?( S5 b, O}
4 ~ I* x8 `- l( N- `4 F; a) f2 n
static int mcbsp_release(struct inode *inode,struct file *file)- H) ?/ x% A/ R) Z& D: ~
{* z+ s5 v) q9 u: S" S4 Q% z/ s
printk("release success!\n");2 r* H4 n8 G, v T
return 0;
8 M g% Q* k6 M% g}
( ]0 j, E' H4 y D# x5 W
4 T: T3 T# C! ?$ N; S0 Vstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
# [+ J) \* T+ S3 P+ v{
) g2 N8 _# r8 N" M$ ^; M: w copy_from_user(&DXR_data,buf,len);: V8 P. Z7 O! G+ O: X% o" M
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 9 [, v; `: S/ D
return 0;* \: ]1 F5 Y; K0 G& Z( H' [8 \
+ G* a8 k1 y& ~( S# H* L l}
! |+ E: V( n4 O
X# Q2 k: n+ nstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)! m* \' u& H7 h, G0 U h. S
{ 0 \: f: c1 k* T8 h
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
" G, v5 `8 W( S1 Z copy_to_user(buf,&DRR_data,len); # O; y8 u( w7 s9 h D0 T0 F8 N, M. y
return 0;( g: ]1 ?$ x$ o% |
}
& v) F6 i# M: _( D" h# [, q- M3 |( f# E ?3 l2 u7 r# h! U
) Y) N$ |- k6 W, A$ H! i% J8 ~5 X
static struct file_operations mcbsp_fops=$ E2 e. r- q( \+ r" D$ c8 T; b
{
# G/ S4 C) p* s: V! u .owner=THIS_MODULE,1 Q1 d2 K3 X7 T: E
.open=mcbsp_open,- r6 ?7 R4 L- i& R y8 Z
.release=mcbsp_release,( H/ _6 ?* N0 W- ^7 w2 x
.write=mcbsp_write,4 W4 U/ s7 K' y; ~$ H0 w# j
.read=mcbsp_read,6 D8 c' s, M/ X' ?# G5 J9 ]
};
2 k. ~8 E" D5 i# _( xstatic int __init MCBSP_init(void)3 `) [+ |) e4 v% @1 U) O
{
& P' P, ~ P2 l3 O int ret;
$ y% M+ R; L. b: W; ~ e unsigned int PINMUX1_REG_old;
5 ^+ U+ R& [7 }) g unsigned int PINMUX18_REG_old;( ~( H: Q+ c# f; X& X! h" _
unsigned int PINMUX19_REG_old;
& o, y8 t, j5 T) r- I0 {( c* r( Q unsigned int temp;
' a. f, N9 ^9 I# G% Y if(MCBSP_MAJOR) E5 m7 h& W# G' _7 }7 {1 I4 M
{+ M2 o; {% ~0 B( F" y8 e
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
" ]: m! U8 K" s, y7 W ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);6 W1 m! X5 p2 E s9 ]
}7 d. F: @8 L7 L+ s. d* B
else5 F4 G$ a, n/ [& v( u
{" j/ R5 C, q9 h% d" Y- o( y( y
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
" a5 y! k2 x! h5 c6 Z8 c+ K2 [ MCBSP_MAJOR=MAJOR(mcbsp_dev);6 T/ v8 v; d. @1 [9 c4 ?2 u6 ]
}
8 O% y, g, H- E$ r8 W $ U) \0 z( ^4 H! ^, z
if(ret<0)- d$ A/ J3 W* {# f3 B3 ?
{
8 m0 y6 T0 g; m" O1 ]8 C; U5 @& D printk(KERN_ERR "register chrdev fail!");
/ M: ]6 s3 R8 H2 O( p return -1;
1 i3 [7 k) Z# Y9 N& K& w# ? }
1 h/ b3 e# k/ C3 q! D' x' T & {9 N j# R- P& z' y7 Q
mcbsp_cdev=cdev_alloc();, `2 L. D e0 b8 l! T
* g6 x6 u0 g/ t7 B if(mcbsp_cdev!=NULL)# t- |6 p0 x ]( w" ]! v
{0 Z9 r3 U- a+ H* i% ?5 E) P+ \
cdev_init(mcbsp_cdev,&mcbsp_fops);
! L2 B' A; }9 l' z# b0 d. Z mcbsp_cdev->ops=&mcbsp_fops;1 Z! h1 }% ]) Q
mcbsp_cdev->owner=THIS_MODULE;2 T, U1 a6 O" j( E5 K; r! j* f
% v6 W# y( q7 ?; L6 J8 t+ j# m
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% i8 l, J2 b! q1 H! h* N
printk(KERN_ERR "register cdev fail!");
9 V4 {; Y9 a' V2 |6 ] \ else* `7 _0 k& [2 k+ W! G
printk(KERN_ERR "register success!\n");5 K! H' J( o0 m) \7 b: `% r
}; x" k2 a2 H5 R7 @0 u4 E x
else
, z5 ]6 h; g+ M" b0 B$ Z2 B! Q {
u. o2 W- v. V! `8 J printk(KERN_ERR "register cdev err!");
8 r r* W% Q7 v" O1 V6 c$ B; J' w/ A return -1;
$ a! @$ p1 P2 Y P" U }8 H# ~) P) t; z
5 V; q" Z9 l$ E8 d2 {
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);3 n# A* u9 b2 P
if(IS_ERR(mcbsp_class))
9 l7 W" e- }% `6 G" K {
' E! `$ `9 s4 [: W printk(KERN_ERR "register class err!");! k/ }! y7 N! Z8 ~3 ?: c/ c
return -1;, B; c4 S3 N6 c0 P r: E& e |$ ^
}
: j" ?( H$ k/ C8 x0 w8 z6 Q device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
6 z: F* ?" f3 R/ `' w' w2 i' s/ ?2 E" U' ^, t
//PSC2 m2 B1 J. i' ^5 N: S
//add Enable MCBSP
: ], ]5 |8 P3 V //test# q1 ]9 P: E* h8 ]% `4 r# F; u8 k; b& k
temp = 0x80000003;' Z6 b+ n3 ]5 Q
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
# e2 q. b4 k; |0 w9 A* ] temp = 0x00000003;5 G9 m, J: N- m; s3 k7 \( P
writel(temp, IO_ADDRESS(PTCMD_ADDR));
; F) h2 L- _* S$ P4 L' L: \2 H
$ `. P" v5 e7 _ j! }- v temp = 0x001FF201; N+ W7 U% [9 C: z ]& X2 y
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 H8 U" W4 o) @) w + W7 c. \ d' k. T, S
//PINMUX
7 s2 R9 t# X) Y) X+ @8 M, C //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
3 L% q8 A, r- X% a( o) v7 p PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
. I2 i3 ~& V3 W& z PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
$ f9 s) l) ]% k6 S7 _4 m) f writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
5 s( O" s z' h4 w ; R6 s1 z1 o8 O- p5 o; t* _5 X
//SLEEP_EN,EPR,L138_SHK1,L138_RC% i9 Z8 Q' `0 T: F( ~
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. v: G# W- i: R: O PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; $ r0 o! L2 H% X0 G) K( Y( O/ w3 c1 l
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
% a! @3 V* p9 M ; p& \: E; X$ T: U9 P! c: U
//RESETn,L138_SHK2$ B1 B- p, g/ x4 M, L2 _- r& ]
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); . s9 g' T: ?: y: ]8 x l" N
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
4 I" T1 e7 m* T& l writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
# Q4 v: r, x4 U: q" ] 3 I2 E8 x2 H( ~. L
6 F/ @, k$ `2 k% N0 {! h //SPCR Register) w/ w" s' L6 x Q2 \
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
6 M5 o+ S( b* E, r) M- @ temp = 0x03000000;//(DLB=0)
% r) D4 K$ F* F5 |/ v0 P // temp = 0x03008000;//(DLB=1)
% M% w. w% A- p writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset! [7 }5 f) G/ e2 l
temp = readl(IO_ADDRESS(SPCR_ADDR));
8 J l/ ]9 V2 u printk("temp=%x\n",temp);5 r) @0 T" E6 T3 I# |
: g# _+ o! c; d: G/ R
//PCR Register u/ Q3 M0 J/ q# \, B+ w, |4 W
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
& a' C6 ?/ e; J! g( l+ r3 B // temp = 0x00000F0F;
. X3 P% G2 S2 B* M) q0 \$ x temp = 0x00000B0F;6 A# I2 L. p& v) [
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 9 c! f8 G2 }: W# I) \$ X2 A: @
temp = readl(IO_ADDRESS(PCR_ADDR));, r# s& [, v& G+ J: B
printk("temp=%x\n",temp);
5 x5 f/ y! |: B7 f' ~, O8 ^% @ l //SRGR Register/ g. u' Q6 m/ e& |( w. k, c
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==116 _( s9 D: ~' M5 R
//temp = 0x301F000B;6 o1 f/ j$ I* r( t; v
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
' _7 o! d9 {" f3 I/ }/ P temp = readl(IO_ADDRESS(SRGR_ADDR));4 `, v8 u, r+ I7 U
printk("temp=%x\n",temp);
" R% s2 o9 H1 H3 ] //RCR0 B4 d# }: P! M; M
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 N# O/ X- }" q //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
& ?$ j4 M6 f8 v1 A$ G! r& J* f temp = 0x00440040;9 r0 w) `5 T9 S0 [
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized / F' j9 m) x/ F5 Y5 z
temp = readl(IO_ADDRESS(RCR_ADDR));
+ w0 _0 O) M% l$ u1 h4 R printk("temp=%x\n",temp);9 S0 S- T; i0 q$ J/ L- G
//XCR' x- s6 e! x; a: j5 e: Q8 r
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ X+ t! V! b l" c {
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 @- S) _. j- C6 b& [* [ temp = 0x00440040;
( b( n3 m9 w2 @) J. m writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
4 U% ?) P2 h- `% a* J- ` temp = readl(IO_ADDRESS(XCR_ADDR));. R2 L) W. x; f3 j
printk("temp=%x\n",temp);
\, S" k: ?3 H8 ~ udelay(100);
/ m; N2 ~: n0 V' C N //SPCR Register* a! ?. e) v+ N w n+ d
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
- F2 @5 e) y1 A: G2 K temp = 0x03C10001; //DLB = 0 VS DLB = 1
8 X. a$ [) D3 o& u0 Z writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled8 |- k$ V. X1 Y" S1 P9 W: _
temp = readl(IO_ADDRESS(SPCR_ADDR));6 |" E" w m0 G6 O
printk("temp=%x\n",temp);# G& `9 k7 `6 _( n
udelay(100);
0 b7 V/ {7 F( S4 Z6 M3 J# M. K2 j4 n9 d* k+ q
//set GPIO direction- H! _ i' {0 S" E) v9 A
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT)); C* I6 D. y9 v" y0 q/ j& J
temp = temp | 0x00000100;//EPR----input
; T/ R0 q U9 s4 `6 }2 d- _2 e temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
( g5 v, |! Z; w( v, F __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 7 B, }/ z4 P) Q( j( ^4 x& y' I
w% P5 p2 _1 }( Q. ^# y) ?
return 0;0 J3 V, }3 \2 f3 A9 V4 ^5 u
}3 u0 G+ }) g7 q" \
static void __exit MCBSP_exit(void)3 v* g% o; F6 H
{
/ r" G- z# a& c$ T. M( s! [ printk("mcbsp chrdev exit!\n");- ?$ M4 n4 N) b7 e* x' I& U/ w
cdev_del(mcbsp_cdev);
8 A; u7 [1 B% J/ S4 P! r unregister_chrdev_region(mcbsp_dev,count);
0 |( h9 F" j! m! [. }2 K1 e device_destroy(mcbsp_class,mcbsp_dev);
+ E* G% Y- F. I- o, p3 L. ` class_destroy(mcbsp_class);- `1 ~" W1 l7 ^. }5 n! c
}
; X5 {' [5 r; I$ j5 S3 ^module_init(MCBSP_init);8 v. d4 b- V. Y( ^# p
module_exit(MCBSP_exit);4 y1 u( j2 X0 x) B% |( U& Q
* G! r. N7 J( P0 c
MODULE_LICENSE("GPL");' b- C# u% c# ~- K, s. [
1 _5 {) c/ s. J4 ~1 g$ s) ^( g5 Z+ s
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
7 a9 X9 V, r6 d- v q我的应用层的测试程序如下9 o- m" j/ M1 S. q- x/ Y2 P" X
#include <stdio.h>
+ @, G- T U5 _#include <string.h>( d- K8 }$ A* R9 U( G: h9 @
#include <fcntl.h>
$ q0 p$ ^1 G$ L$ {+ d Q; `#include <unistd.h>' {- z6 e6 Q% _. j2 ?
#include <signal.h>
2 }( L8 O5 J: b; B" d4 I; s' @#include <pthread.h> //线程) o6 n- P( E9 U
#include <stdlib.h>
% K; @. i0 @4 J' P- d0 s#include <pcap.h> //捕获网口数据
0 |1 F; R9 I$ Q% G#include <semaphore.h> //信号" o+ g. \% Y, |- ?* U8 \/ P0 w1 D
#include <sys/types.h> //消息对列( O& j: F4 ?& m3 u/ l% n
#include <sys/ipc.h> //消息队列
$ L3 a+ ~" a; A- n. z1 d#include <sys/msg.h> //消息队列
! T7 D- C/ _. R% { b3 P#include <sys/select.h>! X! F! \5 o; l& Y5 a
#include <sys/syscall.h>
% r: B! ~; x2 w" }( G#include <sys/stat.h>- M6 x9 N' [5 {) Y. B2 q: z& x
#include <sys/mman.h>
5 o/ M( f) F6 v" h/ S+ B#define msleep(x) usleep(1000*x)
: I8 g! ?: Y" { y5 l3 F' r; [9 ^- Y$ G. x# M- n
int main()
6 i/ J2 b! _4 [( T, x. f- [3 e k{
' t ] T6 J/ w/ e9 v j( B1 }" r //MCBSP,ARM与AMBE2000交互设备
4 C% ?: h: J, y* b int fd;
7 ?* \4 x) j; s, |8 v. c/ } unsigned short data_write = 0x5555;8 W1 ?" x2 A% o9 {8 N
unsigned short data_read = 0x00;# q% x6 ]: Y0 _1 `" H# p$ t6 b
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! C7 ^2 n9 Z# b# K" V
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);- N( \& s! k0 i, z* {8 Q" ^
. B/ v7 o9 b t1 H6 R7 g |
if(fd < 0)
# U7 @+ r$ w; v, B4 q, {0 h {
; P+ `% \$ Q0 K# D4 G perror("open failed\n");
: j/ G( `/ Q0 g" g( e% s return -1; a; g/ _6 Q7 u7 o' l$ }# Y
}6 M/ M+ x' }4 t5 l
' \- D( E+ t; t while(1)
5 l% r/ f, ~* p M1 i9 l$ l' k9 q {2 t/ `! C3 p1 |: \4 w
6 [0 b2 W/ r E% N: w% _0 x //AMBE2000每次读写是24个字为一帧
" g; r+ L% C" u+ V/ l9 p* Z //写数据时将数据在底层存储起来,等到中断的时候再发送6 ?# C. z0 B" [" l8 N4 z& @1 A
//AMBE2000输入数据是以0x13EC开头的. U+ B% r3 X2 M7 \9 M+ W& F1 K a4 V
write(fd,&data_write,sizeof(unsigned short));
: ?+ J/ M: d* }, M* B
5 ?9 k7 Q9 E% u6 U- [) p3 s3 n //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
) L& ^3 v. k% H: L7 t" p read(fd,&data_read,sizeof(unsigned short));
; K8 i+ `3 Z% A - k1 l* V. J1 y, C: O4 w
if(data_read == 0x13Ec)7 u; Y4 [" }$ G! c# \- H6 @
{
2 R+ }( c/ B% ^0 {7 A' M; ^
, X. w2 N) W, X; D% k printf("data_read = %x\n",data_read);
+ l$ c6 s1 c8 S( i; E% M }
% g& V& {' g; R1 {% O# [2 s# T4 V
- Q6 P+ p: d" S7 S, O* f$ B msleep(10);
/ ~+ S$ l* b; \0 A O- b3 @ U 5 G8 C5 C" Z8 J, O/ P9 K
/*
9 ?8 d& k" ^2 R+ i( b ioctl(fd,1);
! S! g/ v5 a# O( H sleep(1);+ U3 V& G L( m( P
ioctl(fd,0);2 e- B w) ?% L3 ~- Y0 X
sleep(1);% |2 l8 W5 i! W2 B/ r5 U0 [8 t
*/
/ ?+ i7 u4 R: J& G4 u+ u A0 u } 7 g" N; h! A' o! C
return 0;4 k% b& e5 Q {0 G: C! Z
- x+ P& @; q# Z, z- r}
! ~0 ?0 N( s1 e6 }( ^6 y* B' V1 r' y3 m
多谢各位指教,谢谢! 急
+ q) ?9 ~1 Q, I- T& M% j% n2 l9 q, S" d/ N q U, a* M; h( K$ q
( u9 C% Y$ s% e/ u/ Z4 q* |0 V& M7 Y5 E2 {8 j2 S
. d+ m2 j q: ]' J, K5 W& S
" W+ l) H1 }2 V; o s3 J
|
|