|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
$ V: D4 Y: g* A: i, v- u/*
/ l: p3 I4 j. f5 Y0 Z8 e% W; i: q4 x0 B * Copyright (C) 2009 Texas Instruments Inc9 S5 e9 ?; s& ~, A) M4 K( V7 }
*2 R7 K4 O% X( Y7 E7 R$ G" c
* This program is free software; you can redistribute it and/or modify
9 Y; H; w' S7 A. X K5 I# k; l * it under the terms of the GNU General Public License as published by
' A3 b! v1 X% @" g+ _: Z' |$ G* B * the Free Software Foundation; either version 2 of the License, or n2 ~# M5 r( Q# z- `2 r
* (at your option)any later version.1 S3 G1 c0 \. R6 w
*3 G, j. k; d) R1 p$ A
* This program is distributed in the hope that it will be useful,) |0 a* J5 W" b' h3 r
* but WITHOUT ANY WARRANTY; without even the implied warranty of
; t( e& \# `; h* K5 D G * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" k0 H9 w' Z" ` V$ x6 ^ * GNU General Public License for more details.
3 e$ i: `1 \8 c9 n& d n7 _ *
$ e2 y; k8 K Y5 ^; R * You should have received a copy of the GNU General Public License5 o) ]# p* ^ f" D
* along with this program; if not, write to the Free Software
9 a. H1 q2 B3 g# ~4 F5 k% W( m * Foundati
# v \4 Y1 U& C9 l ?; v+ {& ~*/$ L; r& p" O; T4 \
#include <linux/module.h>* B2 K3 H- Z, ^
#include <linux/init.h>
% {6 @: b0 t: y5 c* d#include <linux/errno.h>
; D2 A5 r/ |! U( S) ]0 T#include <linux/types.h>" V+ q: q: w! W B* b( y7 f+ ?' u
#include <linux/interrupt.h>
' A& A# w2 b4 b3 G. v1 [/ |#include <linux/io.h>
" h E! g2 N3 s( z6 Z#include <linux/sysctl.h>
9 ]7 T2 ?5 ] [#include <linux/mm.h>
* @* W, j4 u6 S( Q#include <linux/delay.h>
}, g; J% m/ c. ~0 `0 }#include<linux/kernel.h># q3 G8 m3 L% }+ L# o9 y, F `) O
#include<linux/fs.h>
8 j m3 c6 L3 }5 t/ `#include<linux/ioctl.h>
# d4 m* L5 S7 [% Y#include<linux/cdev.h>) A0 ?5 v4 H# X4 C. }/ z" k* t7 p
#include<linux/kdev_t.h>
r6 g& T9 F/ ?/ y/ T5 Q#include<linux/gpio.h>* d+ i- v8 |7 ^9 J
#include <mach/hardware.h>' Q/ l6 D) N. M* F1 m6 n3 x8 y
#include <mach/irqs.h>6 U5 o! }: Q: J0 H. u
) P3 `0 i' Y# v9 x$ r! V
#include <asm/mach-types.h>
7 r# g0 H6 l' a! g) v U3 X9 ~#include <asm/mach/arch.h>/ l7 g2 X% n0 v2 n0 d+ V
#include <mach/da8xx.h>$ P# l8 A9 o/ w: W
#define SYSCFG_BASE 0x01c14000
, V$ s7 H/ G& |0 E3 K: w7 P" }#define PINMUX1_OFFSET 0x124 ) G; [4 {8 e3 g! `
#define PINMUX18_OFFSET 0x168
c/ K. P+ D% L h2 i#define PINMUX19_OFFSET 0x16c
2 r& h v0 K/ V& I; s#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
! K. t1 q0 k. K% H6 ^#define RCR_ADDR 0x01D1100C //MCBSP1_RCR; ~' h( s" D! E3 p
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR1 z# M& k" G w1 w, S" x- n& }
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
% @% I& t% C4 x0 ]#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
; O! Q4 O9 S& q; v
- S; J9 [3 c2 K#define DXR_ADDR 0x01D11004 //MCBSP1_DXR% N7 a1 A6 N# m6 S+ ^' u2 t) Z
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR; k [8 t9 ^; H. f) e% U
//PSC
; O# l+ d/ N4 D+ ^ J#define PTCMD_ADDR 0x01E27120
% t- ]/ l M2 Q! P4 N H! Q7 l4 x#define MDCTL15_ADDR 0x01E27A3C
! k& X8 ^7 j$ B#define PDCTL1_ADDR 0x01E27304
# L }2 ?/ |% E# B//GPIO8 direction
! ?) y. t' }7 A#define GPIO8_DIRECT 0x01E260B0
$ g& v/ W- c; ^' ]2 y#define GPIO8_OUT 0x01E260B4
6 M% j& u$ i5 {5 h! B1 x#define GPIO8_IN 0x01E260C0
) ^) l7 f& {% s+ }& J4 N
. h/ |% |9 F2 f! U//#define MCBSP1_RINT 99 & J+ L3 b ^; z2 o+ f* G! r2 j
//#define MCBSP1_XINT 100
# ?3 T$ |+ o4 P3 w' cstatic int MCBSP_MAJOR=239;
; A" g3 u2 N5 ]( L: p' L+ kstatic int MCBSP_MINOR=0;5 g* `% B; W2 l' U! C) W$ x+ {
static int count =1;
: |# @# T. h4 }( \: @
1 R* O" f0 h) B3 U) s& k4 d#define MCBSP_NAME "MCBSP-device"
3 t, A' C0 e' A" ~, K6 E
" T+ v7 y& Q+ Vstatic struct cdev *mcbsp_cdev;
) V4 x& V9 y3 l& z% s* g. a. U4 Gstatic struct class *mcbsp_class;5 U. d7 H. a& g
static dev_t mcbsp_dev;
3 w) |/ m( u/ d: d1 g% L( ounsigned int DRR_data;
! s# W- b# n" Ounsigned int DXR_data;
% g3 D. w0 Q; @; M G. Dstatic int mcbsp_open(struct inode *inode,struct file *file): I0 p9 r" o) w0 P: t
{
& D2 L; t- \0 \* Y, _0 t
. w$ M4 D/ h/ s1 a1 o //interrupt enable,initialized3 c: @, P) Z5 \3 Q( Y# C- G( H3 o, |
unsigned int temp;, O1 i. M7 X" D. o; a
//SLEEP_EN(GPIO8[10])---0* E- v) _: [! e% x4 f% v/ e
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
2 u! h* Z# W" ?/ y temp=temp&(~0x00000400);2 D! ^0 ~: I' E, \7 c4 e
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' R% p3 T) Z- K& u
//RESETn(GPIO8[8])----0----1. t0 k3 z$ m5 F" M' t! }- m2 O$ ] [( U
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- V# t4 l# z% H4 b: ~ temp=temp&(~0x00000100); i9 a% l' }: ?: R6 u" j
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0- D9 [9 Z8 k" A g2 X* u
udelay(100);
" V7 f. @1 Z" d c- Z temp=temp| 0x00000100;
- A2 F& _! Q) _$ h __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1- v1 {# T0 v" D6 j3 a% a& C: W* }7 R
udelay(100);
/ Z- e* P# ?- I8 s% r% e6 u3 W printk("open success!\n");
; u* p& ^) a1 L) G' Z return 0;7 ~* J- H' x! O
}
1 @+ u3 v" d5 P, ^, q3 ]3 c7 J- Z9 h/ A
static int mcbsp_release(struct inode *inode,struct file *file)
0 E6 o7 P7 m" J# h" S3 N& ?{ ^( Q9 B: \: h3 s3 i. N
printk("release success!\n");- m4 b4 O t: q/ \* \' I
return 0;
4 ^5 C8 s. @4 R8 G5 U W/ ]}7 u$ ^2 B* m; Z, ~7 @8 f
6 h+ G5 t) n7 U _. Q
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
1 w# k! e: K& g, p7 p9 @( M{+ t0 g3 K. n2 i7 m& _# x" ?
copy_from_user(&DXR_data,buf,len);
% m) E! |; r6 g; r- y* p* U iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* b3 b! X( j& _' Q" `/ t0 ]; q" b return 0;
6 ~6 s" i* u- l: _3 l8 _* E5 ` : I* M/ P3 ^) U, P; G! n C
}9 z) v3 `* c. g, h
2 H" c5 e8 x0 u# X5 ] y
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
) d9 m( L4 E. H: l( g# z( ^{ & V8 {+ c: r7 w% j% y: |) A" ^
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));$ g! Q" V. H; e( w' c
copy_to_user(buf,&DRR_data,len); - L' Z# R( U- Z) S9 V
return 0;
! u0 Z5 `' N$ l3 M}2 S: D1 h+ E/ d& _8 }# R5 T
5 D1 r. F9 D( M1 f
2 o2 \4 o( g. u! k$ f: Estatic struct file_operations mcbsp_fops=4 V$ x: n5 z! l) }# S
{# T7 f0 c# n: A
.owner=THIS_MODULE,1 i* I6 `( Q8 N7 r) |# Y
.open=mcbsp_open,& r* L+ O2 [' t- m. c2 Y. q
.release=mcbsp_release,
) _$ Z9 `. E: J3 F5 w* u2 V; s- \( B, K .write=mcbsp_write,
& o9 |; ~ B: _5 Y! ]; U8 B .read=mcbsp_read,2 _) D9 P3 V' T+ a* T
};' ~! ?& y! a* [ g9 }3 L! \$ U# f
static int __init MCBSP_init(void). X& A6 N6 g/ x& S7 _
{) E: O$ y4 u! u$ d# M! W" a o. V
int ret;
9 i; i- J5 _' W' E/ o unsigned int PINMUX1_REG_old;
3 b& T* r% {: `6 Y6 s% C: ? unsigned int PINMUX18_REG_old;7 S' Z( s; n; B9 B6 I o/ u, P
unsigned int PINMUX19_REG_old;+ H+ |, |6 X# M0 L$ y8 I) }0 m0 O
unsigned int temp;
/ g5 }* _1 O8 K: P5 P if(MCBSP_MAJOR)" L! w# S, P& G) u
{
2 r4 V& b$ t! ` mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
4 ^. u, z' [0 @/ H6 h5 j9 h' S8 X$ Y, ? ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
1 g5 c, t; l" p" Z W- W- B& l }& \2 K! e3 s7 @# c
else
$ O) i f) u6 ~+ H {" j4 Q% O( V: Q9 ^
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);6 H/ {# f, U* a( T# d
MCBSP_MAJOR=MAJOR(mcbsp_dev);
: i4 N1 O6 i5 Z. V& L- p }8 D# g/ I) \8 [6 H$ C9 l4 K
/ U# P! W X" S5 Q" k if(ret<0)
+ k* d7 i% B' l$ I% [+ [ {: \3 i! L7 Q6 C
printk(KERN_ERR "register chrdev fail!");
1 U5 @; O& Z# r+ m b# \* {! T6 F return -1;4 L6 d) D# `. d* `. Q
}
) e. @7 q6 K5 K; v4 R3 h! B5 p9 l4 |
: x5 Z2 z6 p+ ~' B mcbsp_cdev=cdev_alloc();
1 z$ M5 R4 X; l
; W, B |8 I( h0 A, j if(mcbsp_cdev!=NULL)& Q. |- f" z# N5 {) L5 |' W
{
- l4 f( X+ _+ G, v cdev_init(mcbsp_cdev,&mcbsp_fops);* B8 d* W1 ^$ W
mcbsp_cdev->ops=&mcbsp_fops;% i3 t2 _* [2 a' [8 L4 A3 R+ C! Y
mcbsp_cdev->owner=THIS_MODULE;
; N, L5 i3 c# W x- T7 c2 K0 Q) f0 j6 E
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# W$ B e1 f3 |$ n$ }
printk(KERN_ERR "register cdev fail!");
. v# u. B7 o: _1 k else
E+ O3 x1 t+ U/ n* [ X printk(KERN_ERR "register success!\n");
7 Z) B9 [. o! c; L8 M0 o5 m }
; L! A, V. ]* D, A5 A( d( N& M else
/ D# W; J! C3 x- d6 a! D" K& g {2 X9 H, G5 g: Z9 y+ F3 N- t
printk(KERN_ERR "register cdev err!");
; j: Y7 y' d/ C return -1;
7 d2 E$ l ?) c1 i# z& B$ _1 ` }: ~- T! ]) ~) D7 Q6 P! _* X
/ c9 d4 q" R. _3 H s" b mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ p$ {& F' m0 r2 f0 N8 d6 m" X% N! S% N B
if(IS_ERR(mcbsp_class)); u0 e6 P1 [5 U' c. Z1 N! w- |
{. M9 v" n0 n) z- N( Y- i# ^
printk(KERN_ERR "register class err!"); |. d0 N5 O. Q/ E7 p! c) h
return -1;/ ^, q( f0 J$ c- ~1 M1 j
}% l2 r& L' m& Z# z
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);0 T5 }; n1 o+ y4 T
" G; d g6 d/ p7 U //PSC
2 G& }' \4 T, w2 O6 S //add Enable MCBSP
8 Z8 O5 j5 J, A, P/ J //test1 Y0 s! n9 U" S8 d- o& t+ P+ y
temp = 0x80000003;
- J( Z$ I) Q- B9 _, F+ ~. C5 r writel(temp, IO_ADDRESS(MDCTL15_ADDR));( D# I" a* Z4 r( |) b+ [
temp = 0x00000003;/ u P: F8 D8 W! m1 v& o# u
writel(temp, IO_ADDRESS(PTCMD_ADDR));
/ h' U) T. P# T. C8 q " j* H( B% P# N ?/ ?& t
temp = 0x001FF201;5 n& \; n& ?: `9 n* ]4 T
writel(temp, IO_ADDRESS(PDCTL1_ADDR));9 D& ?8 l {6 C. v# k4 Q
( z) i' b' h& J- O. m' n
//PINMUX
! e6 J, o2 ^" u- \7 Q, f //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
+ W- }, Z: O! b' i# x- {. f" s PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 9 [; n% b( x. p0 R) D
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; . ]: L- s K$ P! q
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);$ S* D( |- h. P0 ?+ I
) S J( b3 Y( g6 E
//SLEEP_EN,EPR,L138_SHK1,L138_RC9 {4 }" N. q, R
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); # y" [' U( @2 Z O" @6 W( s) j
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
, S/ r* e2 b4 D; s5 T7 n8 b writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);( z' l- F' q6 }; E6 H8 R$ [' M: ~
8 x7 f: S) |8 g+ a //RESETn,L138_SHK2) C6 E0 a D( x! b9 p
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); & q8 `9 Z3 c2 p7 w' ~
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; " f4 c5 o1 Y* m5 `' Z
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) ^$ r' Y% Y# M/ _0 c& U Q- h' r
/ r: e% a8 W7 M% k# Z 1 x4 w3 Z, N- m
//SPCR Register6 i( j1 A6 @2 D
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 A" k1 f+ F! s$ ~/ O( a/ D
temp = 0x03000000;//(DLB=0)) |7 b: v9 J. o
// temp = 0x03008000;//(DLB=1). F& G& ~$ V) V/ i$ |) v4 v
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
# d I3 x$ L6 f- O temp = readl(IO_ADDRESS(SPCR_ADDR));
0 k8 H$ y2 b- @ printk("temp=%x\n",temp);
' I6 A8 f# L5 ]) d+ t/ ^
0 p5 G" [/ ~: o' J' K+ E //PCR Register
( `$ v! a/ y) h0 w j; P6 t- L //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
, H! r* U% }! z0 L0 s // temp = 0x00000F0F;+ [7 ^& I9 V* L# x4 H
temp = 0x00000B0F;
5 m% {- F) B2 n0 N writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 4 ^7 q9 v/ G6 M" E( m
temp = readl(IO_ADDRESS(PCR_ADDR));
6 B. j9 p# }: m1 A+ u+ o) C printk("temp=%x\n",temp);
6 L6 O% t4 W( m* ~ //SRGR Register
% R; N6 [8 d# @% \2 h6 _3 M+ p //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; M, o! v, e/ q3 ^9 A$ i2 U
//temp = 0x301F000B;
! _1 ?! U3 t( l2 {$ U writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
/ s" w! X$ `9 e4 P# b5 ?' h, l temp = readl(IO_ADDRESS(SRGR_ADDR));
* P+ S6 z7 _7 G0 ? printk("temp=%x\n",temp);
5 X) m& e# x8 `# | x //RCR
" J3 K- T. l# l4 X //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( v/ t7 c! L9 d
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
2 r- e7 K1 Q6 J$ h8 s temp = 0x00440040;7 L/ O( u# k, S- o- v* L7 A0 N
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized $ O( c' w) z# f9 o! K
temp = readl(IO_ADDRESS(RCR_ADDR));
' y# N# z/ C3 R printk("temp=%x\n",temp);
5 X9 j9 w& p2 ]" x2 ^' I5 P //XCR
5 b1 z7 Z S/ ?, l- k: Z( ` //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1* U0 ~7 w4 \# v/ u& N" i, S$ n
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-02 g( ~2 |9 l4 x4 G7 d7 t
temp = 0x00440040;( N. P2 o- r1 F2 z q
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 2 Z x5 x1 ~& ?& o H
temp = readl(IO_ADDRESS(XCR_ADDR));
7 i- U0 D: ]7 w! l printk("temp=%x\n",temp);
; R F1 r! w* D9 f udelay(100);
( m9 ?( I8 u. C //SPCR Register, S C* G8 i% F* Y n# q& }
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
& m3 B' P4 h) R0 R( b temp = 0x03C10001; //DLB = 0 VS DLB = 1
\9 v/ f. ~+ A5 b8 l. A" S7 w writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
* Z6 x% V9 B- g* s: u7 O temp = readl(IO_ADDRESS(SPCR_ADDR));' X. P h2 C: a( C- c
printk("temp=%x\n",temp);% \/ ^" q4 I0 F" ?' A! h# L# R
udelay(100);
: A) ?' z: `2 L6 w7 }) m1 z" F! E
$ v. N6 ]9 k6 q: P4 z0 x, f& w //set GPIO direction c' B* ?4 ^, `9 i$ T; e
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));( L2 R% d! t! {, Q4 K+ Z6 J2 ]
temp = temp | 0x00000100;//EPR----input
1 s+ B* w( T9 S3 q temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
% \9 E3 u6 c& j7 L __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
0 y: r, c6 |; `' m
2 A6 x8 T$ M, g) m0 A) b! p return 0;& `. |! G% w/ E, x: B+ {9 g9 I( Z
}
/ ]0 t( L) e4 y0 C# `static void __exit MCBSP_exit(void)
$ W6 T/ |3 ~' ]# D# V! u{, H. y* j+ B2 C; m) T
printk("mcbsp chrdev exit!\n");
/ B3 M& F: R+ y: x7 S: T cdev_del(mcbsp_cdev);
6 |+ ?( }, p8 ^, p6 O) w' y* R unregister_chrdev_region(mcbsp_dev,count);
}& q& ^' l; ]9 B* w device_destroy(mcbsp_class,mcbsp_dev);" n' i* K7 w7 u4 O1 r
class_destroy(mcbsp_class);9 i( ^3 ]' |% N7 H5 e$ G! [# H1 O
}4 u9 d6 \% a9 { u( {0 U. I
module_init(MCBSP_init); P' Z$ H9 I6 H, G
module_exit(MCBSP_exit);
" v1 M* d# P6 X7 l0 T8 B+ |% _8 `) n
MODULE_LICENSE("GPL");
' f' G0 @8 m) R2 ~; \8 [0 ^, B7 o# ^* E
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" D' A7 w& x. }/ j8 u我的应用层的测试程序如下
6 {* o( \+ u2 s5 Z#include <stdio.h>
. P: R% I& C& T6 L5 o#include <string.h>; {+ h X6 Z) C6 {8 I
#include <fcntl.h>* {+ g" W/ L7 W5 Q K6 Z
#include <unistd.h>* f+ E3 y- W% n$ x
#include <signal.h>) e* Z+ ]( ~( N. t3 N; v1 L
#include <pthread.h> //线程
0 g- M* L. U3 ]% |& n+ e0 B#include <stdlib.h>
' B5 c+ Y, k/ a#include <pcap.h> //捕获网口数据1 }. |% j# P; ^( W
#include <semaphore.h> //信号
, E; f1 o) K* D. W: V7 w5 P#include <sys/types.h> //消息对列
: t" a7 L! A- V8 a3 O: I+ T#include <sys/ipc.h> //消息队列% l9 N' ~" v5 V3 w+ m+ ~
#include <sys/msg.h> //消息队列
7 D" f% I1 N; I# B3 p$ l#include <sys/select.h>- I$ l/ U6 H3 R2 G- G
#include <sys/syscall.h>! x& `% ~( v! h3 s0 V
#include <sys/stat.h>( h0 @- x' y+ B* {0 v- ?/ {% j
#include <sys/mman.h>
, f) Q! ^& [$ k#define msleep(x) usleep(1000*x)( ^+ F' {# _$ y8 P- q. @
% `4 i/ y i& v9 G* s
int main()
' e2 N5 y0 _% d+ B" }! ^3 Q4 m! @0 z6 e4 ^( p{
( h0 O2 m# O6 b //MCBSP,ARM与AMBE2000交互设备
5 f9 ~9 U' t0 G7 R! ` int fd;
0 C1 Z4 k& O" q) q. L unsigned short data_write = 0x5555;
; ?% P, V& s* h7 _2 B* v6 o1 ~ unsigned short data_read = 0x00;% i0 T9 L; B1 f" y( l9 s" C6 ~1 E
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 \& @- N/ V2 }. b2 S8 p% y
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 B" j( Q0 w" C* \
1 ?% l; [: Y7 |% z P4 { i
if(fd < 0) Q9 J( k' u! h
{
4 _; ^% n* G2 `, G8 g perror("open failed\n");6 s6 o& p% a' O
return -1;
! I: O; A# f8 }) R2 a4 I1 I% I# p$ s8 n }
% M3 |6 n6 e' _/ [ - ^' B: b. u. V/ H2 r7 Q
while(1)
, `4 @# \7 G& E9 h* | {9 Z9 N: I |8 F5 J0 `0 i
- z3 p6 d A3 _0 }) m //AMBE2000每次读写是24个字为一帧
% w/ C/ l- \7 b8 ^( U; S0 T* X //写数据时将数据在底层存储起来,等到中断的时候再发送
% ?2 Q/ K% p7 K& `$ n8 Z //AMBE2000输入数据是以0x13EC开头的1 H9 V. A( B3 y i; Q) u
write(fd,&data_write,sizeof(unsigned short));' \- u" F3 h" Y& ]; ]- `
) [8 f0 E5 c! f5 l, G: e
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 1 E F- }; F$ |8 d' q
read(fd,&data_read,sizeof(unsigned short));
# C0 p- J+ \9 g$ E' I
7 K' F' u3 k( G8 C+ _ if(data_read == 0x13Ec)/ W# v5 ^3 c% U
{
- K) p Y/ T. M3 d 0 J& O0 i# l. s( k# |8 ?
printf("data_read = %x\n",data_read);
! g4 A, J/ b, v7 _9 v; L2 w }# U( E5 z% d" M9 J: z: E
, Q: J' E- d6 n4 S5 t4 s msleep(10);* D$ r0 |' h$ h6 h
2 {7 b1 S/ D* X/ i8 ]; H4 o
/*
! |/ g( C9 u F# h ioctl(fd,1); 1 P2 v' s2 B: J k9 `4 V1 O
sleep(1);
- e i4 s$ E7 M2 J# ? ioctl(fd,0);
5 J! o7 {% V# K+ ^/ j sleep(1);6 J9 s7 b9 K5 n& l% x( C4 K; |
*/
1 u4 W9 K$ y% |6 p( ]1 d6 f& y } ' G: f4 Y& b! V ]% U
return 0;' P0 h" l. F7 L/ V2 I
: }+ B6 `! N, g$ D( L
}4 Q' J+ a* A, @/ k8 ]% s9 d
4 _& Z+ z- v$ W5 \! h多谢各位指教,谢谢! 急2 K5 g" N- c4 r% t
5 b4 y$ B8 C# d7 [1 f% ^4 R3 |' f3 t6 L
- T+ N+ V& Q& w( n( { U: Z& D3 Q. ]. r1 r4 W2 d1 i; R/ [
5 ]+ J) t' E: p |
|