|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 2 _3 [& C: z6 U) [# P
/*
/ e4 U* C; P% r4 x* a4 z * Copyright (C) 2009 Texas Instruments Inc& U; p. G1 ], L" U W- O8 T
*
5 G% o1 F! E# r: W' }7 j * This program is free software; you can redistribute it and/or modify2 K3 g% G$ o2 @) t9 x( Z) ]
* it under the terms of the GNU General Public License as published by; P6 C' _. b. j- q0 ? ^
* the Free Software Foundation; either version 2 of the License, or
2 q# ^9 b) ~( K& x5 |0 E * (at your option)any later version.
" b' Z" L+ ~, a" R *
5 d( I1 ^: | [ * This program is distributed in the hope that it will be useful,
4 r- x. n4 e; w# a& N1 Q( b2 y * but WITHOUT ANY WARRANTY; without even the implied warranty of
% \2 r* I5 t1 k * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
" I# _6 s M, x5 h * GNU General Public License for more details.
$ P8 y7 s* c V/ t' L9 K7 B *
/ Q$ x3 u0 ]2 u5 X/ a1 H3 A; Y * You should have received a copy of the GNU General Public License
/ O M5 `8 F; G& y( Z, F * along with this program; if not, write to the Free Software
8 X4 Q0 W3 I7 C) G, o0 I1 i * Foundati2 W3 W+ q" d9 }* a
*/
* a! B* f4 |/ ^& ?1 X1 x#include <linux/module.h>
/ H- _; ~2 D; a: _#include <linux/init.h>
: z% ^+ ~! f8 b0 v#include <linux/errno.h>
5 H0 ]& w- C `7 @: J& d$ N, u#include <linux/types.h>3 Y' X" k" P9 x: m. A6 f
#include <linux/interrupt.h>8 A: s2 m' A9 V8 w5 l6 [+ ]
#include <linux/io.h>
; l& j# Q& d) [ m4 `) O#include <linux/sysctl.h>
- S6 C: r6 Z2 H#include <linux/mm.h>
) M+ A9 m& R! ]3 J#include <linux/delay.h>
* a" j, Z* p2 B/ @* p9 m" L! K2 D5 C#include<linux/kernel.h>
3 B6 \% T% |6 L V2 v#include<linux/fs.h>7 `( M+ E) x6 [; D, s$ i& T
#include<linux/ioctl.h>
- U7 r! \# W; v: h#include<linux/cdev.h>
: B: N a; }- Z+ ^! p! q#include<linux/kdev_t.h>
: Y2 {6 _+ I" r/ ^' H% D#include<linux/gpio.h>4 L% z Z ^: \. o8 m
#include <mach/hardware.h>
% @' |. c% x. N' C7 w* ]* Q#include <mach/irqs.h>1 L t, L- c: h
: d* s H+ }; d! X+ N$ B7 v; \#include <asm/mach-types.h>2 ?" L% ]6 G" _ Y
#include <asm/mach/arch.h>
7 h$ o0 g* q3 v' _; A#include <mach/da8xx.h>
& U0 n2 l' U0 d) L#define SYSCFG_BASE 0x01c14000( {8 W2 O. _$ b5 S) S
#define PINMUX1_OFFSET 0x124
. q& r6 ~! _8 e7 @ [3 _! O" F#define PINMUX18_OFFSET 0x168
& K: R8 g/ q1 U8 X0 }# V* ~#define PINMUX19_OFFSET 0x16c
* Z* ]: O3 ]6 n9 ]; [1 d# K#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR. P f0 s* B9 j" e, U! @+ Z
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
5 I' d- d* p; w#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
& d& Y* w/ t0 f, _; m#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR% `: I: U5 x# X# m1 a2 R
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR! {2 w G, d. C( k2 I; J) S, o; i
. D7 I0 G: B; z; r8 h' q0 x2 K! t#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
" t: l4 e' z9 }#define DRR_ADDR 0x01D11000 //MCBSP1_DRR" ], ~( E* V. ^4 k) M, s( B; S3 g
//PSC
8 P) c8 g& y4 T0 h0 h# }0 A#define PTCMD_ADDR 0x01E27120
& Y F: y+ v0 ]5 V$ {/ p* j, e#define MDCTL15_ADDR 0x01E27A3C
% r9 e6 Y5 B3 C# j#define PDCTL1_ADDR 0x01E27304! X0 J, A/ Z! X3 t
//GPIO8 direction Q. Y# u y: d" y9 o
#define GPIO8_DIRECT 0x01E260B03 p; i( ?2 Z6 r) M( ~
#define GPIO8_OUT 0x01E260B4! v2 _& }, F: {# ?
#define GPIO8_IN 0x01E260C0
4 v5 e' `# W# I0 z) d# @* X, q7 x- L: s7 E" t
//#define MCBSP1_RINT 99 0 G: c! C$ ?* @) i
//#define MCBSP1_XINT 100 7 c/ X2 Y# ]- y5 Y
static int MCBSP_MAJOR=239;
. i7 V/ t( K, Istatic int MCBSP_MINOR=0;
! \: y( H; Y" _, _) Ustatic int count =1;4 X y) L3 C$ U g
. u6 b7 ? @5 L) W1 }- q/ `#define MCBSP_NAME "MCBSP-device"$ _" I; D2 {% N1 W
4 X+ N; }# S* w1 f) U% j4 d* |3 T* s! Qstatic struct cdev *mcbsp_cdev;
0 V0 `0 H, {2 v2 u& a* z2 R# [ nstatic struct class *mcbsp_class;, X" a6 J. X; l. O! y
static dev_t mcbsp_dev;1 b% N" b. t- q7 }( ?
unsigned int DRR_data;4 k" R3 A: R) g. }
unsigned int DXR_data;9 p& i' _4 A/ J3 H
static int mcbsp_open(struct inode *inode,struct file *file)
* Q; a J! H; N# r+ y{
. X* X8 R( ]( d0 g- X3 L% W - O1 w9 r7 k& `5 D+ _* U
//interrupt enable,initialized6 G5 G; w( x! `- V
unsigned int temp;
& F" b7 b# @* h. o/ S //SLEEP_EN(GPIO8[10])---01 o% y" N5 M1 y, E1 u7 s8 d
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; p. W) U+ {7 z v$ p& | L
temp=temp&(~0x00000400);
& L8 w# N' ~. b4 e/ ^7 R0 ]6 A __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
- b! S7 n3 r O$ ]& s9 |' \ //RESETn(GPIO8[8])----0----1
8 j9 M/ k- t9 S5 j; s0 _0 a temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ D- j2 Z- w# g; F2 k
temp=temp&(~0x00000100);* i; D3 a8 \3 F& v8 Q
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 i: W+ g/ ~4 z% m: F udelay(100);9 K% ~& w. @& c* R+ L- W7 _$ G
temp=temp| 0x00000100;
" I2 r, _+ q+ f5 h- S __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
* H7 H* K1 x/ o! F5 z: P* t udelay(100);) s' P4 |9 @- J' N/ O
printk("open success!\n");- p3 a3 \) Y5 g& V2 C) s
return 0;
/ T) S4 E( F" v# l% w/ X}! f* s" q9 x/ `1 a
, D' M. O p$ k' K# G
static int mcbsp_release(struct inode *inode,struct file *file)1 i+ ~, a* z0 }3 \( ?# U" e
{& S+ W5 Q$ H1 `: @
printk("release success!\n");# V- d8 y& k- b4 }8 W
return 0;
* x5 g9 o1 w+ p9 J& j}, t+ M, f, \3 Q
0 F7 g. p4 {/ W R* ~
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- Z, [3 B" E" O- |5 ?{- U0 u& _' E8 X- Z
copy_from_user(&DXR_data,buf,len);0 Q! s% W4 z5 A4 U5 X- [
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
% [/ p, e/ I. g' i0 e3 u- \7 C' K return 0;7 S2 n6 ^. {" _6 U
. }0 { f. X3 J7 Z7 S: e+ ^7 _}' n- ^* J0 t4 m* s" ]
# Y" N9 f9 K/ w7 p2 _: w6 q
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
$ d- t/ v- j# l) E{ : r: }& Y. h- e7 }# ~6 o9 [+ a m
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
2 e! V6 j2 Z+ K# l3 a- r* E( r9 `& Q copy_to_user(buf,&DRR_data,len);
; n' l8 U( Y( H return 0;
# g: K; E6 o" c( [# u- |, ~+ A}
8 s8 M" }; L% i5 O
) R7 h. R# U( `
. P& G* @3 H& wstatic struct file_operations mcbsp_fops=( M% O6 E) Y4 V# ]( Z+ I- F0 z9 F& o
{
' c9 D1 V: L: M7 G .owner=THIS_MODULE,% u% m1 L/ v; G1 d" H, m5 n
.open=mcbsp_open, m: c% v. q& u( c, F
.release=mcbsp_release,
- E, F- N8 k: T$ j' O( m5 d9 F# }9 D .write=mcbsp_write,
, Y) i) C, y3 o; d# v3 L9 L0 ^ .read=mcbsp_read,
) j- C |1 J2 R7 b};
& s: g' e& o) A: m+ Z1 o2 xstatic int __init MCBSP_init(void)7 a2 t1 ?, V2 x
{& \: O5 q' x8 X, T
int ret;2 S( n: A+ ~. _7 C' U+ z) F
unsigned int PINMUX1_REG_old;% K" k8 c, M- }
unsigned int PINMUX18_REG_old;
- P" Z7 _7 n" K+ k unsigned int PINMUX19_REG_old;
$ ]. L* Q+ z6 _5 ~# i8 H unsigned int temp; 0 A( P. a, j" l# Y. X8 c4 i
if(MCBSP_MAJOR)
/ b! |/ ?8 G l8 M" S {5 f5 v3 [6 K! B, B: l, j
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);3 ]( v4 Q! V4 U }4 Y& I. `
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);/ x8 t/ l4 H' ?3 N6 `& o
}+ Z% e; P. G: e, \
else1 V4 W$ }& E# z5 {$ j5 G4 ?
{8 c& @; j; g9 E) D' R' u
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
. v- a8 w0 P' L: E MCBSP_MAJOR=MAJOR(mcbsp_dev);3 b4 J- p" c! k5 j S( \! E
}! a2 |5 |- ^3 W# \5 ^
! F. J. _ E# u6 l S) o; |
if(ret<0); n( K% J, M, T4 \
{
' ?8 I6 i5 y3 q0 g) ?2 n, ` printk(KERN_ERR "register chrdev fail!"); l) ~# I) x) z7 p2 [
return -1;# l$ v( S9 b; [/ K4 a
}- q& w+ k5 w2 P6 o/ s# y
4 d7 D& P$ R7 ` mcbsp_cdev=cdev_alloc();
; }3 o" r9 O p2 ?% N$ i
4 B0 V" u: k5 X- C if(mcbsp_cdev!=NULL)7 K: q! F& {7 T0 |! l9 p
{
% R# y+ L* t' m v# W5 X cdev_init(mcbsp_cdev,&mcbsp_fops);
& Y" T7 s1 d- | M mcbsp_cdev->ops=&mcbsp_fops;
+ Z3 U( @. a2 E( F mcbsp_cdev->owner=THIS_MODULE;
. g" L2 v& Z* H& I4 U5 j& k3 m
3 }+ g1 A6 B, r* N if(cdev_add(mcbsp_cdev,mcbsp_dev,count))' p8 x! U( i+ x; L# |1 C% v8 u2 j
printk(KERN_ERR "register cdev fail!");
) e/ P; K) \+ H4 W; r7 i else
/ T; j+ {+ i j2 u0 M8 X# w printk(KERN_ERR "register success!\n");
% c# r: `" N: N7 h4 H# t! ` } l: I" Y" ~/ S9 t/ r9 h- k/ ]
else
- e6 m+ U: Q! h$ o {
. P3 V6 o) o# P printk(KERN_ERR "register cdev err!");( w" r4 O1 ~: h
return -1;
: r1 P3 [/ m4 q; m% A% b }! `+ R1 S1 x/ i5 N
: i/ F' P+ \' J8 s4 y) L mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
. [5 {6 T8 g; X+ v3 ~ if(IS_ERR(mcbsp_class))0 U. ?, Y$ V) I
{
. n* D2 | b; E printk(KERN_ERR "register class err!");
/ U; p/ x X5 Y/ e# w" Y return -1;
O* H% L4 v. j6 B D9 U }6 F/ A R% H8 K1 [" t
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 G0 w1 p( a+ D3 w' {' m8 ^ Q& U* j0 l
//PSC8 T2 @! u' s1 U$ @6 Q. t
//add Enable MCBSP
" m! i. t9 X# Y3 T! i //test( e" X! q7 g% u- ]* n1 m# z- [3 f7 Q
temp = 0x80000003;! C! a( K1 a& f' Z. d
writel(temp, IO_ADDRESS(MDCTL15_ADDR));# c1 u: B4 F& B! u0 j4 B# C
temp = 0x00000003;7 ~5 w6 }9 g! I# N+ c1 y
writel(temp, IO_ADDRESS(PTCMD_ADDR));5 \2 N8 R" X+ b
1 I. I: W, @( W/ j" j& p temp = 0x001FF201;
5 \ S: w) V9 a: Z0 q9 U7 r8 p2 L! o2 R writel(temp, IO_ADDRESS(PDCTL1_ADDR));
, ^; E% m2 a5 Z; u- d" T' y# d 0 L' v8 q- W* q9 K9 B: v+ g E9 w
//PINMUX * A! {. I% V$ h& }+ u/ l
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,& u- M- c: ^5 n' x# H
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); : Q" B5 k2 u+ B" m- N5 Q: w- w
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 1 W% Q2 [+ I* H: }5 |. b
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, m# \+ T7 c- A) R; Y 8 q2 g) `* H3 ]9 z6 x6 E. I) \
//SLEEP_EN,EPR,L138_SHK1,L138_RC
- U6 t; e" k2 @$ U" j6 M- X PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
0 m& t# N( w& C" _ l; Y1 q2 O9 D5 T PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; - c2 z0 X) f4 _3 f
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" |+ E' K" P1 W8 K9 F5 n
7 [, y- k% P. g1 Y6 c" Y //RESETn,L138_SHK2
' @- @* v( _/ ] PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); - w4 I+ B2 T; I* S8 `9 n! B8 c
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
! j3 U4 G5 A! f) Z& c writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
! |! k8 _5 y1 l( l8 b& I, E2 b/ h0 Y * Q; u: d; T2 O7 D' i
' M0 ]1 l& K7 q h# k7 t- G# _
//SPCR Register0 ^1 n' u6 X, t# ~9 q
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
% a7 s; C2 E& Y, ]2 I temp = 0x03000000;//(DLB=0), {" u+ @, i q1 Q8 T
// temp = 0x03008000;//(DLB=1). F4 {; Y! e; Y5 m' d( t( x9 }. [
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
! I; ?% c$ b! J5 j temp = readl(IO_ADDRESS(SPCR_ADDR));
2 J; }* q5 v+ D5 _! j9 G printk("temp=%x\n",temp);
- K; U* p3 S' w1 K$ e: R a. w ) o: c+ }; z+ m. \7 w
//PCR Register
- _3 E9 i# d* B- {* v) L //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0* }. A* ?1 `; g/ t1 t
// temp = 0x00000F0F;
8 Z8 A0 X7 w: c: L" o( y' h5 Y temp = 0x00000B0F;
8 q4 J; e6 i) N3 o; G( `9 T writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized + |4 |2 S. k$ c X A& J
temp = readl(IO_ADDRESS(PCR_ADDR));1 E) @6 Q4 A" a4 |" s& X
printk("temp=%x\n",temp);
" Y' ?' O5 s0 k0 v! D //SRGR Register
* \9 e B$ Y, H/ V' L //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==117 A1 C( `2 f1 {
//temp = 0x301F000B;! m/ ^& N& A) u5 X u% s" [
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized : U' z: l, ^9 w' G
temp = readl(IO_ADDRESS(SRGR_ADDR));
! e+ P/ A& X% \! m0 w printk("temp=%x\n",temp);
; K9 P& S) p% G/ L2 Q //RCR+ S& E! H# m7 x0 }, F
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,% `3 k7 q% R* [: O8 D. i& e
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
" x9 Q/ E' `5 e* { temp = 0x00440040;
& c3 {- J9 p/ K writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
5 u/ v* r8 |. D1 U( e/ r$ q temp = readl(IO_ADDRESS(RCR_ADDR));1 p1 \6 U2 f6 ^+ V
printk("temp=%x\n",temp);( }# V/ E# W/ ]4 P9 \
//XCR9 P T) O+ _& s0 Y+ E
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
4 \6 I1 {6 {0 R5 x9 y" C+ n! }) } //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-03 D9 z$ ~* a/ S$ k3 O- F
temp = 0x00440040;
: z- h" q9 c3 G2 N* A( R! i writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 6 r8 ]: G4 q; c& S
temp = readl(IO_ADDRESS(XCR_ADDR));
7 r! v# m8 `' i- P1 c9 ~ p0 L0 ^. [. G1 r printk("temp=%x\n",temp);
, r! g% n: { _1 ^ udelay(100);
7 W9 n1 w4 r- r- u //SPCR Register
1 A$ ~7 N0 ]% W8 X //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
' c2 U7 ~' M8 o( y. Q temp = 0x03C10001; //DLB = 0 VS DLB = 1; T4 _/ N& O! e' m* Z
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
) R) j, [- j1 P7 Q% B temp = readl(IO_ADDRESS(SPCR_ADDR));5 y7 s9 x, B/ X# _. @2 A: p1 W
printk("temp=%x\n",temp);
g3 w- c. G8 ]7 Y udelay(100);
! y5 O0 `3 A; V8 h. |" P8 V+ ^0 r3 U
. b9 O p6 H! L& P+ g5 y( x, I //set GPIO direction
1 B3 d# g6 O5 ` temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));! s6 Y, M5 {) N8 @5 P% _" q
temp = temp | 0x00000100;//EPR----input
4 b% h3 W+ y' p* @: g- N temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output7 f7 d0 m( ?+ ^9 o. K
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 9 K4 M$ _8 e& X( Z+ [; w
w7 ^% I7 |: p- b; X3 ] return 0;- [2 g1 u3 M8 V% ]
}
; V: C% H/ Q1 M6 n. c7 B, B" ustatic void __exit MCBSP_exit(void)7 E! M1 n5 J! P4 N
{
8 ]! E8 B: q4 E printk("mcbsp chrdev exit!\n");
% ^9 Q5 a; ~0 T6 J7 X$ t% X1 {# u cdev_del(mcbsp_cdev);' x: C$ e U% @6 v7 j; v/ q- H- t
unregister_chrdev_region(mcbsp_dev,count);
- P$ ]" y* _( m' U device_destroy(mcbsp_class,mcbsp_dev);# T* g: U0 o e/ ]/ l9 e
class_destroy(mcbsp_class);$ |6 y5 h, @( E: T1 s; h
}
9 o+ k4 m& D) e5 d9 m% U lmodule_init(MCBSP_init);; I2 z8 H" D, I4 N
module_exit(MCBSP_exit);
9 C3 E. \& j4 p1 @# A. P% O8 |/ B) f8 K+ `* n+ m
MODULE_LICENSE("GPL");! P4 {: r, J& i1 e% w. q
6 I+ n( I2 i( @9 R$ `! |/ [! W6 I我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
, P8 L! q5 i" e3 ^& N; L# z我的应用层的测试程序如下* ?# n2 A, q4 C3 P+ m+ |/ F. Y, \
#include <stdio.h>
, f/ W: w. E! V) K#include <string.h>
$ _* t U' }* d% X8 B, O! k* ]#include <fcntl.h>% K: p- M2 _4 F( ]
#include <unistd.h>" E# H* d" \2 t; i, b+ z F
#include <signal.h>
5 b9 O# K, L; c+ D. v$ l* B#include <pthread.h> //线程
+ ]1 \2 @8 W3 s% D( _8 l+ A#include <stdlib.h>
[( Y. D1 {/ K, V6 k" U#include <pcap.h> //捕获网口数据, D* R1 b5 u" R- b( j! a5 b) B* I
#include <semaphore.h> //信号. c, c0 G) y6 e* S* g6 c7 a
#include <sys/types.h> //消息对列
. _, J: G) A! i; C/ p0 X* H#include <sys/ipc.h> //消息队列
4 b [% ^; \" Y5 n; f#include <sys/msg.h> //消息队列- ~% V/ U7 n# _7 F
#include <sys/select.h>" C6 B# b* y( T( {5 w5 r
#include <sys/syscall.h>
+ l! D) D5 j( s2 C5 x#include <sys/stat.h>( J( I, h7 I- X: @8 Q
#include <sys/mman.h>
+ E5 q( ]7 ?6 X# x8 c#define msleep(x) usleep(1000*x)
$ C8 [, M9 q$ m- c7 J. X3 `2 y0 c3 z" C6 ~
int main()
; n2 V K# [1 b{
: t6 {' a/ k: s+ o! `/ X3 S: Y //MCBSP,ARM与AMBE2000交互设备- Q7 ^6 G- f) l+ l
int fd;
9 h% M1 N5 m x unsigned short data_write = 0x5555;
3 b' s ]5 y h1 B( ` unsigned short data_read = 0x00;
% l* Y5 S* a4 V6 A fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
! N3 P9 x) E8 u" z // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ {- N" f0 M! R" }& s5 D . T$ n0 q- |- r3 l! e, g
if(fd < 0)
! t5 B; f8 R5 F) M8 Z# c! P {0 E1 ^9 G: E2 @. V
perror("open failed\n");
6 B" q, ?. G7 j) b0 @' M return -1;
! U8 F3 q- P' l, r5 X4 ~( t }" r2 k1 K8 u* t8 ^. f4 Y7 |
; d% k( R* u5 O9 t5 i/ ^3 f9 g' ? while(1)
, I5 T- O3 t/ i8 H {
( b( }: J: t3 ~) b: c/ K
, C3 [4 |' O% z5 @* B' T$ N& Z //AMBE2000每次读写是24个字为一帧
( r. e) y8 K- n/ z //写数据时将数据在底层存储起来,等到中断的时候再发送
* k" u y% t- m- Z( w //AMBE2000输入数据是以0x13EC开头的- K ]2 o6 r0 q* k9 X1 m
write(fd,&data_write,sizeof(unsigned short));
4 Z/ _3 ^4 ?4 u5 x! p* `* V
5 X7 E+ n- Q! h( W* D% e //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
# [9 @# h9 n0 d; P8 t read(fd,&data_read,sizeof(unsigned short));
9 M; q( g4 E% D; B 9 o! w8 g" t! E/ D5 ]
if(data_read == 0x13Ec)
! T0 Z) [% r+ R' @ {/ }. G U& G0 O' H
( G" { D( ^/ N; [. @( Z/ M K printf("data_read = %x\n",data_read);
; v* b: t0 E5 T }
9 O3 e" @& k0 ~0 P0 t! \6 i4 h# m* O / W2 `. p: t& I- N# Q
msleep(10);# c5 I- K/ R7 Y' W; I. k
& J/ o3 h7 b/ X' M9 f7 ^ /*
: z5 g! E/ l' }; K7 L2 H ioctl(fd,1); ; b& r+ t5 M0 c' m! w
sleep(1);! `+ V; n5 j' g; l
ioctl(fd,0);/ o4 N* B7 _- A
sleep(1);
- V' `: |. ]( e j7 _3 t */ $ e8 X: [3 M. D9 P* f/ o* R& V
}
3 ~3 w8 C3 v+ `- _. ]- { return 0;- v; S' n) z6 d# T+ v
# R" T5 B" f( w. R; G. ?}& y) ?" L. a, J! D, {
8 V% E3 @7 {0 A/ b9 q) ?% o
多谢各位指教,谢谢! 急
2 F$ E- y/ z. b! b6 \; Z7 y& Y# o9 @& r t
4 {$ o; v3 u+ E; i
. a1 V% z3 J7 k* b
\( Y: n6 T% }+ l& S: V" A. w2 C; N, _* s
|
|