|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 7 i; e; j- }7 D0 F Z& H( D! n/ E
/*
8 w. x# p$ I# K, o5 y, E * Copyright (C) 2009 Texas Instruments Inc
. z0 b0 T3 T0 M, g. q * \) ?- W; a( C' J
* This program is free software; you can redistribute it and/or modify( Z% T8 i/ z4 @2 C/ I6 r E
* it under the terms of the GNU General Public License as published by
) J+ G L0 j. N9 _6 V) u * the Free Software Foundation; either version 2 of the License, or. V& T/ Z6 e1 K& f9 X
* (at your option)any later version.
, x* {2 n- \# k5 p *, |. @" e+ Z. ^% J, @
* This program is distributed in the hope that it will be useful,0 x% _% `4 h7 }: s" D2 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
& o8 Q/ f' K d6 u3 d6 l0 h# ~ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 }6 d3 K, W. }# r * GNU General Public License for more details.* ?# G" s" J6 Z w: O
*
2 D$ h% l* A. p * You should have received a copy of the GNU General Public License7 ?6 j* O+ m- U" ^9 o5 f9 K
* along with this program; if not, write to the Free Software
& b9 X9 ]! X: i3 U- E! y" l * Foundati
$ C2 s/ o* z' @- ], C- D*/
9 ]. }6 u- ~/ ]( m. X#include <linux/module.h>4 Y" `% z# ~/ K3 O+ k
#include <linux/init.h>
2 X% ~* a( ~ [/ T4 Q9 R1 M#include <linux/errno.h>8 y# D5 {0 V. U) g
#include <linux/types.h>
X$ B4 E" {" |1 ]#include <linux/interrupt.h>4 f6 |" |! E& B1 ?* o1 h8 U
#include <linux/io.h>+ ?+ X( E Z' G! n1 K5 Z: `
#include <linux/sysctl.h>( t! O- M) |) y: N
#include <linux/mm.h>$ L/ E" } C$ m9 N) m; R
#include <linux/delay.h>: P4 l) r7 L$ }% ?
#include<linux/kernel.h>; S/ G: h5 A- W
#include<linux/fs.h>5 A$ {0 P w! M. M) X3 E
#include<linux/ioctl.h>
' o3 O. z$ Y1 p! K7 b& e3 H#include<linux/cdev.h>2 d- v: P" D; t7 H
#include<linux/kdev_t.h>
; B0 ^4 `) b0 e6 o' i5 ~% A( @#include<linux/gpio.h>' j3 {" F$ |) |' I% O/ \
#include <mach/hardware.h>5 C- b) g, c6 p W& r
#include <mach/irqs.h>8 d" D% {, ^2 Q8 n
p# C6 t- x8 V! M% l( X#include <asm/mach-types.h># h5 a! ~6 D: g+ ?; s
#include <asm/mach/arch.h>3 u( a- K. Y/ X) n: V! M4 e( ^
#include <mach/da8xx.h>$ \$ [: {6 ~8 S- I9 R0 d* D
#define SYSCFG_BASE 0x01c14000% ^. N2 B- ^* W. r% [
#define PINMUX1_OFFSET 0x124
/ n) ~5 m+ o! z$ v: a- m#define PINMUX18_OFFSET 0x168
0 X7 X! a. x4 [! F! s( K#define PINMUX19_OFFSET 0x16c
) C, ]2 s5 O3 s8 {9 d#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR$ a0 y: n: @; a3 C
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR. ^5 b6 a; N! C- e1 c2 e) R+ h
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR3 Y% E+ d' m& m r" P" {
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR" m5 J4 X, L1 s# d$ G% _
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR2 e0 h L2 E/ T& ?' @# \% G
- i) I+ A6 ?: w" w#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
% e; ^/ t4 D2 _% p& _4 [#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
+ C% p& b: k4 d- N0 F. r/ c//PSC
8 B6 _# i. i: b" |; p#define PTCMD_ADDR 0x01E27120 5 X& y/ Q8 k) H- f
#define MDCTL15_ADDR 0x01E27A3C1 o6 t5 y, q1 V4 y6 A ?
#define PDCTL1_ADDR 0x01E273040 E0 {# _$ I1 z; x
//GPIO8 direction0 m4 E" |; P' n/ @, ~: E
#define GPIO8_DIRECT 0x01E260B0 E2 z5 y% O# g+ q! }
#define GPIO8_OUT 0x01E260B4, |( p* X3 ^7 O4 y) r0 x. Q. H
#define GPIO8_IN 0x01E260C0
3 x! G! N6 }& |. ?6 h$ z$ b
" e- Y2 H5 L! A' n1 x9 x" |//#define MCBSP1_RINT 99 # @$ r" g% R, b( D
//#define MCBSP1_XINT 100 ; b0 K/ [2 h3 |
static int MCBSP_MAJOR=239;7 \$ C3 K; X( L1 k
static int MCBSP_MINOR=0;2 _0 U; b- M/ l" f+ b6 @
static int count =1;
1 }( b' u& k7 v" ?; F0 Z( E& b. {( R+ W6 d( a2 u* N
#define MCBSP_NAME "MCBSP-device"
q* _, o- c% d* n& } D
- W) [# o; X5 b* t& ^static struct cdev *mcbsp_cdev;1 [- C' n3 I2 H- Q
static struct class *mcbsp_class;( ]7 m3 _! J1 C$ t" c. @
static dev_t mcbsp_dev;5 _, f4 M# J4 L& y% s$ X% ?
unsigned int DRR_data;6 Y. Z' t1 Y' x) R n
unsigned int DXR_data;
( _5 C, Y; a" E8 |/ D; e! b/ v( Istatic int mcbsp_open(struct inode *inode,struct file *file). E" h, [5 s5 }0 ?
{
5 W( Y# ?0 @' A" y; W5 x$ X3 T! |: Y
' Y$ K2 j5 Y9 p. c9 R* F //interrupt enable,initialized
; X8 L& |- S" {% y8 G$ m unsigned int temp;( K M* q. Q/ W) \
//SLEEP_EN(GPIO8[10])---0
+ j r) _+ R& ~$ J. D temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
. h t6 A3 A0 ], L5 B- H/ P temp=temp&(~0x00000400);
3 ^: q! H# {1 _( U __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]+ i- @- }1 A9 J
//RESETn(GPIO8[8])----0----1" K# @! `7 R; E2 B% ?$ M
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, i' N' P/ J! s temp=temp&(~0x00000100);/ Y6 M: Z# w; P, t3 o" E
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0& ?0 z# l# R/ Q' b( ?
udelay(100);
0 b4 j9 D- ^0 t9 S temp=temp| 0x00000100;9 {1 Y" n5 e" O( p0 i* f9 S
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
. g/ M5 y( K) \% F udelay(100);
/ r: v8 o$ A' B8 B* i5 {; d printk("open success!\n");) ~! t4 A+ {. n7 H* o% j
return 0;
7 B8 p: z/ b% v) r: R% p9 r) U! {}% {+ z6 x7 f( n; ]6 i7 }. F
) _2 }, w2 p6 q9 astatic int mcbsp_release(struct inode *inode,struct file *file)$ Z9 X1 g- N; t* z( E, ?+ S- r/ _
{6 ?2 W' }* U) u5 L* M3 P
printk("release success!\n");- v$ n8 t& J! { g1 m( y
return 0;" n4 K& v; |! {( p4 Z8 O7 Z) K
}4 t% i; k3 }+ r, s# R' M$ Z
7 w! y& I! I3 `* X8 @% e6 Xstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
4 ]) I8 u( d4 h: T3 A{5 ^( b9 I7 l0 {- u5 l
copy_from_user(&DXR_data,buf,len);
9 d7 g/ G+ ^" x6 E0 {( P iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 4 P9 v4 m+ t; \2 F2 v0 U) Y2 _
return 0;
+ K( f8 |+ C8 r2 M& A
8 C- U( Q+ q( O}
3 j9 X% }5 n# L+ Q: s; S) s6 ?" C
3 R. s7 w9 G8 Q B" s7 k* Nstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
0 l, F/ l; z0 S( V# Z# Y2 C8 {, y{
; y! B: G' _ _; o! A DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));7 K5 G X# B. K1 k7 g0 X7 g
copy_to_user(buf,&DRR_data,len); * Z0 y! X& o3 c; k& |; w
return 0;" B2 ]: T5 Z. o2 |7 @( u8 u7 y% \
}
. m6 O8 ?& W' Y8 U: @0 u9 r
' z# S3 Q- i7 U0 s0 e, A/ W) T7 K Q
& `# ~1 t& {, l! |! s: c$ B4 Sstatic struct file_operations mcbsp_fops=
5 o1 j3 K: w, [{# D5 P" e5 a' o& w6 ?% A2 E Q
.owner=THIS_MODULE,
4 ~8 P. s8 T* [. R% A i& V .open=mcbsp_open,; ^% B8 B$ W7 Y7 u4 @% b. S& G
.release=mcbsp_release,! D! o3 Y* y$ G2 }" o+ r0 k' @0 {
.write=mcbsp_write,
* \. N1 I5 p9 ^9 _# G .read=mcbsp_read,9 s: j6 A6 _* m# o3 P! Y; B
};/ W- }7 ?/ Q2 S, q- n( y
static int __init MCBSP_init(void)7 ]+ {; U1 e/ S, i$ T& a, s/ Y$ C
{
3 f8 X6 B% _3 ]/ o int ret;
) F6 w' }" x7 a$ `5 e+ z unsigned int PINMUX1_REG_old;
6 E4 b) R! L9 C3 T3 e unsigned int PINMUX18_REG_old;. O0 w2 ~" u5 M" }. R v
unsigned int PINMUX19_REG_old;) W0 F4 D$ S7 [0 T) ~& s$ o
unsigned int temp;
" U" f5 v) W( G5 | if(MCBSP_MAJOR)
2 v- `' C8 |1 k; b# d' a {
& x# y; ]1 \. A; N5 }: r7 z mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
8 w( A7 M, \% { ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);% E$ ~8 m0 i( S8 X
}1 p- Q. a6 k, z" {8 f. ?
else
/ D6 w& l. Q. i; C C9 r& }' t {
- Y! O q; O( E$ f. z1 _ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);6 `% a$ ` z: F4 o# I4 w4 `
MCBSP_MAJOR=MAJOR(mcbsp_dev);3 o0 Y1 O# E4 v7 w- n
}! x7 N; t0 c- @( [
" u$ |8 {* u" l+ J- f: Y
if(ret<0)+ |, W ]! I% t
{
' @( L T: P5 q printk(KERN_ERR "register chrdev fail!");" q4 Y8 s5 L+ Y5 L8 ]7 D! Z
return -1;! J5 Y) Q+ B3 w" |3 |
}
) T4 O: I4 A8 g9 t3 F5 w' K
A( h! v8 M) O: j! n" P+ H mcbsp_cdev=cdev_alloc();" u" s+ w( K5 j4 K0 m& `8 l
: W( N2 l! P8 Y
if(mcbsp_cdev!=NULL)/ L) O+ d3 V- C. M
{( H0 Q* i8 h7 o2 G
cdev_init(mcbsp_cdev,&mcbsp_fops);( @. S' |1 p# n5 v; _8 s
mcbsp_cdev->ops=&mcbsp_fops;# Q4 S9 e7 r4 e+ Q
mcbsp_cdev->owner=THIS_MODULE;
. s. l4 H+ S& L6 X' Q
/ q$ _3 x; j6 O, h( d8 m4 _ if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
. `) t4 _: D8 P; J, m: z printk(KERN_ERR "register cdev fail!");0 R) D) p1 j5 h) h
else: ~. E" V+ V5 O+ P3 y+ J, u4 p
printk(KERN_ERR "register success!\n");
: K. C6 H% s) n }
2 M! h% Q/ p/ ^3 q; T* P+ M' u ]& Q else' c1 z2 S7 Q& N1 h$ V0 h! ?6 ~$ J
{
6 J, r0 p3 ?" X0 }" j printk(KERN_ERR "register cdev err!");
. I8 d& w- m0 L# u9 a O( [ return -1;
- W& Q# A: F+ ~4 G8 U } ~* f! R( k0 [% H0 u" @- x% m
2 p( w" g/ r3 [# s
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
: i" r. h& u* h3 q if(IS_ERR(mcbsp_class))& v* M3 @1 R) b3 a a
{6 E# |9 P; z, S e1 E
printk(KERN_ERR "register class err!");0 t& U- u2 N3 h ^& @& @4 q
return -1;
; j# \8 a" n' b$ }, F }( V, ~7 f7 [- s
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 \7 }, H s U7 X; y4 A; G- _
5 s) w& n8 P) X" ^% h
//PSC. I& K8 ~+ d( P) P3 ?1 A- d
//add Enable MCBSP+ H+ i# w9 E. m0 |% o( I
//test
5 ^8 e# I3 M) j6 V temp = 0x80000003;
7 \/ R! M g4 ]! G+ k writel(temp, IO_ADDRESS(MDCTL15_ADDR));/ K3 I7 [2 d0 u" G. R$ o! n
temp = 0x00000003;
, }+ ^. h7 A; W8 f- Q writel(temp, IO_ADDRESS(PTCMD_ADDR));. _# [# X$ ^1 p2 V( M0 V! E
) N. T% L- e( U+ { _* | temp = 0x001FF201;
+ D/ f" O$ j+ M1 O9 J writel(temp, IO_ADDRESS(PDCTL1_ADDR));2 X. a9 P0 R6 ^ @) }
( n# P3 h, T7 g) X
//PINMUX
) {0 d; r+ L- S: u' A //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, Z' q, S. F, M: S) O PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); * K* b* q' A, l+ |8 w
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; \9 C' a1 r/ d2 l3 R% ?* c! J& D% S
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 v/ X; H/ \* n# \2 k$ N
1 g5 p, s3 \2 V5 [ //SLEEP_EN,EPR,L138_SHK1,L138_RC3 ^$ [7 c6 y5 T e) a: s$ i
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
3 v; ^7 I r, ~0 _7 _9 \6 g2 f PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
/ }2 h4 r; m( T% m& A5 X" a writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: J3 b3 w3 W$ N3 {
4 Z% g3 @0 [# _% c) N //RESETn,L138_SHK20 h. z2 f: ?! ] h
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
{2 `, ?4 o1 _0 q( T# b- K PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
, W* f' H1 g9 W6 M* [0 j9 e writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- d8 G; h% O8 W7 V. Z" m' s
% h( U7 t2 o. q7 Z1 {0 k4 w+ P3 z) _ & S4 k3 F) D- @1 P5 t* |
//SPCR Register. r& `4 t$ z1 A& `5 H" R+ h4 S; E
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- B7 Z) U/ N5 l$ C" n
temp = 0x03000000;//(DLB=0) M* F& J2 f% m% N! D
// temp = 0x03008000;//(DLB=1)- v2 B, _. j, v1 i; S3 V) w
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
% K; d7 ? b: @1 Z- L+ J/ G' g! ~ temp = readl(IO_ADDRESS(SPCR_ADDR));8 ]6 N8 y8 Q: ~. a# e
printk("temp=%x\n",temp);
' Z. P% f# c$ `* B) P0 v
0 f+ m3 T5 Y, E9 H //PCR Register
' _$ ?% m( c4 c) a, S //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 X- C/ V. B3 T, x! n! Z // temp = 0x00000F0F;
e7 e" k7 v5 a9 v" o9 c- C6 x temp = 0x00000B0F;
( Z1 i7 }2 Q+ x8 c# F writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
3 p" X' K) Z' a5 d) Y8 ^ temp = readl(IO_ADDRESS(PCR_ADDR));7 B E3 ` m$ n9 O
printk("temp=%x\n",temp);
& q& m/ p1 Q0 k5 [; P5 ] //SRGR Register
4 T y$ U# C/ S1 @, D5 ]7 w& a/ |! K //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
4 R8 }$ n2 o7 A* Z //temp = 0x301F000B;3 D8 C& l1 t9 E- V6 q* b& Y+ r
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
8 J3 d' Y( \- K+ y; V9 u! ?: \ temp = readl(IO_ADDRESS(SRGR_ADDR));4 |( W2 c2 h9 d3 @. q$ L
printk("temp=%x\n",temp);
! P+ u Q2 L. f) y, d //RCR
; \$ H) D H9 u& ]" } //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
3 |( i* W; f; j- U) G6 R2 H //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0. k) O0 z4 Q+ }1 @+ D
temp = 0x00440040;
7 J9 H7 D7 ~6 w# I writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
1 J7 W0 |( u8 {% w5 S0 y temp = readl(IO_ADDRESS(RCR_ADDR)); W' x! a9 Y% F3 V7 |+ o8 m. @
printk("temp=%x\n",temp);" N2 s" R7 z2 Z( E# Q2 S0 g
//XCR
& g+ m3 q& D. i7 S //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
g$ L+ |8 K& p% M+ M3 S. F //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
" _0 ^4 w. V' w; c2 z, e temp = 0x00440040;
* R5 {3 K. ~$ x5 n0 J1 ~ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
' D. O, q$ Q/ M/ p5 K temp = readl(IO_ADDRESS(XCR_ADDR));) P0 Z9 o7 b6 ]% ]5 N) g
printk("temp=%x\n",temp);, a0 W9 H9 l: N$ x# `
udelay(100);9 p' F5 g+ d2 X) O0 P
//SPCR Register
2 D! [2 ^# v6 {7 j0 x, _' } //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1% x; B9 Q) W9 T2 u
temp = 0x03C10001; //DLB = 0 VS DLB = 1! e* q8 i l% C
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled5 s' h4 R A" ?8 i/ e
temp = readl(IO_ADDRESS(SPCR_ADDR));
0 j/ S: x' } c1 Q \: q printk("temp=%x\n",temp);
3 Y$ _$ I$ E& M udelay(100);1 H& t/ \9 P2 R& u" H
0 Y) _; ^* R9 F4 d
//set GPIO direction
$ F: b8 V; g" M- W' | temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));4 H, t5 r6 j+ e: F+ Z
temp = temp | 0x00000100;//EPR----input5 s8 q/ Z! I8 F# u4 `
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
! ~" z- m+ N v( ?$ X4 P0 v __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ X+ u# E0 M7 C, d* ? - a7 K8 J) ?! L/ } t! a
return 0;" Z- q4 |$ E1 i' I& f. D
}- n( H: m7 o, [1 S
static void __exit MCBSP_exit(void)
) Z% A. K1 ]0 \( D/ d I7 o{5 Y) b6 i& J2 x
printk("mcbsp chrdev exit!\n");5 p5 P1 F R$ x2 m; h% {
cdev_del(mcbsp_cdev);) T' {0 U ^6 X* B6 o3 x! X
unregister_chrdev_region(mcbsp_dev,count); z% k6 m9 F0 {, }
device_destroy(mcbsp_class,mcbsp_dev);
, {$ P8 a9 |5 s class_destroy(mcbsp_class);
7 n, K0 ]7 X7 U- c; i& {}* c* f S6 u/ q$ l" }1 F6 \" H
module_init(MCBSP_init);" T) Y$ R, {% P7 g m/ O$ f
module_exit(MCBSP_exit);: j; T/ x8 k8 A1 K7 _
% N5 f: F9 d4 u- l2 [; UMODULE_LICENSE("GPL");
* f' d' P- R4 @5 J$ }, X( z( V- v" L5 c5 l8 l3 N
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
* m+ K4 ?1 Y2 ~5 v: a我的应用层的测试程序如下
* g) L6 j3 {- c: p r#include <stdio.h>5 O2 ]3 w6 Q8 H$ C4 I( K5 Y
#include <string.h>/ k" d/ q/ B% @- v
#include <fcntl.h>
4 K6 g' z1 |# P. Y#include <unistd.h>
2 L0 C2 s5 l+ _1 P! n, R#include <signal.h>4 H. P0 d, Z4 e& e# K( W1 C# d0 T
#include <pthread.h> //线程
$ [# X) H" H. \; m7 x#include <stdlib.h>* I* ?& `2 S& V8 z6 Q6 Q* i* `
#include <pcap.h> //捕获网口数据
/ x/ N+ M! |- B#include <semaphore.h> //信号
1 H7 |7 Q. w+ @* m# K#include <sys/types.h> //消息对列9 E+ }7 m0 S# J
#include <sys/ipc.h> //消息队列
# F$ u U0 |& x3 |; P#include <sys/msg.h> //消息队列
, T+ S3 t: U8 V( d2 E+ i( Y#include <sys/select.h>
) ^* _7 m1 e/ k0 V/ G4 s; E#include <sys/syscall.h>
8 k, @0 }; |8 F' ^. Z/ ?+ B#include <sys/stat.h>) j% D+ f# p9 p) i0 L0 \
#include <sys/mman.h>
$ R1 i: J; f6 y, s#define msleep(x) usleep(1000*x)
% W; j5 w6 x8 [+ x U$ ?' E ~6 a/ T" |8 p
int main()* N5 C! N; a+ }" J/ \
{ s$ y1 w5 e5 ]1 A
//MCBSP,ARM与AMBE2000交互设备
" s0 |+ h, |* }3 J) y& x int fd;
- E0 [; n) i- I7 f4 a" A3 j unsigned short data_write = 0x5555;
+ U2 E% q: K8 x9 ~ unsigned short data_read = 0x00;
9 g$ d6 Z% S+ q! `; `7 O& Y fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
+ j2 G, V* s" O // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);; K& b: d. a! r2 A& N' x
$ H! F$ O n. C- _! s/ J M0 @9 D if(fd < 0)5 y/ [) w4 }. I
{
( V! {6 n. T) i7 @ perror("open failed\n");% K+ n* Q; u" C5 o! m- B( k
return -1;' p# Q" r# d0 y# D1 D
}
% e0 a: V5 n# n0 Q4 K' o
& i; W2 ]8 G7 c) E, o, d! j while(1)
- N% p1 j3 r1 R @; {' }9 B {
2 l5 U* I; y" m% T' f' e( }2 X $ l9 C* I" Q! |7 U2 I
//AMBE2000每次读写是24个字为一帧0 F/ F& J" O$ p3 L9 j4 ]. Q" Y
//写数据时将数据在底层存储起来,等到中断的时候再发送
2 C2 g6 ~" F( p+ M //AMBE2000输入数据是以0x13EC开头的" E1 _" H: r' b
write(fd,&data_write,sizeof(unsigned short));2 @, ], w( Z, ^) _# x) `4 B0 P/ L
; u# `; d- _0 e% B6 N" ?$ } //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
- \0 Y4 c6 v! _ read(fd,&data_read,sizeof(unsigned short));
" H7 R* m/ \: ^) Y1 D, v * [+ y# n2 w5 ~9 Q( _5 m
if(data_read == 0x13Ec), [$ q4 o }% f' u( A* H4 s
{9 w( o: V6 x0 A) f8 J
% D* f; f, s$ H4 X printf("data_read = %x\n",data_read);6 ?1 X0 Y* X* Y- }! i
} e( O# Z9 L* m; S+ ~! h. T+ T! @0 l
# L0 P% e9 X# ?0 W, Y msleep(10);
' e m w- y6 y
( D6 s) O1 D' y /*
2 R% ]1 B8 l. b& S9 }! e I ioctl(fd,1); * V4 g3 i \/ ^% N% J9 h
sleep(1);6 Z. n1 c6 y( K8 _; }. Q
ioctl(fd,0);9 D0 a' g+ g* Z. p! d3 k# i9 A5 s# h' X
sleep(1);
- E7 l: n% Z/ [: u, [9 v8 f4 c */
; |5 X: f% L* K* ?$ y" e. N& _ } ( x4 R& L3 v3 N5 @! A
return 0;# L# \1 a! M$ z# u g1 ~- s8 D
0 X/ ~/ |$ b1 D9 o" ~" P
}. b1 p( B/ L7 y& G5 J% \
/ n4 I5 G8 N0 B
多谢各位指教,谢谢! 急
; |, a" v; Z# O& u# y
' z9 R) z2 M; o
1 Y' w1 ^( y" {# p- {/ J+ o( P0 c" `4 m E$ T* N W
2 b7 x4 g4 O3 A! _# `! v M: W( j- {2 Z- i) I
|
|