|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: : V1 O& [: a& T& [ E& o4 f( a
/*
; y% @$ k. z( } * Copyright (C) 2009 Texas Instruments Inc
) J) O2 U; [- {7 }" @# G *
6 K5 I5 S$ Z) y, R+ ]9 D0 K * This program is free software; you can redistribute it and/or modify
/ I2 O# c2 F+ v5 O# e* i * it under the terms of the GNU General Public License as published by
: s. n5 _6 U. L0 G; ], `2 i+ `0 }% w * the Free Software Foundation; either version 2 of the License, or, G M7 Y# }, h; u0 _: [
* (at your option)any later version.
0 C+ _ I+ M) z' c7 @ *' I8 @4 D" f/ I
* This program is distributed in the hope that it will be useful," |8 N$ {* \1 l% |* {% {
* but WITHOUT ANY WARRANTY; without even the implied warranty of5 M- s5 P+ B1 ^4 g
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 W+ K3 Y% i1 c! j * GNU General Public License for more details., K) a/ n( E/ S1 o
*
+ j2 j+ b7 p0 J3 m' O$ o0 ]" D * You should have received a copy of the GNU General Public License
! Z6 @: L0 r# E% k * along with this program; if not, write to the Free Software
/ L3 Y! z$ `2 o3 C/ q5 Z j * Foundati9 S0 n2 U3 y( _3 K2 `( v/ `
*/ D/ m7 H+ h4 t) V
#include <linux/module.h>/ k3 _+ f! E( u7 ^* Y& R, {0 n
#include <linux/init.h>" N8 z7 C8 Z; X; B8 x" R
#include <linux/errno.h>
- y4 r! [' g4 i, v: M# z6 z0 z! K#include <linux/types.h>
$ O6 c* i3 Z! D0 p; [3 X2 h& k#include <linux/interrupt.h>
7 Y$ U! O: N8 m6 B1 p8 ^, n6 o#include <linux/io.h>9 w1 [7 p. f( {" ?5 T; }
#include <linux/sysctl.h>) h' \. `) s5 i! T4 H
#include <linux/mm.h>* N( x1 h7 B" t' N) [
#include <linux/delay.h>
3 o% s& i s* Q8 q; B#include<linux/kernel.h>
9 z h0 n/ N7 Y7 B#include<linux/fs.h>
8 F3 g) `9 e0 W#include<linux/ioctl.h>
2 U p' o) j! L: |#include<linux/cdev.h>
0 v, q0 Y" t/ E: U7 t' v6 v#include<linux/kdev_t.h>. s( e# C8 B/ F% W
#include<linux/gpio.h>) Z* ]$ Z7 C. {
#include <mach/hardware.h>$ {! f+ Q. Q# y! C
#include <mach/irqs.h># X) O! }# G6 C. {0 e/ C3 Q7 ~ \
' s3 D i2 }1 Y+ d; Z& r+ @9 ?, [0 y#include <asm/mach-types.h>) s4 j6 E) m0 C) Y& \8 }
#include <asm/mach/arch.h>
9 j5 i' I' y1 O( g- ~9 o6 d& P#include <mach/da8xx.h> t- @8 A( N! S& [4 e& x
#define SYSCFG_BASE 0x01c14000
/ ^6 r1 `0 d( N1 m#define PINMUX1_OFFSET 0x124 2 {6 x; j& b- u
#define PINMUX18_OFFSET 0x168 , B; q2 Y+ l6 z! o2 V+ l6 N
#define PINMUX19_OFFSET 0x16c- @: y8 }8 N0 s/ t( ]# W, `
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
/ y7 K0 b- L" `: J9 J% W#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
8 P/ ]+ G- }0 t. _! ~# }% e" L& G#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
2 p5 \8 ]4 q4 @ ~( ^#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
; x0 W$ U) Z: D8 m/ S* U#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
5 u5 x0 i( e& _5 O: D* O& ] 5 g9 G7 u9 l5 z+ @% x% v
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR, p: n3 I+ B1 A! ^. P/ R
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR7 V9 b3 k$ i3 e* Y3 \
//PSC7 {4 N% y8 A* G+ g+ c' ~8 J2 x- S. A9 g
#define PTCMD_ADDR 0x01E27120
0 N! U0 `$ f# W" r1 P/ [: q#define MDCTL15_ADDR 0x01E27A3C
A( T# ?0 T5 L+ h4 y# Q, O, q#define PDCTL1_ADDR 0x01E27304
`: ?' `& q! U* m//GPIO8 direction O! a6 w: Q( D% ^4 T' ?4 s
#define GPIO8_DIRECT 0x01E260B03 P) [5 a- D8 z6 [) {+ t2 N7 f
#define GPIO8_OUT 0x01E260B46 Y3 G( U; T, h0 F
#define GPIO8_IN 0x01E260C0* n: w# U( N4 U x/ d
8 _& J) X3 Q- ~
//#define MCBSP1_RINT 99 6 W& o4 R1 \; d2 b" m* Y
//#define MCBSP1_XINT 100 6 ]4 U% K. o3 E5 |' E" ^; I
static int MCBSP_MAJOR=239;" J* X; _" Q/ _3 [) }
static int MCBSP_MINOR=0;# O* k* u% C: _9 }
static int count =1;9 M* M( V3 a* P1 w* p4 R/ }
* y% }( W& j: b, K+ s
#define MCBSP_NAME "MCBSP-device"
, `$ m# B9 X- p' x, P
7 G+ C' O/ }! \2 {static struct cdev *mcbsp_cdev;
+ V9 v7 g/ k/ f# V8 j3 i, {1 ?: c- `static struct class *mcbsp_class;0 M# m2 b* O- n2 z8 a- x2 @8 |
static dev_t mcbsp_dev;/ {& z. M3 x) L! q7 x
unsigned int DRR_data; c `4 X# ?- W9 h& k1 H1 S
unsigned int DXR_data;9 }* t- L; A$ z% l7 `! i0 L
static int mcbsp_open(struct inode *inode,struct file *file)" {$ }( }! T! M1 e4 D( ?
{
7 C {( F) d/ d0 ?2 V# ? 8 o! Z O( H$ g1 R% Q! V
//interrupt enable,initialized( h! G: i r/ T. }
unsigned int temp;, s$ C4 i! g6 T3 B+ K1 K
//SLEEP_EN(GPIO8[10])---0/ P/ h! b+ l' C7 y, B& b' q( s
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" k. V* n2 p2 m( \. |: \
temp=temp&(~0x00000400);
+ t' Z0 ?) a& x* { __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
' i2 i' B$ e5 m6 g. O/ w$ S! \& y //RESETn(GPIO8[8])----0----1
4 U' ~8 n6 A7 V1 e7 M+ Z temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: y2 c" M, W" r# `: `- C3 Q8 m temp=temp&(~0x00000100); m/ w, o/ y0 ]5 m) G2 r
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0/ ]- i4 S* x: N# u8 m! @* ^- J
udelay(100);/ J9 g! i0 N. R! {5 i) A: M
temp=temp| 0x00000100;
% A; M3 c" A9 V __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
2 T W* @5 m" q6 r udelay(100);
2 ?$ ?8 F# N5 f# {. I printk("open success!\n");
9 a. W c8 o2 l" p6 M) k' D0 L* R return 0;8 Q1 ?) s, x( C0 ~
}
{: r2 ]9 {, u' E. J7 z. ]$ ~( i1 U7 ?0 s* P, h' I- R
static int mcbsp_release(struct inode *inode,struct file *file)
! z" `7 P9 o* j+ ~% n{
) a4 O3 M- c# O& n printk("release success!\n");0 E4 o9 g1 H$ M
return 0;; P: f' m) w: m6 A; Q
}8 n3 ]; t0 `& P+ W
- a, h' l. v7 v: e3 a
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
, e1 |) x/ R" u' D' |9 }9 U% h5 ?{: `$ ]1 b3 b1 m7 c2 c
copy_from_user(&DXR_data,buf,len);
5 k! Q2 f( I2 l0 I$ F+ N' o iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); , f! w- `$ M7 @8 ^3 E2 M
return 0;
1 B6 q; y* v! j& o% U
& A, r# V3 ?3 _+ r) \* B6 S}
! Y1 l8 Y6 q* Y+ u L4 z( r! V7 d) k4 v
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* J t9 G C1 y: Z4 n8 ~# s{ ' k: |3 u9 _5 p8 ]" O* {
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));4 ~% u1 j ^; w: `+ [! o% w
copy_to_user(buf,&DRR_data,len); 7 q" J x& s6 I
return 0;
( W ?4 z1 `7 n4 R; A# c! W}: O' f! o. }9 c
1 B' s6 j. |, h: P( j$ Q0 @$ y1 e4 D; m" `7 H) e) X; P
static struct file_operations mcbsp_fops=9 L; g7 V: V" k2 H3 J6 W* A
{' g8 U/ m# A( ?& c& J* u( h
.owner=THIS_MODULE,
9 L: T4 {! y1 q .open=mcbsp_open,; Q$ V: @4 D R* x) ~8 ]% V
.release=mcbsp_release,: s+ c7 p9 s' d% X/ V; A t. w- X
.write=mcbsp_write,
6 p* }" h+ C; R( I+ G .read=mcbsp_read,+ f0 P0 O* ?2 P& _$ v' T1 H+ r
};
7 G( n+ b4 L- u& R& z+ gstatic int __init MCBSP_init(void)* K2 i3 F7 I! h
{
- R$ w; V+ h1 T$ P7 R' D int ret;
# Q X9 E3 f) S2 y+ Y2 N* z3 q unsigned int PINMUX1_REG_old;* ^" o+ m4 ?+ c/ L6 f
unsigned int PINMUX18_REG_old;
5 U' F9 M1 `7 W% z/ } unsigned int PINMUX19_REG_old;' B$ r% K" m* W. O I5 P( J
unsigned int temp;
5 U- m; L2 g+ d8 h9 x if(MCBSP_MAJOR)
) A T7 l" E% W9 T" ]0 l {: ~2 @& M. i( B) k; j0 G/ b! Q
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);" R2 x7 ? p x6 A& m
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
4 E2 H" H+ i3 M, s' u& A( k9 R! u }6 W4 L/ h) \- i; {
else2 t) x4 r0 r8 F$ p
{7 Z2 N8 I6 c) N- q
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; K/ S2 G- Z" ^1 \1 w3 p6 m: w' B/ T MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 p( r% Z/ m" Q v# o }
+ m: n5 [8 B" T( j5 e, b
5 Y) W0 c1 d1 c: f/ Q/ C. N if(ret<0)
: \+ K8 G4 E8 ? {6 t/ [: K$ d! m$ k. a9 e5 P* F
printk(KERN_ERR "register chrdev fail!");
( v3 ^( w. J0 B$ o: z& C return -1;
, W4 h7 {) c& d' \$ T8 `- A0 q }1 T, K b0 e9 x! y+ T& c
9 g7 X' {$ X4 C0 N% f6 d
mcbsp_cdev=cdev_alloc();! S$ F0 C+ r( Y2 X6 f
; ~' D, d1 B D0 m/ r2 _
if(mcbsp_cdev!=NULL)
4 P2 k( e$ |2 V! o {
# D) B {+ b+ D- s cdev_init(mcbsp_cdev,&mcbsp_fops);
* W1 i2 `1 F. ?" X2 c" { mcbsp_cdev->ops=&mcbsp_fops;
' [0 Z1 Z0 j0 L3 x. ? mcbsp_cdev->owner=THIS_MODULE;
# H0 X' F, h: L3 s9 q7 ] 0 y7 u3 F$ B. m4 Y& P; z+ m( q
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
0 o5 W1 l6 \) L( U3 k printk(KERN_ERR "register cdev fail!");- l, U6 _8 V7 m% [3 i' N
else9 C. K" z* F, Z- C# J7 ]
printk(KERN_ERR "register success!\n");
' k3 r+ e+ J( u) ?9 P3 a8 J; P }9 T6 i; j' F8 C! J! }1 z0 p$ w o- F
else
' p# M. n5 z. _8 T8 f {1 n( d. K N* {5 h
printk(KERN_ERR "register cdev err!");
7 D z& l! E) U/ T return -1;5 E9 c+ Z) s8 @% v! C
}1 ]; q7 a/ |& z$ r( u
, X' F4 a, G8 h5 q3 e9 o
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& ?8 I, W) }( H9 q! ]' J
if(IS_ERR(mcbsp_class))% ?3 O9 c% W0 `+ D% }3 P; P
{
' F4 Q( z, m( ] printk(KERN_ERR "register class err!");
% ~( M- H5 _$ S3 O9 a) T2 I! {) R return -1;
4 r) e1 C1 b; b7 p }
6 Q1 z/ u& W; h& u6 ~ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
) s4 ^# `( G: O8 P) {' {2 b' i
' ^! s, t, O/ h" `6 n | //PSC, F" T6 [$ v+ ^# u5 u
//add Enable MCBSP% D' G# k/ s0 @( b$ V
//test
& O) v6 t' f2 }" M* W+ Z temp = 0x80000003;- w& ^: x1 i& e4 e$ v1 a! }
writel(temp, IO_ADDRESS(MDCTL15_ADDR));' o( \0 R9 R! j' T3 n
temp = 0x00000003;
2 \% T9 O" @- N writel(temp, IO_ADDRESS(PTCMD_ADDR));. `, z% w& E$ k1 y
4 v( [' D { R temp = 0x001FF201;' _* J7 X" D& m# A6 e: i1 e2 g
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
/ n6 R+ }& A. K" G
4 O- t, O2 J8 i9 k- G //PINMUX : |; S4 b8 L) w# T0 B
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
( a4 a% D' g1 {6 o- q5 ~0 t PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); % G4 ?0 c7 P) `, Q; x9 J3 _& b
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
1 t+ {6 y4 G) r% b writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);- z: j4 U) `; p
# W5 ^" Y) t+ e7 E* _9 X
//SLEEP_EN,EPR,L138_SHK1,L138_RC
; b( i' y. R1 l& C& L' T$ ` PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
+ M+ s! j; C# {) b$ k PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
6 w6 f G# C! Z" r* S writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) X6 \ k/ i {6 ]" l; F$ w
* b! f8 H) q! s //RESETn,L138_SHK2$ U% ]) e. X( w
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); k- X" g$ O/ u; t, I# t- G" a c
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; , t X0 j8 L9 i% J# D0 ]; o
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
8 R4 `- I) |3 D/ \6 c: ?# G+ i 3 O, y: k% T) j1 j( b
/ T; H3 F- H- k7 Z
//SPCR Register( Y1 ?, n; z! c
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset; r3 O' p5 S/ j
temp = 0x03000000;//(DLB=0), s; p% p% t8 X0 T* @3 y1 `
// temp = 0x03008000;//(DLB=1)
) L2 f Z1 Q! F' ~# l& j1 g5 z writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% R: t" c5 A+ S3 \& K S temp = readl(IO_ADDRESS(SPCR_ADDR));
" `8 A( N+ C2 U2 }) g printk("temp=%x\n",temp);" b7 H; X* O" l7 V5 }
/ i5 Q: k; M0 M" r1 o; k" M( q
//PCR Register( v n' d+ R: g9 P
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; E" D z( S! G% }& B0 Q
// temp = 0x00000F0F;& ^ _; a: _6 v0 v# |
temp = 0x00000B0F;
' S0 r* [+ u8 D! X+ d2 K writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
8 j. K7 p( g2 t7 W9 ~6 O temp = readl(IO_ADDRESS(PCR_ADDR));( U; P! k/ s9 i I) z( x7 l
printk("temp=%x\n",temp);
2 q$ s' ?- _. G- t0 x //SRGR Register
4 j% a# d s# Z* D" N //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11( h& ~ r0 L6 S: d
//temp = 0x301F000B;
3 I( J: j0 C3 P writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
1 F8 P( q* D6 m$ c, U8 x temp = readl(IO_ADDRESS(SRGR_ADDR));+ i3 ^& x6 ~& m
printk("temp=%x\n",temp);
: ~: H! M( X c, c, a4 ?$ a //RCR
7 P: r6 w. J1 K" } //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
; Q" e" c* G; t0 r* M5 P //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
2 p7 T" l) N( F+ P- P( H temp = 0x00440040;: w, z* b+ G" H
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
" P- k# h4 ^4 K7 f2 m temp = readl(IO_ADDRESS(RCR_ADDR));. E% l0 q6 _! v6 }
printk("temp=%x\n",temp);* W6 E' W/ U, h5 A, Z% M
//XCR+ }7 N, X7 S5 d! Q4 o
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
0 M' x( I& J# L& f1 C" f //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. R: O J3 m% H$ \. ^) ], [) B temp = 0x00440040;. f$ |4 P3 b7 F6 z
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 1 ]+ @! x' G) U8 {1 R5 X
temp = readl(IO_ADDRESS(XCR_ADDR));0 R/ T5 P- M2 j9 y0 |
printk("temp=%x\n",temp);
1 g0 e; H5 D; E0 f* e5 ] udelay(100);
& i N; s, F- f S" m0 G# f //SPCR Register
% I) \' p$ o. v/ H //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( T* v) m; V0 r! q& I( R/ m temp = 0x03C10001; //DLB = 0 VS DLB = 1
, Z/ c7 B, b7 ]1 Z/ V& L5 x writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
! X* h M' j/ i U3 H* f temp = readl(IO_ADDRESS(SPCR_ADDR));
: k1 n" [5 P% P" R5 ?( ^ printk("temp=%x\n",temp);' u" d; V0 H% M% I
udelay(100);2 N& v, _; D+ o3 f: O$ Z- a7 q
) _+ ~" I O4 p4 Y" X
//set GPIO direction+ U: T' }: H' v. \/ z+ f
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
. t* v- m1 O; k* L7 o' w temp = temp | 0x00000100;//EPR----input
0 i: g; i5 g4 x6 }3 a A9 j1 D temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
& G; v- o5 b6 z0 l9 [ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ B9 e1 j% Y$ C. h$ J9 X- \ 8 `( v/ V9 D q, S5 U$ e; _# V y
return 0;
z7 f( r! s& e" g% F}1 b3 r. V+ u! x0 L
static void __exit MCBSP_exit(void)
l8 m1 F+ z3 X7 L{, w6 y3 [+ [" o6 E
printk("mcbsp chrdev exit!\n");
, H K: F* H2 N: O% n5 N% Q/ [/ M( _ _ cdev_del(mcbsp_cdev);
5 Z/ H( v- P, G. m, \+ Y/ {9 \ unregister_chrdev_region(mcbsp_dev,count);
6 D/ |$ y, r8 A1 s% b% i* U device_destroy(mcbsp_class,mcbsp_dev);" r/ l4 }. H4 Q% T$ c$ W8 Y( K# J
class_destroy(mcbsp_class);: v1 W _0 ~: k( F9 o
}! v/ ]# }7 O& n/ @) m1 ~" u4 f
module_init(MCBSP_init);* o- k* E# A5 o0 ]9 V: U" f
module_exit(MCBSP_exit);, F0 w H9 V# ?
7 `( t5 U D* G, DMODULE_LICENSE("GPL");
0 v: E8 G/ ]" p# J5 i; c3 ?* ]0 g: Q4 U% n: C
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。' m7 J: e0 P& a' R+ q2 T) c
我的应用层的测试程序如下7 k) e. ^. P+ r& A8 P! t
#include <stdio.h>
r) a1 w: ?8 }7 L. E#include <string.h>& c) _' H3 ?. I' ?& i1 x
#include <fcntl.h>
4 H/ Q% q3 E% y* }% a#include <unistd.h>' l/ D. N& |5 M) N6 w8 Q: S
#include <signal.h>2 g4 J+ D0 Y! w5 y% D; Z* j* M8 s
#include <pthread.h> //线程! @# t$ I- T" u# t2 E
#include <stdlib.h>
$ j3 Y) K) V- e5 B. E$ Y6 k#include <pcap.h> //捕获网口数据. e6 G4 h" q4 E
#include <semaphore.h> //信号: l( k% p, r# k; r
#include <sys/types.h> //消息对列 ~$ }0 |# }; A: ]
#include <sys/ipc.h> //消息队列( V0 q( X- P+ J8 w
#include <sys/msg.h> //消息队列( i* w& {1 I9 P5 M0 o7 R
#include <sys/select.h>- j% ^. y- z V' O( y0 H% l2 B
#include <sys/syscall.h>; L& ]' W; y* m7 g) @4 d& \4 T+ a
#include <sys/stat.h>9 c# R+ v4 i' t0 |
#include <sys/mman.h>4 A( W; L. q4 X' S) ~: n6 T4 I, A
#define msleep(x) usleep(1000*x)4 A# |6 F& x8 ~, @
7 v& u- z" S- P$ E+ M$ o
int main()
u# L& H) L( S{
) g' C5 j* D3 d/ |/ z1 ^' P6 W //MCBSP,ARM与AMBE2000交互设备7 T& b& ]/ ^- i: D3 ]' R
int fd;
$ l; J0 v6 ]% |* n2 ^$ y h unsigned short data_write = 0x5555;$ V2 @+ l% Y" `( B2 @+ d% f
unsigned short data_read = 0x00;. T- c6 L) ^ u
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);2 m/ q$ b& a5 i- a* g
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);4 R2 t0 G! k, ~! l, P
; P3 X( b4 J5 F4 @" M/ w$ I: E if(fd < 0) c7 m% `# \7 s) V1 K/ R# C& L6 q
{
1 i G/ Q/ t7 L* h+ _4 a perror("open failed\n");
) ^1 y; L4 t2 ^- c* c' Q U7 M return -1;1 A9 ], M) Z+ D. q
}
& _: K4 p6 U+ ?( T9 n$ \9 D
+ N/ H+ a/ R9 q$ ^7 H% j. x5 l- ]! Q8 p while(1)
) b' A. c& W6 t6 ` {
: `, K' `4 Y0 m9 X+ k; ?
* O N8 a/ H" Z9 a) h //AMBE2000每次读写是24个字为一帧* L% c0 ~9 H5 P9 {3 U9 i. L" B7 p# Q
//写数据时将数据在底层存储起来,等到中断的时候再发送
6 _2 ~" P3 t# R. g2 N4 p //AMBE2000输入数据是以0x13EC开头的* E+ o7 S0 y8 ?7 W0 W/ Y: h
write(fd,&data_write,sizeof(unsigned short));
" ~% n# E$ k) ` l- }' a
" z, W1 L( G* p* | //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 * s5 Z1 B+ L" n3 U- g F
read(fd,&data_read,sizeof(unsigned short));/ G1 h: Z- J) A( W1 Q
6 a& q( s3 B2 r# q( U c
if(data_read == 0x13Ec)
# F7 M3 T! I: T G( X% o: E# u4 ? {9 O+ ^- Y" e' x+ @# `: K
6 V/ E- n8 o1 j. R9 k5 W printf("data_read = %x\n",data_read);
: M& k" S# R4 V( I4 m% } }
; l& F1 `. j8 S) Q4 s8 ]
$ J1 W( a4 E) t/ s9 N msleep(10);
9 L g5 D6 _9 b% T: E" h$ e p
$ l" R4 ~9 l* q i; Z. G /*
- o4 D. F, q* h9 \" x ioctl(fd,1);
/ A% S5 t/ h: Z sleep(1);
: a/ j1 s: a3 ]) P, w h4 s$ t" r ioctl(fd,0);8 ?' Z3 X/ [: k9 L/ J
sleep(1);
4 Q T8 P. p5 w */
' E8 `+ B1 E) j r! ]: W3 w! p } # j) N" P/ ?3 v2 Z- R) h
return 0;+ ?* ?& _( k" C/ y
! S9 [0 F+ y1 z! V9 U0 g1 J
}7 |1 s7 |! T* \, s
4 L1 j3 w8 I6 v- H6 [$ b1 t) I; m多谢各位指教,谢谢! 急9 _0 f4 z: Q! {# e+ w
4 h) D, r4 V3 q9 E8 b. Z& _
' v$ F6 q/ v% f* k( i3 G" T
& R: X5 a/ ?- T. x
# E$ y1 d) W p9 ?& b% i1 C
6 d) b# k) ~ d' t) b( p% p |
|