|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: $ T# E( x1 l3 h: \
/*( p6 [& L0 \! |/ U2 B2 w3 D9 h4 }8 M
* Copyright (C) 2009 Texas Instruments Inc
- K S. Y, z' J4 { *- N' ~0 r( K4 b# V
* This program is free software; you can redistribute it and/or modify
6 |2 l0 D/ f# H5 ~- F# _' ~. D( x * it under the terms of the GNU General Public License as published by$ n; J! {9 j; N% ^& L) U# J
* the Free Software Foundation; either version 2 of the License, or+ E! u! b7 i9 N9 {" j6 x
* (at your option)any later version., H/ A+ {4 T* T K0 z# k4 x4 M
*( a- ]3 z, C, x( M9 B# {5 R, s
* This program is distributed in the hope that it will be useful,
6 q* Y/ {* l7 A * but WITHOUT ANY WARRANTY; without even the implied warranty of, z3 b$ E- v! C* y5 h/ f5 z9 s
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2 ~- V' s: l+ s * GNU General Public License for more details.
3 x) A# C* A& ]; j! P *
" _% J" ^: C3 N" F * You should have received a copy of the GNU General Public License; i% n% e; l1 L: f/ R! n/ f' Y
* along with this program; if not, write to the Free Software
" V- H0 u, I. {4 p1 ? * Foundati
8 X Z7 A( I0 H g" \*/" n6 E! |) s; [' b3 ~
#include <linux/module.h>
* @; d3 d* M& W3 ?( ^ L9 C$ q#include <linux/init.h>( _% B/ N9 ]2 D* W+ R: l
#include <linux/errno.h>
- H+ h' t3 s. ?' r# H5 ~% |#include <linux/types.h>: d& n7 p: A* y; k: j
#include <linux/interrupt.h>: P7 e, q: b6 }
#include <linux/io.h>6 ~, X9 d' @6 d
#include <linux/sysctl.h>
) s, r4 ^3 H& N+ ^4 t# l#include <linux/mm.h>6 p6 n9 p0 M. W$ X7 Y
#include <linux/delay.h>
9 N3 Y) x& L" g4 |# G* T+ q#include<linux/kernel.h>
, r6 S, \$ Y* E% P, K& O#include<linux/fs.h>, Q" v0 e8 D% f1 t/ i* F. N
#include<linux/ioctl.h>
. s i4 N S: l& B#include<linux/cdev.h>! V: k0 K& Z- e$ t$ o4 q
#include<linux/kdev_t.h>
2 k4 B' ^1 O5 @% W4 U" N6 [#include<linux/gpio.h>
, N* t% W- z% w% Z8 E& F1 B#include <mach/hardware.h>, d- y% H9 y p7 ~2 V7 {4 `
#include <mach/irqs.h>
$ \. ~9 Z( E0 t& J% _, m! P {/ J1 k* S5 C( [& R( e2 P
#include <asm/mach-types.h>2 l8 B3 {; H/ V6 ~, K" K$ k
#include <asm/mach/arch.h>
8 E; m0 T" e% @2 ]#include <mach/da8xx.h>! T8 ^* F9 C3 K; w# `% n
#define SYSCFG_BASE 0x01c140008 J& d& M- R5 s6 d2 d% z/ D
#define PINMUX1_OFFSET 0x124 ; `6 F5 @4 F" \* V
#define PINMUX18_OFFSET 0x168
) V8 g4 J- q: w#define PINMUX19_OFFSET 0x16c W2 F2 W' b6 A- p6 g# h2 g
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
5 C( r. d( z8 m! n# n' X#define RCR_ADDR 0x01D1100C //MCBSP1_RCR0 g+ L# K- a/ @
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR+ Z. s8 {3 T# {3 S M( P% H5 C [. G
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR" a$ w' m" A" `: v
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR4 {; w) S+ m& Q3 N* v0 {# {* Z
4 O) H$ ?4 y8 v2 h#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
, a2 f/ ~5 n$ `3 B7 i#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
: [* a) L+ Z/ ?5 X7 q//PSC
6 p5 j% E- Z0 n# x# K1 ~( |( i#define PTCMD_ADDR 0x01E27120 / x p! B f. R6 m
#define MDCTL15_ADDR 0x01E27A3C' W* K8 S: ^% r: ^ l8 a
#define PDCTL1_ADDR 0x01E27304
5 a. d: s! E3 A+ M, |# t//GPIO8 direction9 F$ x# ~8 R/ T; t K1 w& g
#define GPIO8_DIRECT 0x01E260B06 r) q" F; h. z* F
#define GPIO8_OUT 0x01E260B4 v C! m4 x& M2 a- E# B$ r
#define GPIO8_IN 0x01E260C0
@0 ?/ c2 c+ t j$ S
, m8 L+ f& R! i! \ W i' f//#define MCBSP1_RINT 99 2 ?# [. D) y6 D5 n
//#define MCBSP1_XINT 100 ; }* B: z0 D) D9 p
static int MCBSP_MAJOR=239;
4 b1 x( X* b1 `( t4 Z5 gstatic int MCBSP_MINOR=0;
1 O0 Z9 r& o% R+ A1 `3 ustatic int count =1;
6 R! O- o7 b: q) K- M/ T& e N6 h( j7 ?; G1 Z
#define MCBSP_NAME "MCBSP-device"
. Y* Z; S5 f+ i- k/ _
. |, g6 x: m5 u" m3 Tstatic struct cdev *mcbsp_cdev;
2 L r' G- g- D) {6 Y1 Istatic struct class *mcbsp_class;
* P$ ^4 e' j. k q: Q) R1 P m, g( Tstatic dev_t mcbsp_dev;4 X, W$ a3 E Q! d" \% |$ y
unsigned int DRR_data;
# U# o8 U9 Q7 j; f: hunsigned int DXR_data;6 V$ J" q1 V4 ~6 h
static int mcbsp_open(struct inode *inode,struct file *file)
* f: F' B* X3 ]! W{2 c' ? b/ f5 h" F. Y
. ?& |* h7 Q% l; A. h1 x //interrupt enable,initialized6 ]8 ^, U7 ]3 J: e+ a$ I( }$ k1 e
unsigned int temp;5 V/ ]5 e" A) [1 q0 x
//SLEEP_EN(GPIO8[10])---0
: d6 ], b. j( _* A temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
/ p- m$ u& [* x0 K; w2 _. H% q temp=temp&(~0x00000400);* P# C; ~+ n7 S$ V3 a8 f5 `
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]9 _1 d9 u, ]( g$ J4 o: n
//RESETn(GPIO8[8])----0----10 {" P3 R3 u4 f8 q( |( t5 W% t
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));6 E: }) ^/ s$ B; T0 U
temp=temp&(~0x00000100);: ^& W9 B# V+ b3 l
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
7 s1 b1 m9 I: r2 {4 d3 f udelay(100);; f- g3 V- n+ R# t2 [
temp=temp| 0x00000100;) g" f/ z+ a0 K( P* f9 T1 p
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
# o0 [. r; h6 I3 |# F udelay(100);
* V0 R5 _8 `7 L# M5 e p; t printk("open success!\n");" P* l+ G( k* Q1 k
return 0;, I( r8 M8 ~. |$ C0 C. T( Y
}
: E5 ?( j0 ]& ^. y/ d& ]' t
% K" C$ c$ E) V6 K- u( T2 O9 tstatic int mcbsp_release(struct inode *inode,struct file *file)6 q5 v+ a p4 p
{) W- t* h( _% r* M+ y% J& m4 C7 b+ f! K
printk("release success!\n");% P9 Z9 n$ i- @' A& I' f. }
return 0;
% o2 u5 a# G" P1 o# h) o}# W: w4 |6 D+ U5 Q" J, z6 N
* x1 E( d7 |+ }5 E2 k
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)4 U- e c) R+ q, L5 ^: I
{4 b+ O+ d% l3 ]/ _8 z8 u5 u
copy_from_user(&DXR_data,buf,len); m& C5 |+ D& Q& t7 ~* ]3 j& q
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
8 c2 D8 C9 \" v2 x) l' o. O return 0;, i s, f+ t/ ~5 P R' M! y, b/ z M0 \1 N
, q- y2 s: I6 u: l
}
4 x, h% }* g' t! u. k0 A& h- {9 G+ ~5 m% l+ w. T6 o# l2 j
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
4 p C" ?, w {# }{
7 P" E$ _2 k3 i DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
* b e4 ?. i. p4 r copy_to_user(buf,&DRR_data,len);
$ b$ p) |+ e; I/ R return 0;
: c$ A3 L+ j1 K$ q( H& W}
( R" d& h! X; U2 u
- U, i0 N9 ]" K0 h8 V1 A. h0 T; n5 @3 k8 O. H* n3 |
static struct file_operations mcbsp_fops=. B& U" o5 s3 z* p) P& `
{
4 P2 g8 `2 X$ c1 ^0 m- Z/ Y; j .owner=THIS_MODULE,
) m4 F8 C8 a9 H4 }! L .open=mcbsp_open,8 e- |5 g/ h( r' H$ x2 c* ^( ?+ F5 `
.release=mcbsp_release,
( L+ }: e7 k; k .write=mcbsp_write,0 j9 c; t3 T* o# h9 Z
.read=mcbsp_read,. b. Y) @8 \/ z) h4 U# _1 D
};8 a: u& ]9 r* r
static int __init MCBSP_init(void) w& l. Q$ |9 {2 \+ c- s
{0 I9 ]; L: f, R8 E3 J) ^9 h
int ret;& J: C6 k5 a7 X9 x4 N, X" t/ z( L8 o
unsigned int PINMUX1_REG_old;2 A+ r" o6 Z, `7 z% T
unsigned int PINMUX18_REG_old;) L0 l& D8 Z. j
unsigned int PINMUX19_REG_old;
9 Y4 h; o' _& N2 Y6 a unsigned int temp; , @+ L4 B, { j; L
if(MCBSP_MAJOR)
! e7 K5 I% \0 R5 ~- r# w2 h0 X ^ {% a. `( z/ W; R4 @5 D. g, ~4 T
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 {& z; H6 Z8 J4 }4 S; H
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 f; A8 f1 u6 ?8 P! _0 `9 m. F
}! g+ c) p- a% g4 R& R8 O* Y
else- @1 V. {/ s) T( G' w$ a
{
8 U2 ]5 n) T) i2 o: A, s1 ?* Q ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);2 D( k. `# k$ b( q# ~& Q
MCBSP_MAJOR=MAJOR(mcbsp_dev);
/ g# `5 L7 m! S' w }4 Z1 h" J1 o& V% `- p$ q
" J! l8 u! w, V if(ret<0)( W% n8 Z' u7 V! X2 d1 L' w( }
{
+ T' X6 T& t# ` printk(KERN_ERR "register chrdev fail!");
5 u6 R, m+ s9 t* m4 D return -1;
3 A; C7 `8 X5 B1 N( p }
9 _0 v" N4 Y! e% O% M/ l! _
* h, v# g% G5 D% q: U! H( q0 a mcbsp_cdev=cdev_alloc();( ^7 Z* C( F" N' W
% v1 s) M3 j% |# s+ Y e9 ~* y if(mcbsp_cdev!=NULL)% L. E1 }/ M7 L- I8 k; k
{; H8 \) |& H* b7 q$ v: k
cdev_init(mcbsp_cdev,&mcbsp_fops);
. t0 ?9 C% x# V: v0 d, g mcbsp_cdev->ops=&mcbsp_fops;+ x f- G/ n2 Q+ g9 [& c! R
mcbsp_cdev->owner=THIS_MODULE;
; X1 T! C1 P. v, [9 m
" t0 r; ~/ B6 B+ j: x if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 e3 W' P' X( T0 B& E1 n/ \ printk(KERN_ERR "register cdev fail!");
! z% @7 U2 R" ?2 q$ V9 A else Q- b! k5 G' b
printk(KERN_ERR "register success!\n");' N: T& C; v8 O- v% d% D6 O8 J
}1 l+ x4 C8 m1 f
else
$ R1 \/ [" P' u+ Z( H {3 d6 Z, L8 j6 j5 _0 }/ b
printk(KERN_ERR "register cdev err!");
: ?) Q! k# A: }! J" t return -1;6 v1 U, N# Q1 D+ j
}% B" c4 _7 @7 r) P
( }/ M: A; [ F+ k5 T
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ ?( m6 M- z/ H; { x
if(IS_ERR(mcbsp_class))
- S, p$ n1 i x5 n, @. M {
. X& N% Q' e9 ~% u& c: _( G: K0 V/ Y printk(KERN_ERR "register class err!");0 n; O6 q+ j. ?" l- g: e1 r5 A
return -1;
% n0 C$ W4 b: l2 E6 P }
; ~) M* @- a# E6 F* f! f device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
! P; b5 H3 X% ~0 V; f/ u$ Z- ]# {# ~. r& w. ~
//PSC
5 s' h6 Z- f7 x+ S; d$ v% _, J //add Enable MCBSP
0 W1 U( u; L ?* @) ? //test
" a! |0 q" f$ S8 e7 q/ x temp = 0x80000003;1 }/ H3 O& g; e! U0 x3 r
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
+ v Q8 } D7 S6 V. G0 g temp = 0x00000003;# @) J# m. t2 `$ I# p
writel(temp, IO_ADDRESS(PTCMD_ADDR));* b8 c) y' ]; b( H- g2 A3 _
: @' H2 d: [* Y$ P0 R
temp = 0x001FF201;
) ?$ J8 J6 c- U, z- q4 S) W* Q$ W writel(temp, IO_ADDRESS(PDCTL1_ADDR));) t- o, O8 V; r0 ^+ l' I: @
; e5 p: w9 L. H; f) H) j0 M$ ^$ b //PINMUX 4 X8 `% Y& V; X( C. Z/ G
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,$ }8 V2 N& c' r! H0 _) y, w
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); - {! _, N' ]; l, ?$ Z2 j
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; & ~7 y$ {' Z3 Q
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
! G; T z9 A0 F
" Q) R. [; A, L" s# x7 |( ~ //SLEEP_EN,EPR,L138_SHK1,L138_RC" P0 Q) t6 J& a
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); $ @; U$ m$ q8 F1 C, Z0 {8 d
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; + Z n' U# _, L& j
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) J- s. g1 k9 l5 z
4 y- c# j0 S0 Z //RESETn,L138_SHK24 K/ n# ]0 I7 U2 W# i
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
E" c$ r% l- c A8 K# Z PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; + H4 `# d6 I4 C* q8 d+ d+ ^0 g
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);# M4 K! ^5 Z ?
" T. m" s9 F' ?( P: J# y( k
g1 t8 O; }4 {0 g6 Q; W7 d! V* M4 f
//SPCR Register
# D6 M- v" V) j; a5 m0 h# ? //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset4 O0 h+ I1 e8 [" N
temp = 0x03000000;//(DLB=0)* F2 f- t8 b; `" A) V) }
// temp = 0x03008000;//(DLB=1): V/ X1 N; H. F" S
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset+ j Y/ {, j6 G+ U
temp = readl(IO_ADDRESS(SPCR_ADDR));
, S( J) {. s! p; w+ i printk("temp=%x\n",temp);
; }# E0 O" F) B, i$ l1 [3 g/ }+ C$ b
0 I% Y2 g+ F% n ?6 `" K8 A0 G. H //PCR Register: f) \' O. p- {; t5 z
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
& y7 |1 @7 Q. q // temp = 0x00000F0F;
( t& ^: J* K6 L temp = 0x00000B0F;' J" T, ]) b* O0 Z& a8 z! X
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 8 b7 o% n+ W3 o" O/ L& ^
temp = readl(IO_ADDRESS(PCR_ADDR));8 H* f% `; }- G( y
printk("temp=%x\n",temp); * |2 g$ c) q1 `
//SRGR Register6 ?, [" ~0 v3 e8 E" g
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11' X7 { z% B: R* r. b/ V& ?3 j
//temp = 0x301F000B;
& ~0 b9 V4 C% g l8 m# v& B b writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
6 m+ G9 F2 @8 E, F+ d temp = readl(IO_ADDRESS(SRGR_ADDR));
' @5 `: ^) H* X printk("temp=%x\n",temp);- @+ p8 b) f9 G
//RCR G/ W. t" s5 C7 ^6 T# u4 h) v
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1," b- J. g3 s8 @. k5 b3 C" U* m
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
1 I8 o' d+ g0 K temp = 0x00440040;
# M' K# X/ X. ]0 J# b8 x! E writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 1 ?- q: { O8 A/ l! t* g
temp = readl(IO_ADDRESS(RCR_ADDR));
+ Q& w# E8 x2 R% H printk("temp=%x\n",temp);
9 R" y6 P. F0 _8 G! U( [- a | T //XCR
+ @' @2 H$ F; f% H/ s/ ?5 ] //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1* ~& A: u) @; G4 ^0 C4 C* g* P
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0/ b( f/ ^5 u5 H8 O6 ^
temp = 0x00440040;
& p7 D- L- W! L$ D" Z7 }5 q3 y( h4 [ writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized : l2 p' B( [" B) P, c& H+ h
temp = readl(IO_ADDRESS(XCR_ADDR));
3 U' ~$ [" @' l% I1 p0 }. |: A printk("temp=%x\n",temp);" [% {! h9 l& ~( v$ J' [
udelay(100);6 C, `. g/ W: Y0 Q$ `) U; h
//SPCR Register
+ \2 {( t3 L3 Q w' e //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
/ i7 y5 ?6 V. S6 Z, c! @ temp = 0x03C10001; //DLB = 0 VS DLB = 1
4 n f$ b* w% B# z writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
: a2 f+ `& z4 W7 Q( B temp = readl(IO_ADDRESS(SPCR_ADDR));
" x7 g/ I; k9 Z& _7 a: e( J printk("temp=%x\n",temp);& t4 k" I0 t8 x' l& r
udelay(100);
9 p, e! b- d1 w6 t( M" {' j/ L+ |; S7 O+ ]# N) c
//set GPIO direction! K0 A0 R# _! h/ \' f/ r
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));) z6 f9 K; d4 d; j, r7 l. ^: v
temp = temp | 0x00000100;//EPR----input8 w2 F! ?5 s$ O: V$ e2 b
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
/ p% o" U4 d0 K" w8 n5 I __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 2 W8 X0 V5 {9 g5 p
+ A! W a4 f% D. H# q8 C6 Z3 o. }' K return 0;1 Q F) \7 {6 y) `/ B4 g/ e% n
}
/ \0 A& l D6 r- l1 X1 `static void __exit MCBSP_exit(void): ?4 G* n4 t/ f
{' T m# Q) Z; A1 i
printk("mcbsp chrdev exit!\n");* J% [( H. b4 r$ W" _
cdev_del(mcbsp_cdev);# f- d( N f- E J- f. t
unregister_chrdev_region(mcbsp_dev,count);8 L, v* K6 Q% e) x! I: x
device_destroy(mcbsp_class,mcbsp_dev);* ^# \( ?6 b/ P( ]
class_destroy(mcbsp_class);# @6 A; {: w# G* Q6 ?) O
}- ]5 L' J9 } p0 H* N
module_init(MCBSP_init);! l& P2 Z: J ~0 B. c( n
module_exit(MCBSP_exit);
( X: p. l7 O1 l5 q3 u
# s8 ^$ ?* v( NMODULE_LICENSE("GPL");
+ e' H$ S8 z$ i6 j
% B2 v; X& J- U* N4 ]* Q# {8 _) J我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。6 x) A; H0 V& @. [+ }
我的应用层的测试程序如下5 _6 b2 i. S% j
#include <stdio.h>
' R( I s9 b4 e' v0 f" v- k#include <string.h>
1 G6 O/ q+ _( Q+ w#include <fcntl.h>
6 ^; K! n0 |$ p+ @# t#include <unistd.h>* ?- H7 }8 E4 W
#include <signal.h>' h) x2 @ \: w4 R$ @# K* u
#include <pthread.h> //线程
6 \6 m! i# u9 M% S: F5 {- t+ ^. Z) E' q#include <stdlib.h>
- K: K! N' E6 g) H+ w* N#include <pcap.h> //捕获网口数据2 w0 d$ K1 V9 e0 ?( G! Z
#include <semaphore.h> //信号+ ]8 I; o* g) _# s+ H
#include <sys/types.h> //消息对列6 `6 y5 n+ _2 {2 F. T
#include <sys/ipc.h> //消息队列
3 A1 W, [, `3 R! K2 \ D% L4 @#include <sys/msg.h> //消息队列
6 C8 A6 J6 W6 F1 p- ?% C! F#include <sys/select.h>
; n9 E" i! w* M) b e8 x#include <sys/syscall.h> E9 \! N6 }4 n, @
#include <sys/stat.h>
3 [4 P* f+ U' g) m4 f2 B; J8 ?#include <sys/mman.h>* B. k, K0 D! r- `
#define msleep(x) usleep(1000*x)5 u! T# C6 Z3 \2 W
, @9 c( d" S2 X/ {" H4 O& d5 L- uint main()
t: B0 C; S; N7 w7 [{
' g" n- q9 S8 z //MCBSP,ARM与AMBE2000交互设备
7 g9 o6 u, g3 J! K1 u8 ~ int fd;% a6 _' f! M3 G0 Z9 Y
unsigned short data_write = 0x5555;
9 O0 L) j) O6 q/ [9 f' K unsigned short data_read = 0x00;2 P7 {- i9 q U: J9 v
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);5 H4 @* [! z. n$ j2 {0 y( S" c
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 Z7 p: u; k+ a. Y- L, ]& L& a
) Y* Q7 V+ x& {. [' u if(fd < 0)
: [: l; x Q7 X* L9 W+ |8 v% ` {
5 g1 w+ N" F$ y0 y) e9 w perror("open failed\n");
# f& K$ b% f6 J- d3 o return -1; I/ H# S y# Z# b6 _
}3 A I& u/ w E4 s
0 q- x. t% d% k$ r, N3 Z, L5 J9 z
while(1)
6 |8 T8 t6 u1 n( q! @ {" B" Y" y/ r7 O ~1 j
% |. M: T8 V4 t* g+ y' r //AMBE2000每次读写是24个字为一帧: Y5 m& B$ ^) B( Q; R; k& \ Y
//写数据时将数据在底层存储起来,等到中断的时候再发送
' _- }6 I$ H& o# L5 r+ L //AMBE2000输入数据是以0x13EC开头的5 R$ }# s8 M7 @( Y3 v0 K
write(fd,&data_write,sizeof(unsigned short));
. z; N- u; z( F$ p5 \7 t' t) b. i
- `' Q& I" Z% M. r- f% w //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
( r5 X ^- A/ w! T% j Z+ C% T read(fd,&data_read,sizeof(unsigned short));! |5 \6 v6 ]# T& j" A, x5 T
" q* `/ ]3 v! O: f( a0 v" s5 e
if(data_read == 0x13Ec)
E! ^' t# p- y, t+ }3 H {( h0 Y$ V3 V1 o3 A. X1 ]/ @
: h" {$ I- D& X" d& g2 A" g printf("data_read = %x\n",data_read);
# x+ J8 }- D( T% e }
3 m7 _0 z9 p% h. U0 O$ u
# Q6 u; Y1 V& z/ w) B+ ~' O$ M msleep(10);
: ?: Z0 @. \/ H. ~! ` " o7 C( L( l* h3 d( T1 ^. M
/*4 d/ Z- J- q5 S' p
ioctl(fd,1);
7 }) C3 b& X& l2 i0 y! n1 B sleep(1);
3 E y6 L! {, ?# C! r ioctl(fd,0);2 F* w2 h. M. A3 a+ j; \8 W' r9 t
sleep(1);
" w; G& w+ J5 u% U */
0 M/ T+ V6 z$ N, u) b }
" I4 A; h) {8 q5 u, A6 ?3 L return 0;
( y4 Z) t9 ]) f3 j" k7 Y 6 ~" z1 M2 j1 U, ~
}! E. {9 O* e Y; {0 I! D* u
+ r6 J. v7 l0 [" y4 v多谢各位指教,谢谢! 急
! k ^% l2 v4 J# i
5 A, r1 t' _/ _4 J3 D$ V' w# A. `7 f$ a& L/ i* y
7 p' m2 v% e; z' y
; F+ C8 k4 z( X# R) q' g$ [
* T$ o7 l, o/ W9 f" m; Y; I |
|
|