|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 4 C. R+ `: f6 k$ ~7 A
/*
9 B7 e' T1 T* X# i% Z * Copyright (C) 2009 Texas Instruments Inc
z8 b! @% \( b& U- H0 \- x! G *
" `) f2 N; o7 H. Y) n- _9 N( E# w * This program is free software; you can redistribute it and/or modify; u# `: |. z1 f4 |3 N8 u+ i
* it under the terms of the GNU General Public License as published by
& c) {- x4 ?% L$ {, \& ` * the Free Software Foundation; either version 2 of the License, or- I b* Q1 ?# h; _$ ]3 D
* (at your option)any later version.' y' \) f7 S' c2 |
*' C5 x* L x Q3 C& l2 x) N8 r5 X" B
* This program is distributed in the hope that it will be useful,5 h, m7 w0 P) ^
* but WITHOUT ANY WARRANTY; without even the implied warranty of& D a5 j2 ]8 s& n1 S- l
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the$ {. c* u: O( f# D/ L* Y2 z. W$ W' J
* GNU General Public License for more details.( G. z) a5 H7 g9 i7 B; g
*% K6 [0 z9 B% ?8 }" M2 U, o
* You should have received a copy of the GNU General Public License# X# u7 L1 k n/ _" E6 p9 y9 K( N
* along with this program; if not, write to the Free Software
# {# W! e" ?6 Q# u8 S6 I' v * Foundati
! R8 W: @, h8 K* N: Z& w6 W* M*/0 \8 r" X+ ]) K2 W% t# z% S6 M0 V' Z
#include <linux/module.h>2 I: { b8 \- n7 u8 r& ]/ c
#include <linux/init.h>
8 T6 K, e( O' h; q#include <linux/errno.h>$ M! V; \4 J+ d; P& K" c
#include <linux/types.h>2 J0 D! j7 _* K' m2 b1 l
#include <linux/interrupt.h>
" W% z9 E" p Y#include <linux/io.h>
5 ?3 N# j$ O* R- E' ^$ n; `#include <linux/sysctl.h>
" i: Y ^9 j7 j: i5 }) Z5 C( I/ U( ~#include <linux/mm.h>
4 B, c3 A0 }; M#include <linux/delay.h>- @1 W3 M; l( s- M
#include<linux/kernel.h>( z% a) q) u! G/ N3 S' @) D4 e
#include<linux/fs.h>& T# y; d3 I7 G& w( p
#include<linux/ioctl.h>9 R4 [6 T! o/ |% A: \; z
#include<linux/cdev.h>$ t2 @- c8 l* R( ^
#include<linux/kdev_t.h>
& g& y9 y. R7 y+ \' f8 R1 s: J#include<linux/gpio.h>
5 }4 V) U, ^& v* Q9 A* z; ~* o#include <mach/hardware.h> d4 H3 H) s5 ^7 M- w/ A5 j
#include <mach/irqs.h>7 e4 L3 m" }- H7 K4 w
3 |/ q/ ]6 u$ S2 M#include <asm/mach-types.h>6 y9 P% Q( J$ y6 R X( ~8 h
#include <asm/mach/arch.h>5 c3 z; E2 b7 v/ ]5 j
#include <mach/da8xx.h>4 c& G$ u3 [% ~6 B# \# N* r7 K, @
#define SYSCFG_BASE 0x01c14000* a# f9 e8 W2 R4 F, o
#define PINMUX1_OFFSET 0x124 $ k5 ?$ E9 n; L1 j7 _
#define PINMUX18_OFFSET 0x168
+ d8 I5 r2 r$ ^#define PINMUX19_OFFSET 0x16c
+ `; v( W/ O& ?; I: P' G6 M#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
) @% }8 z1 ?, N; O5 n#define RCR_ADDR 0x01D1100C //MCBSP1_RCR" {' s- H4 ~: x1 B! u) T0 {
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
; W+ |6 L2 k- x! p#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR9 U. B& G5 Q+ x, {, t% Z
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
4 ^/ k+ P+ k8 \) P5 p s" n
" O$ u' m. \( X l#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
& g/ n; h! i4 Z" B5 B$ Y- q#define DRR_ADDR 0x01D11000 //MCBSP1_DRR7 W- w5 H3 F# R& y5 u; y$ Q
//PSC
' W( T, f5 B: a8 M7 ^1 k0 l8 r#define PTCMD_ADDR 0x01E27120
$ @8 C% d: ?/ A#define MDCTL15_ADDR 0x01E27A3C3 u3 v: t- `9 f3 u5 b& ~
#define PDCTL1_ADDR 0x01E27304
4 U8 a& V2 G6 L" T2 ]! {: Z//GPIO8 direction
1 W5 I7 u' A8 R) `2 e#define GPIO8_DIRECT 0x01E260B0% Q! }' f# C$ [8 C
#define GPIO8_OUT 0x01E260B41 J" \! D( [2 p1 W$ x/ z0 k
#define GPIO8_IN 0x01E260C0' v+ {+ \0 T$ J, }6 l* i
' j. H: m. N, I4 }//#define MCBSP1_RINT 99 ^3 v8 q% V$ Z1 |
//#define MCBSP1_XINT 100
: p4 V0 o ?+ P9 e- Wstatic int MCBSP_MAJOR=239;
- _1 c0 x! M- @. u) Gstatic int MCBSP_MINOR=0;
0 u: B# M# M: f; N; ]static int count =1;
) B5 t$ M4 \; w. D0 X/ k! W. F7 h0 ^* o& d" Y& t) z S, j! N
#define MCBSP_NAME "MCBSP-device"
7 |0 S2 l3 @5 f6 w
' z. v- x" Y; ?1 bstatic struct cdev *mcbsp_cdev;
7 a% R. l3 d w6 ^, O6 h! K3 ~9 N! U& {static struct class *mcbsp_class;" N! g! x6 u. {5 c" ~) ^2 m
static dev_t mcbsp_dev;
# s$ U* Y; l4 _4 L6 Iunsigned int DRR_data;
9 n; `4 c- D3 ?$ L8 o; `' runsigned int DXR_data;
6 F. f: e7 \( b2 D2 Tstatic int mcbsp_open(struct inode *inode,struct file *file)
+ T9 ] X4 A P{
) |3 |6 J/ j- r% U* b4 p
}; j7 R, H9 e9 J //interrupt enable,initialized
! h- S; {! k9 j( a8 _" ~( u unsigned int temp;+ t* Z" G& e6 Y9 M0 L/ J4 z+ G
//SLEEP_EN(GPIO8[10])---0
{0 ]/ a9 N% B) P/ A6 s temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; C/ V* e5 _" z' ~4 F) L, \
temp=temp&(~0x00000400);) ~2 X9 e8 D f5 W2 O3 V
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' ^# _! o# F. P
//RESETn(GPIO8[8])----0----1+ N( q! Z2 v: D& _! \+ E0 d% l
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ ^9 J# u. @. G0 \ [+ h temp=temp&(~0x00000100);0 e5 q/ J7 [5 i) q# ?8 X
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---05 I, ? b- o( p
udelay(100);3 }0 H! p( t* b2 V7 |
temp=temp| 0x00000100;' g5 k8 L6 ^& x/ a5 y
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
5 J9 r! Y% D8 H. g$ o" I3 j$ m udelay(100);- t0 z0 N( E5 ]% g1 j
printk("open success!\n");! t$ Y9 R& V+ i/ x! I
return 0;
8 t X: f" J2 @$ \# X \& q}+ ]1 {8 |5 Z- C; ^3 Z
- T+ k/ h1 n) z4 `+ `& l
static int mcbsp_release(struct inode *inode,struct file *file)8 X/ Z: Q) |0 z; c1 C9 f
{
. M L# e# B, `+ O; @" x printk("release success!\n");
6 R/ x5 G. F! L: ?" C6 F return 0;3 p8 t4 H3 [" j4 W! i1 ~
}
* Q5 u' [" j. K+ |* i
g% n' Y! K$ t+ ]/ c& v. Mstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)3 m$ U* v( f& [
{
+ Q. o$ P3 J1 V ~ copy_from_user(&DXR_data,buf,len);
; f( q( d, s" F( w2 y) o5 |- | iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
" P8 T3 k1 r6 q( D+ p$ y return 0;2 v4 \' q$ t8 D' X' {) l6 K, ]' P
I, _, P) G W8 _5 d* z; p
}
0 ^: M' x% ^. F& j! n I. @6 f6 P9 K& @8 ^: S o* `9 E7 q1 K
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
; J O3 |7 G: u P{ 7 t$ h) K; W9 z6 C5 Z
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) B, {5 _1 D0 Y% Z' _ copy_to_user(buf,&DRR_data,len); , J4 ^+ R3 P! Z' b
return 0;$ A3 L; M# A0 d- y8 R, V
}: |( C* _0 p1 X% ]
+ W5 B$ n6 I/ G* @ w$ ]( w2 q) g4 S a+ _# n9 H* o' \- O
static struct file_operations mcbsp_fops=2 m# j9 F( a8 `6 I5 _
{; U( @; C$ E q* F$ u( W
.owner=THIS_MODULE,
1 e* [- \, C- h: Q0 m .open=mcbsp_open,% v$ w2 M: l4 F, |
.release=mcbsp_release,
7 L+ v' ~( L2 U$ c G; g/ S .write=mcbsp_write,2 w* R0 D, c. k0 o
.read=mcbsp_read,2 M9 y; x; a2 x* x1 A
};6 E4 L0 ~$ w3 c
static int __init MCBSP_init(void)
) E. O$ ~9 Z. ^3 d$ b. H{
# R: b" Z6 ~4 V6 d int ret;/ l% U1 z( n2 k9 Q( p: z) M2 y8 r# f2 O
unsigned int PINMUX1_REG_old;: d5 \9 ]8 |3 Q! N* D" q
unsigned int PINMUX18_REG_old;
5 X5 L6 {) v9 g d$ J unsigned int PINMUX19_REG_old;
! _' }) x7 K$ e8 b1 r# z unsigned int temp;
5 R4 B; y# O8 d' o5 i) K% X if(MCBSP_MAJOR)
2 b) b0 z8 e$ }' q% m- U {. |. O8 s3 L8 _5 i$ _
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
$ f% h. |/ X% ^+ r" S; x ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
# b/ ^/ c; [* _5 l, B7 I" v3 P }
, H7 w$ J7 o- Q5 F1 k else% p; z* I7 t( h, e `7 u
{2 N+ X. {1 T7 j) ]
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);$ D" z3 _8 B. g" z% h {: r- U8 C O
MCBSP_MAJOR=MAJOR(mcbsp_dev);
' e7 n$ I3 _; g }9 H' y6 ~4 O# v4 {: x4 o+ n
z; v4 |/ C1 j! v5 O* R4 X if(ret<0)
6 G0 |* M5 z% b, [% Q$ K {
4 K2 Z5 P& U- w# H4 r printk(KERN_ERR "register chrdev fail!");
. Z) h/ P* O+ W+ m6 x4 q: P& v return -1;1 {0 p' i8 O2 r! l
}1 L! b6 B; C& r: r i
9 Z4 |( B) `; l mcbsp_cdev=cdev_alloc();! O" A2 y' i7 h& r0 ^( H- D
9 }' A* ]$ Q8 b4 P if(mcbsp_cdev!=NULL)
- j z6 j6 Z1 K2 r) h/ I! q { {5 h1 R; P8 g. i" q' ?# W3 A
cdev_init(mcbsp_cdev,&mcbsp_fops);# E) Y, o& I! m2 n* k3 q
mcbsp_cdev->ops=&mcbsp_fops;
3 B8 U' q# P: Q% V mcbsp_cdev->owner=THIS_MODULE;1 k/ j# ~3 c: @1 _
1 M) c. A) Y- q
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# M! m1 F' Q" V9 T) ]$ z
printk(KERN_ERR "register cdev fail!");0 @' T3 M* Y, D
else
, F8 W9 a" S& E8 Q printk(KERN_ERR "register success!\n");- d; _& [: H; L L/ N3 F" h
}
6 V4 c4 u* d& B else
' G! C6 _0 h; n4 K, D4 D- Y0 o {9 y3 G$ f# o' m X! a1 j! f
printk(KERN_ERR "register cdev err!");
5 h) b; h' m1 E* _# u$ j return -1;
$ U# I) H% d0 u. s. { }; S5 w# d! Y4 Y6 E
, A. y! N8 b( T P' q
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);* {1 |' }8 ^+ g% \) v
if(IS_ERR(mcbsp_class))
% S9 y3 s9 U, S) y6 I {3 }, z4 M w$ E2 D/ b7 J
printk(KERN_ERR "register class err!");
5 H3 ]) a& _% o q$ a3 [! D& u! T) U return -1;3 i, E% ?2 D$ G" _) {
}
# H2 v) u6 T) m- R3 \8 y% Y device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);- O+ i- b7 A2 J; e/ |8 e3 D: C; O' U
3 V z) K- S" N //PSC
9 I1 @2 [; u$ j //add Enable MCBSP; _. p4 f' y, F2 ?" Z
//test
, ?5 ?$ c. O5 g. h2 [ temp = 0x80000003;8 Q8 i* V9 p/ @5 w. V @3 _; V
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
o7 _' N8 n1 R% O2 a: L- i5 T* y temp = 0x00000003;
3 q/ b" G- O q9 E* }0 L3 b6 } writel(temp, IO_ADDRESS(PTCMD_ADDR));: G+ ^) ?7 z% h. K, [6 |- z
4 _( C" i! ]% X1 w, c8 [& r
temp = 0x001FF201;8 K0 t2 D% q, X0 b- k
writel(temp, IO_ADDRESS(PDCTL1_ADDR));) h3 x; k3 P7 X1 B4 x+ z8 K3 E
5 u. q) N, M! c, g //PINMUX
. _) |. i+ i0 v: k) \ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
3 [' [% q* U" I/ E9 a PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
0 x. N5 U& s- i! F# Q, k PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
, f" S* B2 G# m# S% a6 y5 J writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
9 x" C9 c) J; F% b4 j
" ?9 J7 x+ A' h; A% o1 Z5 L //SLEEP_EN,EPR,L138_SHK1,L138_RC
8 L( D* R# P9 f- u PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 U7 u) K6 R) D, L PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ( u* W6 u! e% C) s. [6 m% M
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);4 w1 \6 L; b- X- i- ?9 q: Z
& Q0 \4 p) J0 t2 g6 s6 r/ Z
//RESETn,L138_SHK2
4 s2 k% V* L1 G PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
- b1 o% X# A/ G( e- Z; e V PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
5 ^- v$ N3 b* n. x: ?3 e writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. X5 T3 y8 _( W% X
' h6 z0 T' }: S9 T, } 7 [: J4 ?: N$ P1 k! b- l" ^ R
//SPCR Register
" `5 |7 H3 R0 n \& v //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset+ J* e; }7 J* }4 h3 `" q
temp = 0x03000000;//(DLB=0)
' y0 J' Z. H; [: S( ~ // temp = 0x03008000;//(DLB=1)
) A) ^7 H4 X) D7 J4 m3 i- O# M2 L writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
; }$ {5 x) [1 P- T4 J y temp = readl(IO_ADDRESS(SPCR_ADDR));+ [* R& s% c0 f
printk("temp=%x\n",temp);
& N: v) i; N, j# K # r# x' ^ z1 @ @& t$ U
//PCR Register
% k4 R6 L" p* f9 u8 q; ~, p4 P //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0% |+ f* `) ]7 l5 i7 j/ \0 @
// temp = 0x00000F0F;
}2 M x( Y# ]$ D temp = 0x00000B0F;! o9 u! _% d8 r) I/ `. w2 X
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
A* ?- \4 W: B9 ?# A# Q; F/ E temp = readl(IO_ADDRESS(PCR_ADDR));! S0 U( \& _7 v! Y! Y# ^
printk("temp=%x\n",temp);
( X1 D+ C1 L; b# K- h //SRGR Register+ L7 ?3 [$ d, x2 ^6 V
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
( _( L8 _5 a8 ^8 E# _& v //temp = 0x301F000B;
5 y% Z- p7 A2 T8 v6 g J writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ) T9 u* K! x3 k8 q" U t& F3 F8 s
temp = readl(IO_ADDRESS(SRGR_ADDR));
+ k! n/ b& G0 E6 z) R) O9 ^+ ` printk("temp=%x\n",temp);
0 F0 ?3 [( s! O* G //RCR3 o6 g+ K) u8 P; i- r1 A" F# d
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 M! V& c, F2 w( I" k& H //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ E& J1 s4 y' a# u, G temp = 0x00440040;( t% N m8 P# T4 w- @ e7 Z8 i3 L8 d4 a
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized " V9 ]5 G. j) p/ z& u: j! R8 h
temp = readl(IO_ADDRESS(RCR_ADDR));. A' m" \& |$ Y- Z0 v
printk("temp=%x\n",temp);# M$ X: J, ]7 k. {$ z0 L
//XCR
% Z# K" @! n: F q: I$ l //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-13 X; \% Z' G) |" V0 S
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
3 p8 J9 ^, c+ ^' |3 Y temp = 0x00440040;3 |; _2 p) g, e ~3 c
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
0 r# q) S- H3 ]7 T. d4 |5 L: n temp = readl(IO_ADDRESS(XCR_ADDR));
% `. v ~+ \0 \7 i4 ] printk("temp=%x\n",temp);" x# B) @( L# C
udelay(100);
& A; h0 p% P' N K$ E' \! h3 i" D //SPCR Register
4 K" r' I2 h4 Q* j* i, m //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
1 u- x( g v' Q% u temp = 0x03C10001; //DLB = 0 VS DLB = 1! _' B6 D- d) ?. z0 u+ m0 ?/ T P
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
1 l3 S) v W- v9 x, N S9 m temp = readl(IO_ADDRESS(SPCR_ADDR));
7 C5 x0 H+ _0 K" F# p; F printk("temp=%x\n",temp);' o7 c" c' l' j' n
udelay(100);: V) w4 _ o' T, k0 {. j9 @
5 ^8 K9 [% r! ]' x //set GPIO direction6 V1 i$ }- J% ^. n3 a" v/ H0 r3 L
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
1 j3 L5 N A& p. ` temp = temp | 0x00000100;//EPR----input
( t. C" i. }# S- k- v4 O temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output& Z A% c! ~- T3 v
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
1 K }; ?" G" i z9 ~9 t4 N" D% S6 B , r/ ^4 \' F3 C
return 0;7 n8 U U# l6 C) a
}
) @& ?9 [( Z$ mstatic void __exit MCBSP_exit(void)4 S# P/ Z+ n/ S6 J( s0 ~" U
{$ N* [8 l+ R* x- i
printk("mcbsp chrdev exit!\n");
+ e9 F# d) f) A cdev_del(mcbsp_cdev);
1 s7 J: F) x* k$ ^ unregister_chrdev_region(mcbsp_dev,count);& V( G$ f8 u g- s# u6 w+ c% R
device_destroy(mcbsp_class,mcbsp_dev);$ {- [: P4 ]8 R% q$ y, d% M
class_destroy(mcbsp_class);
2 {( z, o- l4 r}" S' `- w7 R6 h; Q7 {+ g, M
module_init(MCBSP_init);2 W4 ~' L: i$ s3 F9 j* e& P4 L
module_exit(MCBSP_exit);
. C$ F$ N! T, Y& R% D: j9 j' w5 R: s( Q1 e
MODULE_LICENSE("GPL");
; w$ ^. R, w* Q& r- r1 ^
0 G( {4 U8 @. h Y0 f3 t" E! K8 ~我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ F4 Q/ C. x7 l
我的应用层的测试程序如下* t- r$ J% f( ?9 u' _
#include <stdio.h>* @% P# {* `# i0 t
#include <string.h>
, E9 ~( b8 W0 H; Y. O#include <fcntl.h>6 ]4 w, Z% \: D4 o
#include <unistd.h>
& g, c. a8 ~$ g8 M( j6 {#include <signal.h>
$ N3 I: s( D: z% H#include <pthread.h> //线程
" ~& @$ I7 C5 Y#include <stdlib.h>
. f3 H+ Q- J! {& l1 B& ^#include <pcap.h> //捕获网口数据
6 T: h8 v8 j& c3 Z( t( t! x#include <semaphore.h> //信号
; s# F; }/ P7 z; _8 H#include <sys/types.h> //消息对列
- l4 H; E+ T& ^. U0 Z1 n#include <sys/ipc.h> //消息队列
1 I# C' O* g- ]#include <sys/msg.h> //消息队列( \' i$ _1 }: r- ?+ y0 r6 S% ?
#include <sys/select.h>: k4 |/ Z: Y& {( l# H
#include <sys/syscall.h># G8 z8 D/ y: \& I# [! w
#include <sys/stat.h>& r% ]- a5 w. f7 j- U
#include <sys/mman.h>: }' T9 J0 R1 x- c
#define msleep(x) usleep(1000*x)
# c( k! m5 l; Y
) f: P' ]. D, [. u4 {- mint main()$ X% e, \1 X, e* B. J
{ . Z2 Q- I" D) k. k9 U" c: `
//MCBSP,ARM与AMBE2000交互设备
, z4 O# T$ M1 K1 V int fd;$ M2 x5 m, [4 e
unsigned short data_write = 0x5555;
( o# r& Y3 Q; M9 g* P( |" p0 Z unsigned short data_read = 0x00;
9 G1 q% L1 b8 v# Q& _ fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
7 o* L9 r* E, c3 R // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
0 D' y; |: o5 c1 V, L9 x! b + e! t4 M b' D0 q0 D5 S2 J% | H: y& x
if(fd < 0)
; v# k8 m& I4 y, o- Y8 q {
( }2 n# B+ S7 @8 t perror("open failed\n");
, [3 H% N+ Z7 _& r8 S3 K' ] return -1;6 M8 b* h; Z5 m( p% B" X
}
$ F& h) n1 z& h1 ?- B
. J5 U! j) r4 x6 K! A8 k& m. `: s while(1)- g% N, ~' [, j7 T- X# ?5 F; H# F+ ^4 b
{
4 x) u. a w3 [5 w& f8 _' X! g . ~* K9 p2 ]4 C" B
//AMBE2000每次读写是24个字为一帧
+ a7 s* X" {. C8 n3 q! x //写数据时将数据在底层存储起来,等到中断的时候再发送
* f" N+ d8 B3 M. Q //AMBE2000输入数据是以0x13EC开头的
9 _, ^# O* b; X( B- j/ W write(fd,&data_write,sizeof(unsigned short));1 J# W( ^; [' r8 M/ h8 P
4 r- `& g! R( ~0 G //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
. r( ?8 r0 I/ v; W; F& L1 f read(fd,&data_read,sizeof(unsigned short));0 G+ B+ L- j0 d+ }5 H3 v& h
* Y9 H% h4 c) m1 ?# J if(data_read == 0x13Ec)
; e$ n2 l3 D/ q C( J4 i {
0 k" O+ x; D' Y3 I
! D W& b; N1 w0 Q. L printf("data_read = %x\n",data_read);
2 ~2 q* F+ B) H }
' u: B8 j) p9 o9 e7 X. Z+ L8 a0 i
8 l0 A4 a! d- j2 U) p' u4 B msleep(10);3 f) m$ i0 z' i8 F/ e
8 U3 p. w% g" c& ^2 ]& t* d% z' @
/*
& `( L$ y2 a o. T# l& a8 y ioctl(fd,1); U* o4 A. w7 Y5 ~& R0 L& u. |
sleep(1);0 {( M% f6 P* j. W: p- ^" _7 t: T) C
ioctl(fd,0);+ Z- w; y' F6 |9 Z# D8 F
sleep(1);# L" _$ a* O+ G7 F9 H
*/
& w% W h8 e8 C9 F/ Q; b }
( E0 e" `: p8 {# R$ y2 D return 0;
6 _5 l. b% R7 y9 `: D
8 R* A6 Q h" ^4 C}, a0 }% W2 F. A" s9 ?
Z3 N: l. Z: E# f: S. J* h多谢各位指教,谢谢! 急5 h+ s4 f( h' {6 r& O# \
+ t Y& }! Z' ^# _7 j) ^( G1 Z/ b5 ?2 o1 D; B
8 ]' C2 L6 d0 E& H. Q
6 X7 o4 d6 s( f* f+ }
) Q5 v1 c7 ]& D/ H% I! q |
|