|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
/ B; ?* j3 ]" U& c m# u, K( P. G/** [3 I( g/ [6 w; S5 k8 p
* Copyright (C) 2009 Texas Instruments Inc
0 l: s* u; x3 l) }& Q* @4 S# n *
- Y# t% W* c0 l& x8 r * This program is free software; you can redistribute it and/or modify
, y5 P3 N3 Z- @2 A: D1 z3 i% m * it under the terms of the GNU General Public License as published by
4 h2 ^) q1 ]+ q0 o * the Free Software Foundation; either version 2 of the License, or
5 X3 f/ i8 e& x- r7 m0 Y: @ * (at your option)any later version.- Q5 E6 }6 e) m# r0 w8 x* ] y
*" q8 k I( t7 U: q6 z6 b
* This program is distributed in the hope that it will be useful,4 {8 R1 @! ~% u# d6 U; O
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- o( Y3 ^/ \- X7 O1 B$ \; C * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; {- k- I, t$ h* t% o3 e
* GNU General Public License for more details.
_/ l3 D$ n6 z' p! G! ~ *
6 `( k& F4 C, V. k: D. u- {3 v * You should have received a copy of the GNU General Public License) ?+ `: f3 f- R; a( ?* z V9 Z. W
* along with this program; if not, write to the Free Software
/ \" f, V2 O4 [ k * Foundati& }, Q1 d4 a% B8 k$ B1 n
*/
k6 _0 A; r5 v#include <linux/module.h>
3 T( u% [# @" s4 O#include <linux/init.h>
6 A" F. S. f( l) d p9 [5 L+ B#include <linux/errno.h>+ E$ L! ~6 N+ H* q; s. s( d& e' w$ x
#include <linux/types.h>
5 j/ s& o- I4 H#include <linux/interrupt.h>5 G1 M8 @; _9 D. \% l' y
#include <linux/io.h>
) G- _3 }0 m. Y+ P#include <linux/sysctl.h>
( }! m* `6 A/ x h! r, [. x b#include <linux/mm.h>
: {$ R; q; [0 X. E#include <linux/delay.h>: M) B7 O7 D" o4 [9 H: A* S, P
#include<linux/kernel.h>
8 f7 T0 g9 e; B s#include<linux/fs.h>
6 t- T: A$ ]' M0 y#include<linux/ioctl.h>* [7 e/ I% B d& M7 z9 _) g. v0 o
#include<linux/cdev.h>
/ y; H6 R- Y* L+ q/ j#include<linux/kdev_t.h>
( H( F P( `( ~' `+ F- e5 b#include<linux/gpio.h>( Y9 o+ Z" g a( i) x1 [! P
#include <mach/hardware.h>
! G& s+ P& m0 {#include <mach/irqs.h> g8 s, Q5 K+ h& j! L5 F
3 g# `; Y2 {/ D; L( M
#include <asm/mach-types.h>3 W; q, V7 y* O0 J0 o/ U
#include <asm/mach/arch.h>
0 _. J) M$ `( O#include <mach/da8xx.h>
5 g" _1 v D5 T; M, {7 R; T#define SYSCFG_BASE 0x01c14000
5 _% u( \7 ]3 h" [% b8 q7 u#define PINMUX1_OFFSET 0x124 ' o% @0 d& l' u1 X
#define PINMUX18_OFFSET 0x168
; k5 }, k" P: R, s9 V+ O#define PINMUX19_OFFSET 0x16c
: ^0 L: b+ M! u& f9 f* a#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
) U; l+ k8 q9 r- d# G+ {5 c; b9 r& D# |#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
/ N5 I! Z& _/ ]& X9 G1 X9 Z#define XCR_ADDR 0x01D11010 //MCBSP1_XCR; U! ]/ Q' c* U) N! x
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
$ K& {: m3 v% Z. D) v. H$ ]. S#define PCR_ADDR 0x01D11024 //MCBSP1_PCR+ f0 _" H9 _3 R( y0 B
5 N8 u5 [) }% I
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
7 P1 J; X2 K- h% D#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
. I# o+ P+ V( D6 W- i9 A$ Q//PSC
, }9 o) [% \& t0 f#define PTCMD_ADDR 0x01E27120
A- _' h) v) j% I/ w! M#define MDCTL15_ADDR 0x01E27A3C
e( v5 T& l7 u( O! Z& p#define PDCTL1_ADDR 0x01E27304
( B2 Q: y( r7 M6 R8 P//GPIO8 direction ?$ h( [& F8 P" D7 }
#define GPIO8_DIRECT 0x01E260B0
( G8 d6 r0 U0 q#define GPIO8_OUT 0x01E260B4$ u& V& M- i# D. {
#define GPIO8_IN 0x01E260C04 l. {4 M5 h- j7 ~
& r4 w: y) [3 y! t; o- d* O2 ?//#define MCBSP1_RINT 99
" W$ O; W+ V n5 h0 M" V! k//#define MCBSP1_XINT 100
5 T z5 v& C1 U! Mstatic int MCBSP_MAJOR=239;# G2 B0 c; Y5 b2 o( b( z, q. x
static int MCBSP_MINOR=0;0 c2 }' [/ ?' F! ?9 k5 B4 T+ |9 a
static int count =1;
3 w/ r: `8 o* [" a3 o$ R& t, J+ Y; y8 l
#define MCBSP_NAME "MCBSP-device"
, r( u& n) _, M) W2 R: p" a( u/ C2 _
- m# W/ R1 q, `- a- rstatic struct cdev *mcbsp_cdev;
! |( ?9 G/ |6 w' Fstatic struct class *mcbsp_class;; \& X, N; v6 w1 r# Z6 |6 l$ j& C
static dev_t mcbsp_dev;. ~$ q' B( {5 F
unsigned int DRR_data;2 Q$ O5 S" D3 U1 Y; F: f" Y% a
unsigned int DXR_data;
* k( i: M2 h9 o- x% D, Tstatic int mcbsp_open(struct inode *inode,struct file *file)
0 N# Q m" s9 l( f{
3 L" y1 ~- T9 r* S0 U2 e6 I
# @" U$ ?6 W, ]0 w s/ E0 J0 M //interrupt enable,initialized
, S) s+ p6 [( ?9 U unsigned int temp;1 X- P& P/ x1 I1 H
//SLEEP_EN(GPIO8[10])---0, ]2 I- z! m4 m7 h3 F
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 a, R3 L1 Y) ^/ p+ g' R& ^7 ?8 y temp=temp&(~0x00000400);
6 @' C9 C1 } V5 w; N+ x/ k+ q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]- |7 y. y7 B& a" v5 [
//RESETn(GPIO8[8])----0----1' W' D: y8 M' }5 H! h# ]: I
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
4 Y) }9 T1 }2 d1 c; U7 q- h temp=temp&(~0x00000100);) X, [9 ^6 X7 p, t" k
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 E( T0 H. C' f. x4 A udelay(100);% X4 `% l- U) u
temp=temp| 0x00000100;
' N: i# D3 V6 A- C. k, [ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% N, F7 i2 L# J$ E6 U& V
udelay(100);% }4 y4 y/ d5 S6 n. m
printk("open success!\n");5 d; O" N9 H7 G$ m: [ s- C
return 0;
+ P; O8 L z# [' K2 V A2 u8 e} h) q! }7 K- r( v
9 M0 f; K! i6 l/ z- L+ i
static int mcbsp_release(struct inode *inode,struct file *file)
3 M) ~, ^7 y! K+ k2 c2 }{
* e6 A0 x. T" y4 N$ r0 C printk("release success!\n");* g7 d8 v) C6 P% K+ I C; R6 e
return 0;
3 g& V1 J1 k; s G" Q" h3 a: R}* R! J. V) L* A4 Z8 c9 Z
, Y- e3 c7 p6 U: N* |" J7 wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
! p9 t3 K* H$ E& a- I{
1 M* d7 [" w; S! P' p" Y8 H copy_from_user(&DXR_data,buf,len);
1 p$ {3 M @( C# i" l- i iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
/ g! h& }$ A; Z9 P- {. V return 0;
% Q: \7 |* M% v' t/ f $ s5 x8 F( a+ V* ?: ~( \4 c
}
) D" E8 h. `. m) C4 Q8 u3 K) x# \1 ?# |8 @. L; K9 O
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off), X& E( a1 `8 @; V
{ + _, x! F3 j6 _) f& u- h- y
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
; {: [ Z# @8 f$ c copy_to_user(buf,&DRR_data,len);
, \# o& F( K6 {0 L return 0;% @3 K, T; ~3 j# c o
}9 O# f+ a0 n) s" ^
% g* S* U, x9 M7 H( Q8 a- h
5 Y H1 K; r Qstatic struct file_operations mcbsp_fops=+ a) M2 s4 f2 O! B% K/ |
{
/ ~# n+ b( f7 V2 J4 H9 z .owner=THIS_MODULE,
( ?3 T# D; I- L% u/ A .open=mcbsp_open,
" I" R8 x: t) e5 E3 N v" V .release=mcbsp_release,
# e+ H5 }& O |- k: n2 i .write=mcbsp_write,
( `1 U* y$ i) C' l4 R- V0 b- i. I .read=mcbsp_read,, Z+ ^ o1 {& z% D4 z2 p; N! V d
};
* [* K$ a( C. T1 d+ w2 @3 cstatic int __init MCBSP_init(void)' e( p: R5 f4 z% J/ m- X! B1 \
{
$ \/ `, d$ S9 ~9 e1 F V- V6 o/ h int ret;
2 k7 _3 K! J0 H) O$ i6 M5 M unsigned int PINMUX1_REG_old;. v2 w! R. M6 ?3 ^! r
unsigned int PINMUX18_REG_old;
9 w) S/ o6 s; \6 k unsigned int PINMUX19_REG_old;; d4 T$ y3 P- c, r
unsigned int temp; ! \' ]( Z5 l; B
if(MCBSP_MAJOR)4 [) K. u t8 l
{
7 z8 F0 O+ }' _! z# b7 s/ G mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
3 |5 T& Z: l3 Z ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
3 T. v' I" x" s! N4 E: ~$ [ }9 s3 A6 ]5 \% a2 G# {1 ^+ ^
else3 q4 l1 ?, V; w& r
{/ A6 O* h4 @! D
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);' t0 x: ~ x; h% M: C N- J/ q
MCBSP_MAJOR=MAJOR(mcbsp_dev);4 ?) \7 g) n. [4 [
}
, ~! @6 q4 O3 z- T4 x0 y. L9 |
% p7 `" L6 V' L" O, d if(ret<0)
% G3 k: i4 K0 U% X, w {& t0 c! S5 w$ c; C+ x
printk(KERN_ERR "register chrdev fail!");* X8 n) M3 d9 Z5 J( S8 b4 W! S
return -1;
/ z4 H0 `4 W% f3 F }
' \; W, j; e- v9 R! P % T$ A4 s4 i+ c/ J
mcbsp_cdev=cdev_alloc();% x, q! v, k* \7 c( d5 B
/ s$ {7 E9 F; N6 Z+ C if(mcbsp_cdev!=NULL)# P: b- C$ i: \ e4 L
{
4 l% {! x; o1 _& V cdev_init(mcbsp_cdev,&mcbsp_fops);
, ^3 R. e& q7 k) Z c7 d% I mcbsp_cdev->ops=&mcbsp_fops;
4 ^' y0 }, V6 b- y) p, d \ mcbsp_cdev->owner=THIS_MODULE;
$ z8 {; h& O. X8 u" m" K ; x2 I9 Q& J$ y1 c& i
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
: j3 t9 d! g8 _3 a4 `- }7 b8 R printk(KERN_ERR "register cdev fail!");# A) K: J5 J! m: |( v
else* r( j3 }; K+ Y1 @& F
printk(KERN_ERR "register success!\n");2 d8 @9 Y; k8 L- Z% o7 L
}* B; a! ]4 ~' _! P% u% \
else' ~0 g8 q$ x& M' ]! K
{
& G5 z" U: z. u! F7 ] printk(KERN_ERR "register cdev err!");2 Z7 V4 R2 W" @. z u1 ]4 n8 g
return -1;
9 {9 \% x/ T1 S% `1 j+ A }
% `" D( m6 `+ ?- z6 Y' ]) X
" k+ ^/ d# u0 } f, P mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* r( |. O* ^$ C2 ]' R
if(IS_ERR(mcbsp_class))7 q/ E( k& p( J& ~5 P3 @( t! R
{( O+ u3 N, Y' q' J9 n
printk(KERN_ERR "register class err!");% f3 a9 ~! {* D
return -1;
) P+ `; ^, N! m' C: w* ]2 m# T }% j& ^+ E0 k" r# U( [' K
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 O" p! {4 W7 C7 |& R
6 x: V; i1 U. u% `' J1 L2 y' v //PSC
9 ~4 T; N# {# V0 Z //add Enable MCBSP/ \+ ?6 O# Y% Z5 G$ [8 w. i: v
//test
! e9 N& n0 ]* |* y temp = 0x80000003;9 i9 t# |2 j0 H8 @1 U
writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ |7 n a! s+ }3 |9 r
temp = 0x00000003;6 U3 N0 m5 V/ e9 J5 w
writel(temp, IO_ADDRESS(PTCMD_ADDR));
1 q- ]" w1 _% R7 L0 w* p/ ^ : h. B* y# J+ H) W8 Q5 A/ u
temp = 0x001FF201;3 M( f- R* R3 A
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
; g0 w6 V" R9 E; p; X & Y/ O: x7 @) u, L$ n) X* J) x A
//PINMUX
4 \2 S4 N/ E0 Z9 _ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
1 y8 r9 ?% O/ Z8 a, j PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); , q! I. m; v" f4 u4 k
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; : ^7 ^, H( G$ X H! X% J
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ t7 o6 ^. S& R& J$ N1 e" b
& V+ j8 |$ H4 M. K+ c% C //SLEEP_EN,EPR,L138_SHK1,L138_RC
6 d6 q( O( ~, U9 C+ t( M! d; e PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); : |3 I# L3 V; V; m' g" D
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 5 C9 u3 P- ?: h" j3 T {
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);2 i, n4 e0 a) S8 g- O2 I) Y7 h
/ ~3 m2 Y1 K( Y) m) }" _1 u
//RESETn,L138_SHK2
, x% O2 p1 Z6 ]& h" L1 Z) P) B PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); + `) J7 `6 s6 s6 g+ W
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
/ P5 J9 l4 i9 \7 z writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ k7 j, d$ s" N3 f, r/ v$ J& p
6 ^7 K! k3 P( m i2 O, i9 s. c! a0 w
# U. h) Y2 k: j& [! U9 D //SPCR Register' j8 {/ z; d5 S; j4 y& S
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset. H! @$ H2 U$ r1 Z0 Z+ j' ]! }
temp = 0x03000000;//(DLB=0)
; j$ w2 Z( e0 w // temp = 0x03008000;//(DLB=1)
) P9 b, g1 o: j+ J2 T writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
9 b9 W# {6 q' y0 B1 N8 e temp = readl(IO_ADDRESS(SPCR_ADDR));
3 J( h. R* \' k% y3 ^: s8 f: X printk("temp=%x\n",temp);" F8 e, L: U+ c' F+ i; R X$ @
8 O' L8 u+ D/ ]% h6 b | //PCR Register* [- U% C& Y8 X
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0$ {* m* c! b( z+ r
// temp = 0x00000F0F;
3 v0 g; m* w/ Y+ ^ temp = 0x00000B0F;# T. o+ M" `8 C* o+ l% \$ v/ ?
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized $ z% n! _+ v; i; k
temp = readl(IO_ADDRESS(PCR_ADDR));, [" x5 C9 r; o1 i- I* Q
printk("temp=%x\n",temp);
( r4 s- G. \7 {4 V% R //SRGR Register
' D# w+ `7 ?5 k; Q1 N* v //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
0 k$ c, i& V2 o) J9 W, Y //temp = 0x301F000B;
- `! Y; `) y, ^% b# K writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized - \9 v* ~& F. l, q& X8 A6 u7 |
temp = readl(IO_ADDRESS(SRGR_ADDR));; R* V, _- h% [6 ]+ q
printk("temp=%x\n",temp);
6 z5 e& i' q; I* Y% x, ?8 x //RCR
0 r3 R! Q: A& i- p( d5 ]" d& L //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,1 A- P. X n$ F0 f. m
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
9 a$ P" f* ? B. a! d/ ~5 \) ^ temp = 0x00440040;( w# F9 R9 t. Q. g5 `& ^8 w7 b
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
3 P/ I9 t3 b3 ^6 B* | temp = readl(IO_ADDRESS(RCR_ADDR));& d4 V( |, e. D4 @9 U0 |7 r, }
printk("temp=%x\n",temp);6 O- n8 ^( D7 `
//XCR* g6 d- R p5 r4 E/ k# v1 d1 f# e
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* V3 _( l; V5 V //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! h( q( ]6 i5 J1 c2 B {
temp = 0x00440040;
& v7 Y0 |) U$ V4 [* H3 ` writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ' z1 \6 v# _ V; d5 r \* v
temp = readl(IO_ADDRESS(XCR_ADDR));# d- r' \% \+ W! |$ p
printk("temp=%x\n",temp);
; Y: K# r( D+ B% W2 s5 M udelay(100);% p# [0 ?* W" O. R7 i2 @ `
//SPCR Register6 q P2 ]9 Z5 s5 T
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1; Z' l; E5 ?1 ~
temp = 0x03C10001; //DLB = 0 VS DLB = 1& f; l# @' ~0 E( U' u E
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
7 \$ \/ H, E# R9 ^1 e5 O( C4 y temp = readl(IO_ADDRESS(SPCR_ADDR));$ e5 o6 T# c7 |& Y$ d2 V( ^
printk("temp=%x\n",temp);1 l- H$ k: k- d/ U1 g+ P8 G+ e
udelay(100);' P6 M% `5 L8 e7 J. ]& l9 L* |* g
R; ^) J3 V6 U- k" ?
//set GPIO direction
- Q1 d7 i% {: ]3 W( d9 {! k temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
" f* y$ X9 a5 T0 } temp = temp | 0x00000100;//EPR----input
2 X' R# A4 d' B temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output9 x7 B0 Q8 |9 w5 g. _
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); + l+ ]; Q( B0 A0 O& G
( I R; S' n0 a# W
return 0;
% c% _ A% `6 X$ D: J1 e}9 N. g2 }, \( F
static void __exit MCBSP_exit(void)
1 M" V+ S7 y+ t [9 P, Z{
8 w. Z# n. n* }; x4 G% s printk("mcbsp chrdev exit!\n");0 T$ p7 P; i' o' M
cdev_del(mcbsp_cdev);
, @' b M- U6 ^ unregister_chrdev_region(mcbsp_dev,count);
4 [1 C# l4 |, p( i' R6 Y/ ^8 o device_destroy(mcbsp_class,mcbsp_dev);
1 L" j- e; I( S( u, d class_destroy(mcbsp_class);% @5 O: W2 P6 L% _* J
}
7 b) Q2 n* b8 Rmodule_init(MCBSP_init);6 z5 g" k6 `: a( K% u7 A
module_exit(MCBSP_exit);
1 G- |7 d( ^9 ~ T2 j# m* r. E0 Y% Z. T. B" y a
MODULE_LICENSE("GPL");
5 x: @; n. _- f' N+ p" F0 r. N) t; A. I& x1 |9 ?
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。- B( T& F% }4 }! u$ s; R
我的应用层的测试程序如下, V% R# j+ y& [5 N. @
#include <stdio.h>' ?9 r9 r a* }$ ?" A u' Z! D
#include <string.h>
- P7 N; |/ R0 j, @/ B3 i/ m#include <fcntl.h>
( `5 t: |! u# q3 C& y#include <unistd.h>- @9 f- M3 W1 J3 }! u4 J
#include <signal.h>
6 R; l* P% U! c- r#include <pthread.h> //线程
5 H" w$ l3 C" C0 ?#include <stdlib.h> K6 x. y7 r2 j7 L' L( d" a
#include <pcap.h> //捕获网口数据
5 T9 J u1 ^, P/ q& R( W#include <semaphore.h> //信号
; H, E0 g3 z& @9 O* B. N#include <sys/types.h> //消息对列: n3 B& h4 ?' ~" q
#include <sys/ipc.h> //消息队列) L# g$ h/ x/ b
#include <sys/msg.h> //消息队列
. i- f0 q. U% m' B1 P#include <sys/select.h>
; X1 B& }0 _5 a7 q#include <sys/syscall.h>3 B4 v/ l5 y3 }' t- M( f
#include <sys/stat.h>
. M- z9 p$ \1 ]- I: r$ W6 D#include <sys/mman.h>
9 D2 _; c: G5 ]7 X3 C7 a/ L#define msleep(x) usleep(1000*x)+ T$ S. u1 i# \* {- x& u
! A' G5 v; b1 J! cint main()6 w/ L t6 M2 x0 s4 T8 j3 V5 g) w/ s
{
- a/ |- L8 i7 ]5 P6 S/ K" P2 x" b //MCBSP,ARM与AMBE2000交互设备
2 N* ~: P% I: q$ } int fd;. b9 P' R2 y3 L% D; G, q5 b
unsigned short data_write = 0x5555;( [( x! d- a% ^6 A. M8 U) ]( N
unsigned short data_read = 0x00;3 k. \9 m4 h. ^2 h6 s! \+ O
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: U# J/ n( w, b& y4 R7 z5 F; r9 P G
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);, k; z- F: T" u
% }9 C# y# l: Y7 X# ] if(fd < 0)
- V: R# E: u' n5 } {3 g& D2 }) E3 C7 m, L+ y# `
perror("open failed\n");
$ t% N" D; v, I. h. H" G0 B return -1;& s4 B& X! u0 f% H, n4 ^
}
. m" _) o3 p2 b3 O/ O C9 x $ c/ ?6 P. a) b
while(1)
7 w6 |4 v. T# A! `( k# P. q- L+ H {
% a* f" r* x& C! O* e9 G: p
3 k" Z" v; _ e- N6 o //AMBE2000每次读写是24个字为一帧
7 A$ [; F1 |7 l/ \ //写数据时将数据在底层存储起来,等到中断的时候再发送
* [% k) t# S. n6 V6 {6 b4 e% [ //AMBE2000输入数据是以0x13EC开头的
' M3 E/ C$ H: o3 Y9 J- I write(fd,&data_write,sizeof(unsigned short));
0 v+ E9 R; ]2 Z& c% `
; y9 H8 [4 b' N+ ?% S7 L* N% ?9 a //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
) P$ I7 O* ~: ~ m, y X1 D read(fd,&data_read,sizeof(unsigned short));- ^7 |# a8 K: l8 r! T
" w! g3 |$ c. `# |* l; @, ]
if(data_read == 0x13Ec)3 h4 E: Q1 [: w+ ~
{4 M! g! H9 u: p; ]
9 o$ P9 ^: X, A$ {* f' C. n. T printf("data_read = %x\n",data_read);
' l% o2 I/ a( w }
' i' }( a7 ?# M4 c
, h( g m- U1 [/ o- E msleep(10);- `9 c0 K( ~$ n0 O
- O* m. P4 I5 S: r. l2 i /*
7 x( S/ q3 n/ J4 P S ioctl(fd,1);
2 c1 \$ M6 ~/ |, t: o G sleep(1);
' k) f$ B/ x0 a/ b ioctl(fd,0);# s7 b3 z2 \/ @7 Q, B$ \: C
sleep(1);
8 D1 F, f. e1 r8 J- U, O* D */
1 e4 }( O! ^% m; G$ K } 3 L% ?4 }! y3 _' n' P
return 0;
6 H* {! C! T' b$ Q8 n) @ & J7 D( K1 l! ~
}
; P( d+ D( t+ M% \- X
4 g4 T0 _# p$ A+ Y! S$ R& _多谢各位指教,谢谢! 急+ P8 \$ k6 [) c! a4 ]
$ M7 b- p$ @/ P
8 ]) m( b8 o! q5 A4 B, R6 Y( V( Y4 K' k8 ^
: n9 [, J2 S+ H/ W
+ C) L5 r. r% j! ~% D |
|