|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
# W/ `+ {) G& | b5 T/*
0 s) G" M& [" @8 T6 p * Copyright (C) 2009 Texas Instruments Inc) u- S0 ^9 g2 P0 s! `& L
*4 q5 m% B: w. T
* This program is free software; you can redistribute it and/or modify
9 _/ e" C, b: d- B. _" p- D * it under the terms of the GNU General Public License as published by
" K5 b1 Y% O0 _* U% M * the Free Software Foundation; either version 2 of the License, or
$ t% z9 F3 T9 z% y# T * (at your option)any later version.
8 @' P# u6 Y c1 X9 h! P+ _ *
% z4 e- M! M! S2 i" V |/ z * This program is distributed in the hope that it will be useful,
0 p7 `: y5 d$ o% m& T; J l * but WITHOUT ANY WARRANTY; without even the implied warranty of+ D7 r; F$ W _& J) F* r
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the7 o# n, g* N5 O3 e7 V9 i
* GNU General Public License for more details.
) B) M2 {- X2 n4 g5 Q *
l* D/ c l: u, G4 p. `% z * You should have received a copy of the GNU General Public License
4 T( N5 G# l8 D5 X- M8 m/ p * along with this program; if not, write to the Free Software
h6 k! T1 M" W F2 _9 l * Foundati+ |9 S- l! X0 M9 Y+ ~
*/! K: ^/ [5 Z8 W0 ~- N
#include <linux/module.h>+ @/ {( r4 t& j/ g$ o6 h0 Y
#include <linux/init.h>
. d7 O5 g% {4 L" s, Y9 `" T#include <linux/errno.h>* J3 a& e0 j9 p/ j" }! p8 d r. ?
#include <linux/types.h>
" R& ~: J3 f5 M/ Q% }8 Y7 r#include <linux/interrupt.h>
; p( k7 w; H" d- Q% `. f#include <linux/io.h>* b$ v) i+ t3 r& k7 F1 h& e
#include <linux/sysctl.h>7 ?& b& t5 C' r# ]9 Q
#include <linux/mm.h>1 S, y! x/ D; M) g# a
#include <linux/delay.h>
- C3 V: r) y# H0 ^' m4 Y5 X#include<linux/kernel.h>
. g4 R9 ~# v" \2 t" N4 F# d#include<linux/fs.h>* u( R6 [$ v) r1 I) S% j& c/ S
#include<linux/ioctl.h>
) \. b1 J0 i- j#include<linux/cdev.h>
1 i; b" ]: d& _# \% [#include<linux/kdev_t.h>3 e% `3 g4 z/ L! n6 J0 r0 s
#include<linux/gpio.h>
3 S C- t: z( h7 [( d7 v0 q#include <mach/hardware.h>
/ o+ H1 P) D4 E& J8 U#include <mach/irqs.h>
( o b# P/ p1 e2 i% j" l( q A& h0 ^$ G
#include <asm/mach-types.h>
7 h! b5 }+ X$ I0 E ?#include <asm/mach/arch.h>. G9 {- o* ^% R( Y9 U0 L6 t2 }
#include <mach/da8xx.h>1 I( Z5 Z; M: \6 @5 C2 `- M
#define SYSCFG_BASE 0x01c140006 j5 N, z" X8 [! M: Q
#define PINMUX1_OFFSET 0x124
$ _1 k3 _- A1 u, A- u) x0 t, `#define PINMUX18_OFFSET 0x168
2 ~+ ? C+ [9 T7 V/ B6 ^4 Z |9 k#define PINMUX19_OFFSET 0x16c
e& U; I6 l9 |& S$ D, h#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR! E g% V5 n! H3 P5 k
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR: g* C; g# q" d! j+ s
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR& h( r9 i* s: b* v7 C* M* i) r3 F
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
6 H# m5 i: H; m7 B/ B3 k& h& ]. I0 X#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
+ p& V" \8 P: r: g/ J c/ {
8 Y) D$ V! @: g `0 ~' ~6 m#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
0 F" P4 k1 j a8 M$ d#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
- b/ ]2 p$ H( H8 f//PSC
; a8 _6 k7 O5 E# ~. |( y; w/ _$ `#define PTCMD_ADDR 0x01E27120
3 U5 ?! q% C4 j, d& y# v#define MDCTL15_ADDR 0x01E27A3C" Z# ^. j. _' s! E$ ^7 J- {; n- k& j
#define PDCTL1_ADDR 0x01E27304* d+ e/ N9 v. x* z' @( c3 {: \
//GPIO8 direction. w" t2 O) }( u$ f# i
#define GPIO8_DIRECT 0x01E260B0
+ M- z0 e$ t5 i#define GPIO8_OUT 0x01E260B4# r0 O. C5 x( H8 t3 L* Q1 Q
#define GPIO8_IN 0x01E260C0
2 i0 p* f; L! c: H& Q' y6 m
& X) O4 y, G0 W: e6 `" h Z0 ~//#define MCBSP1_RINT 99
4 }" W3 o( [9 v: g5 Q" t0 {) D//#define MCBSP1_XINT 100 2 ]. [* }! q8 ]& y
static int MCBSP_MAJOR=239;+ K5 C. B4 n# _) L( Y- G
static int MCBSP_MINOR=0;% [" k E1 m5 j3 A
static int count =1;
5 k/ R# D. V6 l+ a* j; v3 ?
) `% s/ v9 B, [" g( T# Y#define MCBSP_NAME "MCBSP-device"
$ @! {' l( y4 w! C
6 \2 L& ]! I9 ~! P, P, _static struct cdev *mcbsp_cdev;! O) W" M( \: N% D! R6 o% O) i
static struct class *mcbsp_class;
1 q3 \ F! d+ m' Z: c' lstatic dev_t mcbsp_dev;
/ o6 r8 g0 P& eunsigned int DRR_data;& f9 o: D0 k2 D) m: A, i
unsigned int DXR_data;4 w, n5 }/ n( F5 u7 V$ g- M
static int mcbsp_open(struct inode *inode,struct file *file)
/ w" L# O, k n1 M$ `{
+ O: @/ j1 O/ J4 a ' u5 ?. n' f3 Y: @% W4 o. v
//interrupt enable,initialized
8 e* ^+ ^- O2 f Y9 N! u unsigned int temp;
$ b% q1 f9 X- U# }$ [ //SLEEP_EN(GPIO8[10])---0
. W/ W$ B% K. L& p) @6 G3 `2 n$ u% } temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 C$ o+ n0 H+ s, \+ c2 D: P2 W4 W temp=temp&(~0x00000400);+ Y8 o! c8 o4 e
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
7 ?# B/ e; O0 R0 B //RESETn(GPIO8[8])----0----1: t) F, B& q9 f$ W4 H6 R, ]' Z3 q. t
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));( v: q! T& O8 `6 P
temp=temp&(~0x00000100);5 z# r1 [* H; p; t- r; ]
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0; b5 K' G, Y0 u/ o; o7 O
udelay(100);
2 m0 j2 }+ }3 z1 z$ Z% c. t temp=temp| 0x00000100;
3 I3 k7 U$ s( y( ] __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
) [2 ?7 D8 @0 C. _- r udelay(100);
$ Q' ^) l( q& L( U4 U/ z4 Y6 x* J/ k printk("open success!\n");; O# Z( f, T% }# W
return 0;! s7 R) n, I: }$ j. K
}
- R) c1 S$ y4 U! p9 `5 K
: S8 L5 k* y- |% F4 o6 sstatic int mcbsp_release(struct inode *inode,struct file *file)) j# M* l/ J; i1 {6 w0 }- ]. `
{1 ~9 d+ H( u$ w+ K! F
printk("release success!\n"); y8 M" |- b3 ]' u! X
return 0;
6 q) ^4 d# V9 V3 P4 R3 C$ G5 g}
# ]; i/ }* w9 B% k: q
- a$ F& U) Y. r4 Y& r" M8 cstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ }; y& S& R- y+ `+ @% h
{
5 N! _$ G1 J1 n copy_from_user(&DXR_data,buf,len);
& {, Y h. B8 P, z iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); % [0 u( j! c; h8 Y
return 0;6 H, \5 w- i1 a! j- A6 S
6 g6 Y x% P& \0 g, c1 [}* H1 e7 R. {6 Z
, l# L% z9 _( V* C# @
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
z9 j1 L& @0 D# K8 H{ 2 D( d( Y3 C5 R8 @/ y2 C7 A0 e' w& h
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
# ~' o2 u' R# o7 P: H copy_to_user(buf,&DRR_data,len);
$ e; ^0 t+ W9 t% u- u* D return 0;$ I+ s7 Y, U/ B+ C1 S2 B# g
}( Z Q, E+ F6 k9 c; k
" P. }/ V1 j8 \4 t8 q! u5 ]% S3 l! g: z) Y3 m* z& ?
static struct file_operations mcbsp_fops=# r6 M3 O6 G2 E% K& Y% L! W
{
0 | v* |! F1 `- @- @% }1 r2 e! X, ^ .owner=THIS_MODULE,
* H! U& M$ X' N5 v0 ]. ]" ~, s .open=mcbsp_open,
) P: g/ [3 ]" b .release=mcbsp_release,
8 d8 V+ l$ k$ ~* H3 q# z2 h .write=mcbsp_write,* M" x* M9 e0 u
.read=mcbsp_read,
9 B' q, K- d/ c+ s};4 z, w# g% l5 G0 c3 V
static int __init MCBSP_init(void)
9 g7 {' ]( n, O0 v) _) b9 Z{
. k5 B1 A, G8 ^$ ]3 B* o4 Q int ret;
; o7 R0 ~0 V# F+ \* j" C% ` t unsigned int PINMUX1_REG_old;
8 N8 K3 `6 f5 ~+ Q4 @ unsigned int PINMUX18_REG_old;; b5 { L' g) V
unsigned int PINMUX19_REG_old;" j6 g3 Y- v2 c+ F5 r- k
unsigned int temp; 7 |( w% }, a5 J; m
if(MCBSP_MAJOR)9 l6 e C8 X7 @# N j
{
8 V4 X k+ F: y% z mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
3 g2 {7 F' O, M3 K4 [ ^4 t2 Q ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
6 n! {! E8 U$ A }0 ]& _4 e: H" T3 M2 V
else
2 |8 Z3 M7 P+ A8 f( c {
' Z4 R& o% D7 h9 x% C ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);4 v& z& w8 u- p1 {
MCBSP_MAJOR=MAJOR(mcbsp_dev);4 j* Q% T: @7 x( T
}2 c1 Z# H5 s: s; C
) ?% J1 N" A" l4 X" h }+ |# d if(ret<0)
' L" \5 n; u$ `4 W {
1 e& I2 K* A6 Z printk(KERN_ERR "register chrdev fail!");
% }6 y, j2 [) [ {5 a0 v return -1;* s- e" s8 Q8 `% G1 V, M$ h
}
p4 F; @. m8 ^+ X* W. Y* B+ z
. T& D4 H' i( b mcbsp_cdev=cdev_alloc();
/ }2 N2 m, l: F0 }2 C+ ?
+ s2 Y5 y2 W& y" k d if(mcbsp_cdev!=NULL)
& d( M' ~: T! p5 J2 C( R8 O {
- t6 d! Y( n0 S( Z1 e0 I! Q cdev_init(mcbsp_cdev,&mcbsp_fops);& V$ ~& M4 M5 N9 |
mcbsp_cdev->ops=&mcbsp_fops;5 W0 G$ B. v: G M, T2 H
mcbsp_cdev->owner=THIS_MODULE;( ]0 G2 O, \; w. X
& A( z+ e$ J" m' h, V if(cdev_add(mcbsp_cdev,mcbsp_dev,count))' P) z1 l$ K( w" Q S
printk(KERN_ERR "register cdev fail!");3 w: K: N- `+ ?0 X+ u8 e
else
" E6 l! E& i: s' x. H printk(KERN_ERR "register success!\n");: p3 w, J6 ^& k8 o S( `
}
! D4 U! P2 W# F4 f else, z: x! O6 ]8 Z+ J
{
* ~8 o" @) e& }7 e+ E! b( | printk(KERN_ERR "register cdev err!");( o$ z7 {; e0 x6 A
return -1;! a J8 J8 m; Y* g& W# ]2 @
}
% {' s+ O: |5 O* }0 G1 O
* v( z% A& }' m mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* d A/ F V( D, c# K
if(IS_ERR(mcbsp_class)), M$ f- U* A) A, t6 q' Z
{
- O" y: d1 n ~0 M, n1 c printk(KERN_ERR "register class err!");: O# }- s5 k- \6 {/ P0 q+ Z
return -1;
# H6 e7 B, G/ D$ T+ a) R4 k }0 Z/ f7 d2 D# y; a& ?9 M& b% s
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);3 @- v2 T7 C) B5 ~* x7 A
# E* y/ O+ o5 x6 W( l- f- n1 y //PSC3 [/ k# p r3 x: @/ }
//add Enable MCBSP
* d, r& \6 _, K' ?' B //test5 f& O' ], R7 O* M& H1 Z/ t/ {
temp = 0x80000003;
3 |$ c, b: R# B9 t writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 K& r: I1 T2 {1 L( D
temp = 0x00000003;) s+ f+ P% o* d" g" E( ^1 Y
writel(temp, IO_ADDRESS(PTCMD_ADDR));; R& K7 \ ~! k1 |/ m
+ h7 f2 x$ [# K, W% \ temp = 0x001FF201;' ]- v9 X2 j+ W, c( d# i
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 P" D+ L4 _2 z: v4 Z( M ! U3 N3 C3 E. E. e
//PINMUX % F! z+ q3 ]! F) D' [9 y
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
- Z/ t+ Q% T3 P; t PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 5 G4 x! U% M8 V1 T+ C) ?( a
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; , g1 {1 e, ?# X4 a" ]3 l
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);8 R5 o. o/ j8 |
# m6 ]# K8 C+ _+ u- k
//SLEEP_EN,EPR,L138_SHK1,L138_RC% m2 C0 j- [/ @4 Y2 P9 L
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); , \( e. Z& L7 p4 t: g4 N$ [
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
7 c/ [+ ^2 P6 q2 X; U( \ writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);5 e+ [1 X3 N: S
: g k* S% G0 z9 l0 g4 W. E
//RESETn,L138_SHK2
8 l! [5 R) u- O* E+ ~ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
9 L) Q8 l4 G) p) F PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; $ N+ D8 H# ?# Z n" ]/ }
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ ~9 |$ S" G% u
@9 F0 [5 K b' k1 S# W
6 t0 W6 V d* t( G
//SPCR Register
" F; g- {' m( ~/ N* Z7 P( J" Q: V //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
) n3 W" @5 q; }( }! u6 |6 ~+ [ temp = 0x03000000;//(DLB=0). q7 f5 U8 n: C) V2 ~7 I
// temp = 0x03008000;//(DLB=1)* Q8 h2 u! `) ~4 s' j: p! B* r+ n! A
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
\5 k' q. R O1 L3 U, ~ temp = readl(IO_ADDRESS(SPCR_ADDR));: H& z0 w. d6 H7 N( f; S T1 p$ \
printk("temp=%x\n",temp);% W# x+ }( Z% y
: q, R: `6 k# P" `& A( G' U
//PCR Register
4 ^( W1 J- j8 B1 Q% h3 F //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0& j# ^) {% b8 R* }
// temp = 0x00000F0F;. \* ~2 U/ ?$ b
temp = 0x00000B0F;
1 V; s% T% s5 S6 d writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
9 Z4 q; x( {- W! B temp = readl(IO_ADDRESS(PCR_ADDR));! d1 _" A% R% a6 t. G6 S: A1 B
printk("temp=%x\n",temp);
( P, Z1 I0 i7 Y+ N2 R8 N, f //SRGR Register/ s2 i( h) A, _8 O
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
' Y" q& k4 b, W( b //temp = 0x301F000B;/ w. H) h: z' R
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized & k, ^; N2 N9 O. H, B
temp = readl(IO_ADDRESS(SRGR_ADDR));
/ {6 i$ {3 {6 ] printk("temp=%x\n",temp);
* Y, l& K3 s% W |- p //RCR
& W7 F/ x# d( V3 y% n4 y: {' L. l //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,- Y8 Z5 m# Q8 R0 k* U
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 Y0 Q7 Q! c- [- Z3 S
temp = 0x00440040;) ^( x9 }$ n$ a0 f% v
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
{6 v* J5 c6 o; H7 a+ ` temp = readl(IO_ADDRESS(RCR_ADDR));
: x4 q1 w* \5 T5 ~6 l1 a printk("temp=%x\n",temp);
3 u6 p! }' s8 g6 _6 B: r //XCR
7 N0 ?7 k6 Z- M6 W! B6 Y& u //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
) a, a! ~/ ]( P //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
8 Q. `# ?5 z9 M: o temp = 0x00440040;) K8 R$ c b, O$ l% @
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized : E* d% D% p# D7 V- h }- Y
temp = readl(IO_ADDRESS(XCR_ADDR));
' C$ o7 R; G% e' O/ z) \ printk("temp=%x\n",temp); B3 X+ t) P$ m2 b& w) G! Z
udelay(100);) q [9 M- c/ } \
//SPCR Register
# W* q7 S. I; y //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
3 t Q+ U2 ^! U% t; R temp = 0x03C10001; //DLB = 0 VS DLB = 1
K. V* X7 v1 D, O2 T# w+ d' ~+ k writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
2 \- s/ _; X+ j! Y# s temp = readl(IO_ADDRESS(SPCR_ADDR));
8 U1 l& G8 I/ V$ g; u# j5 A# C3 P printk("temp=%x\n",temp);
0 R v& `" C0 e. _# {6 P udelay(100);9 h) S3 N, k4 a" }, F4 o9 h, p
# W4 {5 \% [& ?# u& G, V //set GPIO direction1 S M V. I1 z' j [
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));, D2 W$ J# v' Z) T
temp = temp | 0x00000100;//EPR----input, K% C* ~4 L% |# j
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output( z& w2 M( u G$ j# j
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
" x0 u$ b z! A; p) A3 U2 I0 Z
1 M) W3 A% z) H% N- ~/ Z return 0;) o1 I7 p9 y, V1 g v3 h O
}, ^, a0 |) y9 q
static void __exit MCBSP_exit(void), K9 D( ~0 E' }
{
# x5 M9 V1 G, o% T5 y printk("mcbsp chrdev exit!\n");
% [0 R) ^! B: @% [- ` cdev_del(mcbsp_cdev);- @/ @' h6 _- u6 p$ J; S0 D
unregister_chrdev_region(mcbsp_dev,count);. [# c0 A0 `$ t4 w5 B' R# V
device_destroy(mcbsp_class,mcbsp_dev);
$ h: m$ K+ c' c$ M8 e: h: l class_destroy(mcbsp_class);
. b2 E- z3 O/ {+ [ e$ d* C}7 u7 ~2 {9 j7 u! J( Y1 n
module_init(MCBSP_init);
6 I# }" ], }: Q( i6 H6 C) Hmodule_exit(MCBSP_exit);4 I5 E, w% d- D3 ~9 I+ C
. R8 M' w" C8 K) bMODULE_LICENSE("GPL");7 ~0 H) p# g! g0 L* S9 y
& Y% U/ E! d) I3 c- X. q, y我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
- W0 U% v `; S0 y我的应用层的测试程序如下" w0 P' P: q- i4 S2 k8 g( `
#include <stdio.h>
# W% [% u, F- l# }7 F' I! r. [#include <string.h>0 _9 t0 K6 ~3 M' S# ?
#include <fcntl.h>2 @& k7 C& {# S8 N" J1 Q
#include <unistd.h>$ q3 D; X+ w1 R( B1 w8 Y& S
#include <signal.h>
3 K/ B, T* K/ [) v#include <pthread.h> //线程3 \& s' K' i# r& K
#include <stdlib.h>
! }# V S2 P$ X4 H#include <pcap.h> //捕获网口数据
7 N- z M/ V" k1 _6 G% M#include <semaphore.h> //信号4 P8 \4 \' A+ G& S- D, }) m
#include <sys/types.h> //消息对列$ ~: z, Z; Y9 n) c
#include <sys/ipc.h> //消息队列( w) j6 n$ q& V9 r
#include <sys/msg.h> //消息队列
5 P, D, @4 L* Q( v& S4 d. {#include <sys/select.h>
# }) q3 l2 w7 Z( c7 c, e1 j#include <sys/syscall.h>
# ?: C% h2 l9 ?# u" }; U#include <sys/stat.h>
. z1 W' j H, X% E; K0 s$ ]#include <sys/mman.h>% O7 q# L# V; M" ^
#define msleep(x) usleep(1000*x)
! s' t6 Z s8 t! U: j9 f5 e% n0 I+ D" _ S. ^
int main()3 r9 ~( a7 W# K/ x+ I5 O
{ 1 c( F! ^; P* z
//MCBSP,ARM与AMBE2000交互设备: [$ Y# A: g9 w5 E( R; a
int fd;
P; V4 s& R4 A; K4 b unsigned short data_write = 0x5555;8 v# v: i7 V8 G: {% _3 l) q
unsigned short data_read = 0x00;, a4 ^( \% p) j1 W
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);# ]8 _" b) M) t5 L
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 p! `( k$ ]" E3 ?& @ 0 d% v& o# `3 z: `& P+ m5 [; b
if(fd < 0)
; {1 L( l/ m7 M( f9 k {7 I3 C: S2 |$ R S! X) S
perror("open failed\n");2 a. ^' V! z7 t, L! ^
return -1;% S% j" v: x7 _. H, J! K
}
! O0 C0 M% [' N+ T
# Z# f" I, h9 M# G# M' H9 O& b4 A while(1)
6 Q& g0 d3 L& E% k7 m: D1 S2 L {4 o. O& q. u+ G
3 \9 i, x2 U S: F //AMBE2000每次读写是24个字为一帧3 G$ f3 \6 p: H8 f* T* H- \
//写数据时将数据在底层存储起来,等到中断的时候再发送
, D% }3 P; v4 X' p" k+ b# b //AMBE2000输入数据是以0x13EC开头的5 N6 ]5 }1 ~; Z; j4 B) h
write(fd,&data_write,sizeof(unsigned short));3 i4 A# z0 k& Q1 c1 R
1 |& }0 ^0 I6 g5 X- K7 { //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 1 Y3 X0 V N/ J0 G+ G- d
read(fd,&data_read,sizeof(unsigned short));, C8 l$ M9 w: y8 n, @
3 x( M+ Y3 z; s. X if(data_read == 0x13Ec)
C$ ?- d$ \: B {8 z/ v9 X( Q' k' j8 O
& u$ Z$ I9 E" r, ~6 H
printf("data_read = %x\n",data_read);# j: }4 l+ {0 k0 F* i
}. P, u0 z2 w7 P2 n8 N
4 E+ {" \+ H, ]$ d
msleep(10);& F% g6 g- v) b1 {) a" q
- {: B, Y' ~! I2 `% @# e$ f /*2 ?. w" D: x! z7 T2 w1 e; e9 H
ioctl(fd,1);
. a# `- b5 Z8 z4 ]$ j% b, X sleep(1);( l( g! N% M& V) d
ioctl(fd,0);2 u: \9 D' n6 q8 i7 p2 Y
sleep(1);" e8 e2 }( ^7 k+ m3 j' m
*/ 4 _6 Z& Z$ G c% y' p+ u+ Z
} - {3 x) W3 V3 c6 F9 c+ k9 [
return 0;
! W! [% ^/ m' ` 1 b- \4 ~3 a" T- L" d
}) m. Q. R: B% X4 M
1 Y5 W* k- ~$ d A& n0 K多谢各位指教,谢谢! 急! `$ U7 o$ l: L
! ^ J( u* h$ b' {/ G
! |( y! M4 h* n k. G/ D* c9 r9 [7 y9 R
0 |! w" n) r9 Z, O+ J# V% G2 k
3 c. W" @" E# n! ]1 V: d2 m
|
|