|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
, L# H5 }3 W' R0 ?" A0 X/ T1 ]. ~/*
w7 ^+ o0 e F! f+ a * Copyright (C) 2009 Texas Instruments Inc5 [2 b: D* T; d. w6 _+ k
*
) M; u! y, E; i! D# V/ c. M* } * This program is free software; you can redistribute it and/or modify
" V7 k3 X1 R1 k6 I * it under the terms of the GNU General Public License as published by
0 C! w% P/ h! q* |% X3 L; m3 G * the Free Software Foundation; either version 2 of the License, or8 d9 r" G) Q) ?2 Z
* (at your option)any later version.
' M; i2 J9 E6 J Z# U* ^; j; q8 N *
* w4 j3 Z2 t: L * This program is distributed in the hope that it will be useful,, ]- U( G: G6 Z8 I9 U# {* I1 J. M
* but WITHOUT ANY WARRANTY; without even the implied warranty of& E6 j0 r' g! `$ ~: Z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the! }8 m$ |: j0 p) O2 ~( j. I, X+ F
* GNU General Public License for more details.
* h: O5 k! b! I8 ~8 V0 ` ** R4 W$ D- X9 o% S' X9 X
* You should have received a copy of the GNU General Public License8 J2 h% a3 w2 J6 o' W6 R
* along with this program; if not, write to the Free Software. |7 F7 K% @2 l L4 @/ W6 ]
* Foundati$ L) T2 n$ [& Z/ G2 B
*/' @% i' O8 N- O; [4 R3 y% [
#include <linux/module.h>
5 w5 \4 m9 v' w J9 ?#include <linux/init.h>
# F/ g' ?2 g' u" x#include <linux/errno.h>$ ]) v4 o9 V0 L9 G$ T8 H/ k9 V
#include <linux/types.h>
6 A' x( J0 D2 `6 Z( F! i#include <linux/interrupt.h>, A u) H5 `+ K/ j( Z2 b
#include <linux/io.h>
$ I$ a1 `# n1 C" E#include <linux/sysctl.h>( M# F* E# m3 g. X) k0 Z2 A; A3 }
#include <linux/mm.h>$ E5 t$ [6 R4 V/ H7 z0 E$ [2 d }
#include <linux/delay.h>. v6 J) j' H3 d. h7 a
#include<linux/kernel.h>3 u" T) W' @- R- C, l- X" F: r
#include<linux/fs.h>' F& I9 e0 ]/ F
#include<linux/ioctl.h>
, V% Z+ k3 j- ?. J1 ]#include<linux/cdev.h>5 \; b2 f" S5 t/ D1 k
#include<linux/kdev_t.h>! |& d( q5 g; V p7 K
#include<linux/gpio.h>
/ D4 I3 h1 Q- _; W! q#include <mach/hardware.h>
3 @, {1 |9 Q# \2 J s' _$ s#include <mach/irqs.h>
1 }8 r1 ^, z5 K. l& I R; ^6 @3 ]8 J1 E2 s7 v* H
#include <asm/mach-types.h>: W4 `" n; z# Y1 k7 {
#include <asm/mach/arch.h>
- G6 f8 e k% U% F#include <mach/da8xx.h>/ g" |$ g0 T3 ]9 ~# N2 d# y
#define SYSCFG_BASE 0x01c14000& R! T. X$ q7 C6 t# @* k
#define PINMUX1_OFFSET 0x124
& p) K" L2 L! [' Z#define PINMUX18_OFFSET 0x168
; E, W+ @/ K; n3 Y#define PINMUX19_OFFSET 0x16c
% m( K# D) W/ ^, A#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
% O$ P( V) ` f#define RCR_ADDR 0x01D1100C //MCBSP1_RCR* C' _) x, s2 U) g
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR* v: u. k4 e8 e+ D8 W4 `
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR, V$ l( p% i6 {7 q' K7 K+ P
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR2 f7 {: K. I% M) T+ n. B' E
9 K7 ^8 b) `2 F" ~#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
+ {! U) L* u! m& \& G' \* d#define DRR_ADDR 0x01D11000 //MCBSP1_DRR6 v# B1 h& Y2 f; O6 O% H! \. Q$ `
//PSC1 b5 p8 F4 f, Y a6 J" h
#define PTCMD_ADDR 0x01E27120
8 b: N+ l E) I T* U1 n- r- S#define MDCTL15_ADDR 0x01E27A3C
/ @ j" u( ?& c) u8 |#define PDCTL1_ADDR 0x01E27304) C) \/ j5 `3 h" {( C( @: |
//GPIO8 direction
! \* K% n" @7 J& H#define GPIO8_DIRECT 0x01E260B0
" ^5 Y5 \2 w/ W) i' d- _; W#define GPIO8_OUT 0x01E260B48 _+ |. y8 r) |) N, |
#define GPIO8_IN 0x01E260C0& O% f2 W6 J' F) l/ n8 a
$ ^) M" B* E4 L: O+ I//#define MCBSP1_RINT 99 : m2 \2 R" k% m5 H8 R
//#define MCBSP1_XINT 100
4 A8 d% B, V) A1 nstatic int MCBSP_MAJOR=239;
' d6 s9 X. {8 [+ C( q* rstatic int MCBSP_MINOR=0;. `' l$ A% p; Q; j1 g( @% K
static int count =1;9 U% i& m0 X# D0 T
& V9 g6 d6 c3 N6 v* P- D+ C
#define MCBSP_NAME "MCBSP-device"
( T/ i* u3 f* Q9 }& M x* f3 h O4 r# E7 G
static struct cdev *mcbsp_cdev;
. d# `8 `7 \5 P6 z5 t2 ?8 Hstatic struct class *mcbsp_class;4 P! U& v3 d% K" M; n
static dev_t mcbsp_dev;
0 h: J: e1 D8 V8 k: i3 X/ \" Junsigned int DRR_data;
* o" v6 s% q( a6 M4 uunsigned int DXR_data;
: M' Q5 Y2 z2 j7 @+ istatic int mcbsp_open(struct inode *inode,struct file *file)
" w: m$ s: R* J) q5 H# u4 V{' K, A' N4 N7 ]
4 }9 |: d/ L. s* [6 w* s5 G6 E( r
//interrupt enable,initialized
! B" _5 C. ?; b* v- t5 P unsigned int temp;
. P% i" t( {5 g! V* J. e //SLEEP_EN(GPIO8[10])---0; i I0 }; f! {6 q
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
1 y" G) [# x+ E- a; K. @ temp=temp&(~0x00000400);* N* X, d, u; _: O
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' k8 z0 C- [- O$ f; \2 I5 j
//RESETn(GPIO8[8])----0----1
" N# Y/ R& K$ @% |5 [* R! ?. w# s temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; H! q0 `2 k0 n& {' O$ V
temp=temp&(~0x00000100);' C% i' h3 E# v
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0# M9 i9 \, k1 z' H/ S
udelay(100);
p2 i* u% A, g temp=temp| 0x00000100;1 b7 A3 ]( J% j3 S, H+ O* M
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1% }. S1 [. b+ W
udelay(100);0 ~4 K* B8 P8 w6 ^ d) y
printk("open success!\n");0 ^% h& x8 [) D& f2 T- M% A3 ?+ E( m
return 0;
" ~( o' s9 U; v& F}9 D7 f, _: U4 v Q8 {) Y
0 c. w8 v/ N; t- o1 rstatic int mcbsp_release(struct inode *inode,struct file *file)2 M; n* z! ^1 d& g. i
{' C5 Z1 J& i: k: C) N; E8 D
printk("release success!\n");
9 E7 O' v7 S# g) Y; @7 c0 ~; K return 0;7 G4 ]/ P3 h* m" N# T2 V, ]: ?6 F
}: j, j; x" @( O$ m7 N4 k
( v) K" G8 e5 a6 _( |static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- b& \' J+ l, r* k; n5 u{/ S0 l9 B7 U; a; P
copy_from_user(&DXR_data,buf,len);
! O l" a% G4 S iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ( z4 }8 p6 a6 a1 J+ b
return 0;7 J$ ?# v( ]3 d# z
! E7 U% b/ Y. c* r, i}
/ y' E" S& v- e8 T3 M4 V$ g6 v& i- ?5 j
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
( s" @; R) w! v# P: K. B+ Y; M{
9 s9 E7 |- n' Y0 m DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
% F/ D2 B1 e) N3 v8 O0 F1 E copy_to_user(buf,&DRR_data,len); Y8 e( Q3 `3 E& ]$ w
return 0;
/ e- w8 w2 A. n; Q. h0 h}
. A$ V7 k! k0 K0 }
# K4 f( W. H2 `# c% F% J1 z( R( s8 O# R6 c! f6 H0 G
static struct file_operations mcbsp_fops=3 E" ~/ p2 _0 j# r0 h( S% t
{
) ?% s! ^2 }1 Q( z' l .owner=THIS_MODULE,2 X! J" v1 y" |0 l1 H6 L/ C& y
.open=mcbsp_open,6 C* g! g& r/ F3 }- w' v/ s
.release=mcbsp_release,& d' \/ k( N) ^
.write=mcbsp_write,
4 f2 U0 ^* G0 r( l5 ] .read=mcbsp_read,
% n# n/ f( j8 |( q0 U5 L+ S}; R8 s7 g1 S. x6 N" |) t
static int __init MCBSP_init(void)4 k! g3 F( T' f# F7 x' e c
{
- j, z9 O3 Y |' T int ret;/ H7 X& {2 N: w, ]! d
unsigned int PINMUX1_REG_old;
: L2 D7 ?' f; X5 W) | unsigned int PINMUX18_REG_old;
6 ^5 o" R! d C' N, {' Z, \. R3 p( f( D unsigned int PINMUX19_REG_old;
9 l! @' y6 }% S. S* B unsigned int temp; ' T+ j( B k. D3 Q3 f
if(MCBSP_MAJOR)# g/ S. `3 f2 _+ r9 D; O+ C' ?5 Q
{
) L2 u* Z# M4 I; {& j0 G* k mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);4 L8 O9 D9 w& `) d7 K7 o6 z r, b; b
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);0 f2 } l: G k- K; \$ N/ H
}
" o w6 H7 y. q else! v, k' }( B/ d" A) ^
{
, P, a r5 o: T1 \+ A( ]! z, o ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);7 B! }9 y; f, ]% M% V9 {8 h) _
MCBSP_MAJOR=MAJOR(mcbsp_dev);
7 ?7 \" w2 g: u$ f1 R* @ }* w3 t7 F Q& J2 ?# X
/ C$ x/ g7 h- i" x5 J0 D/ T
if(ret<0)1 f# S, Q: U: W. A- [* L
{
! A! u+ E6 w: Y printk(KERN_ERR "register chrdev fail!");% ^; h1 K5 V$ ~/ P/ {
return -1;1 j! W( ~7 V+ i: Q7 `8 ^1 z& E: h8 Y
}
; N" o4 V% f* s2 | * a$ |# H3 i" D
mcbsp_cdev=cdev_alloc();
t) L7 U; V# ^. O$ r
& I6 `- i/ b% r- b if(mcbsp_cdev!=NULL)
9 w+ z) h: {$ y3 T {
. g4 X" i1 ?# R& Y% Q ~ cdev_init(mcbsp_cdev,&mcbsp_fops);
8 {' t, j# ? w mcbsp_cdev->ops=&mcbsp_fops;/ `' Q. T: D8 b% D# @' P* K* C
mcbsp_cdev->owner=THIS_MODULE;, h3 r/ E; o' o+ U1 R9 ]. Q1 e
, j) O: v# d4 }4 c' f
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
" U8 a s- c3 ]' S& \ printk(KERN_ERR "register cdev fail!");; L8 j- m% [# R, V' |* O: v. `
else7 y1 W- _+ t4 _1 M# O8 A. T
printk(KERN_ERR "register success!\n");9 n& N) J) O+ q9 M; l/ G& b8 s
}
& {- D% ?+ y' `! ]: i: ? else3 u' G% b {7 v' L1 r
{7 A* O: p% u* d. E$ D8 M- W
printk(KERN_ERR "register cdev err!");' t9 ~; X) I; U; X
return -1;
9 \- C/ U& |7 L+ X5 n }- e( W* ~+ S- n% ]4 t
j% e- P0 w G! x
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! C' u( v. D# n$ x3 | p3 M
if(IS_ERR(mcbsp_class)): c r: h! z# k0 S
{& R' e+ ~9 p7 T8 z# V. z$ |
printk(KERN_ERR "register class err!"); M8 D( r8 K, n( e/ Y
return -1;
0 G" c; p c" Z+ W5 i }
9 E1 C# X5 A' n3 o device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);- s' R% n4 I! }
. k( N! E2 m: O0 o+ g //PSC
6 J x3 l% @/ U8 C; D& S S //add Enable MCBSP& y5 [ u! X. k; p
//test4 Y6 p {9 T6 A7 {
temp = 0x80000003;4 }+ r: O0 `1 x. U2 B. i( L+ _4 ~9 S
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
8 x- j: c* R5 ~7 J; U2 C temp = 0x00000003;
5 B2 E. B+ y+ A8 j, r- U writel(temp, IO_ADDRESS(PTCMD_ADDR));
6 }3 r: w) @* k/ d3 J6 O
' T. h( H8 u. X; D" D& U temp = 0x001FF201;8 Z2 P# }4 {7 g: B* {
writel(temp, IO_ADDRESS(PDCTL1_ADDR));# y$ B; s2 b( m. n
9 g# i" Y0 R6 H4 r" h3 D6 g //PINMUX
) Q! `- M g8 e3 [8 K! Y //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
& [. R9 b- y( h6 E, } PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 3 o) B; c/ q/ b- ~- H& [
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; . ]0 N5 s/ Z) s0 T
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);4 H1 a" N3 q8 u# N) c m! ]
. w/ X& [* h8 N+ t
//SLEEP_EN,EPR,L138_SHK1,L138_RC# P& Q- ?. a$ D( T0 V; T9 l$ C$ u9 r
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ' Y4 ], d B- S" [' W# j4 k8 p$ X
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ! m5 u, l" l4 I; H* s7 a- C8 ?
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
5 Y( [4 g1 y8 W; E% K / P" N$ O( Z% G; P
//RESETn,L138_SHK29 ^' X6 n5 R/ S V8 R: _
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); % N' d) D1 g: X% H' N
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
7 ^+ ~: B! @* s/ w/ k+ ?% f# z! K writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" E8 m* A) J. Z
- i% R! V# }( }
6 W! F0 G% i8 h! k- s# ~% U) \ //SPCR Register5 P6 r* b6 r3 j" `& I
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
( m" j/ l) R2 ]; D5 C' h1 `+ y' j temp = 0x03000000;//(DLB=0)
: Z+ D4 _. K) G$ s) K3 i, b- x // temp = 0x03008000;//(DLB=1)
" I, z7 V7 I6 x6 _* F/ s Y writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
2 b+ x9 w( |' ?4 Q temp = readl(IO_ADDRESS(SPCR_ADDR));
% q. t Y5 ~$ E5 q0 [1 {/ y' B printk("temp=%x\n",temp);2 T$ A" R" [3 ]7 |
% Z) o9 Y0 s# t& F1 f, Q //PCR Register
1 X$ k/ P' j# R/ W //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
/ @4 s5 l( r$ ~, M! v: W // temp = 0x00000F0F;# _; a( d' w# }5 m) U
temp = 0x00000B0F;
4 X) ^5 g7 b4 F# `! P) ~ writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized ! L+ _- Y: J) e, M8 {2 r/ f/ z
temp = readl(IO_ADDRESS(PCR_ADDR));& x: ]! d, Y5 h9 k! ?4 U3 d6 l
printk("temp=%x\n",temp);
% b$ R1 ]1 z8 e, Q! C m: v //SRGR Register* n& V; `. g% M6 I
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 I/ c/ `# p+ W //temp = 0x301F000B;
+ C; a! k, f. T# j0 Q3 Z writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
0 h& F* N: K, l: _ temp = readl(IO_ADDRESS(SRGR_ADDR));
: {/ A" `% c/ {+ Y printk("temp=%x\n",temp);
" |# u( v2 z; v; F" F1 [% r //RCR
4 f P; x9 ~- m //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
+ G% I: R! b- \; n8 y$ O //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0* b0 i# H2 n! C5 T3 S* S
temp = 0x00440040;8 _4 f0 D. b: B
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized z7 J2 U9 d1 m8 Q c `$ Y" U
temp = readl(IO_ADDRESS(RCR_ADDR));3 X) \* D& Y* W0 u
printk("temp=%x\n",temp);) m2 z: |, }& U$ [+ B
//XCR9 z/ Y @- `+ `# D2 ^
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* Q) ~0 ? s- Q3 O& C# a //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0" a/ ^* a/ V, m! A1 j' Y; J. ~" K
temp = 0x00440040;
9 o1 p/ A1 V' K5 y writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
% C( e6 Z& p, N+ h5 } temp = readl(IO_ADDRESS(XCR_ADDR));$ C9 b' z9 w e. f
printk("temp=%x\n",temp);/ E4 z- D7 f* ^3 y" s8 J L
udelay(100);6 v; ^( o9 v, q. B) ~9 M7 p
//SPCR Register
6 _2 Y4 x7 B0 P' @ a) s* P6 E u+ r //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! n; r/ H5 p1 X" n, ^1 r; Y
temp = 0x03C10001; //DLB = 0 VS DLB = 16 H0 T4 g$ Q" f9 j2 t5 o8 M
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
6 Y/ E/ @$ _2 \0 \! g6 w% b; G2 {) [ temp = readl(IO_ADDRESS(SPCR_ADDR));
3 { o* ^3 Y, q" a6 o* c2 W; K printk("temp=%x\n",temp);* p: K0 `- c: C4 B0 F& g. H
udelay(100);, m/ `9 w* y2 w! x; [8 I0 @
5 K* e4 {! t. G- h; ^* o2 q8 J //set GPIO direction
. b% X4 q& I# N) ?8 K `6 E- h5 y# Z temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
0 Z# |6 H: c% \* A temp = temp | 0x00000100;//EPR----input+ Y- U2 T& a: ^- ^ ]
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
* o# U6 y- R3 Y. U4 T- P __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); * j1 z5 b$ ~5 y8 X* `- y# K
- P k% M1 Y% l5 a8 f return 0;
6 A3 a( v4 [+ n+ u3 Z}! R. g: |/ o/ @: s6 }) w5 x1 D
static void __exit MCBSP_exit(void); r- Z" p7 l1 v
{
|# a# _& C( F$ A7 r4 X/ s( U printk("mcbsp chrdev exit!\n");
; W8 W. R+ N% J- A" v) A9 ^2 k) y: h cdev_del(mcbsp_cdev);1 m& k+ y- M9 Q p: h
unregister_chrdev_region(mcbsp_dev,count);9 r5 x' s4 N: E" \" j, T
device_destroy(mcbsp_class,mcbsp_dev);
6 ]' D' j- g7 p" Y class_destroy(mcbsp_class);% J! i8 ?0 `4 ^ `. F3 I, \
}
: |( a( x, Q9 ^) _. j. wmodule_init(MCBSP_init);
4 I; R0 n( ~: Umodule_exit(MCBSP_exit);
/ b6 G L" Z' Y# r* d2 v& K: A& t" Q8 I9 W9 }7 }% w% Y
MODULE_LICENSE("GPL");+ T$ x# l" R) u4 @4 U9 {0 h. g3 c
}, z3 u/ G1 c! c+ g% p& x
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
% B8 `! W" ]: u& T/ x9 Y W# J我的应用层的测试程序如下
" `& H3 g, q5 z/ Y! t' K& X" v7 [#include <stdio.h>: j5 n5 G2 {7 }
#include <string.h>
8 _' ~1 o+ p, x' e5 X. x#include <fcntl.h>
* `' D4 z% G ]/ N+ o! I9 N#include <unistd.h>
~9 a9 w. a7 a1 ?5 Y#include <signal.h>
Q5 u8 @: |, a#include <pthread.h> //线程
A. o& ?( H7 E$ h u' r" g#include <stdlib.h>
" W# s: @9 O, I/ {3 X" w0 X% L% G#include <pcap.h> //捕获网口数据
7 E) z5 e+ T% o5 C2 Z5 e* n#include <semaphore.h> //信号6 l4 _2 v+ }! g" @% A) d& @
#include <sys/types.h> //消息对列- V: I" {( ]* M8 V# d
#include <sys/ipc.h> //消息队列4 g8 @5 t4 ]0 Q& Q2 T/ K* l
#include <sys/msg.h> //消息队列
: ~' f" Z/ H6 \. M2 T/ Q* V$ A1 w#include <sys/select.h>
' D m7 `, i! [9 z' ]7 l8 J#include <sys/syscall.h>
( Y5 L/ q" \9 g: W+ \* R4 G#include <sys/stat.h>- n: t. S/ v( Q4 e6 c! k
#include <sys/mman.h>) W; k5 r0 ~; O" s* ]$ o. w- x J+ I
#define msleep(x) usleep(1000*x)4 u# P; K* r; z3 t; h, q: R
% i: ?! A6 Y* S: S) |/ V2 s+ o- W! Bint main()
. U9 M% z/ O, n+ h, b; P6 C% l. Z{ & H( d' |8 R$ `* N
//MCBSP,ARM与AMBE2000交互设备" ~( _4 }; M4 Y) B8 i/ e6 q- @
int fd;
7 L2 H+ j( d. f unsigned short data_write = 0x5555;( I5 t' ]0 I' r- f3 I
unsigned short data_read = 0x00;. }1 W1 q. @* a6 ?8 w) F" a
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 p2 A0 t* Y9 v* c0 j& l) a // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);. x) W6 n9 f3 V2 N) c6 L
& ?; }/ D. q+ ^7 I u
if(fd < 0)
: k! \2 w, K# a! d5 n% U$ L$ f {+ N7 C5 o3 _( o+ {. f
perror("open failed\n");
* { [! h- {- U2 X return -1;& A+ l6 p: ?" \1 h: Z2 F+ \+ i
}
* @# q, q- r, p2 o3 J1 X' L' |# J ' h! E3 Y0 X) }3 v: D( l
while(1)4 _3 t: s s6 D* g
{3 H h" P& |0 q1 U2 y' K2 ~5 e
8 B. d; l) e4 A! P) U$ ]$ c2 P //AMBE2000每次读写是24个字为一帧( Y5 Z+ o! Z6 E2 q0 T
//写数据时将数据在底层存储起来,等到中断的时候再发送
' w* V7 O4 ]& l9 K, e: R: |9 ]6 d+ B //AMBE2000输入数据是以0x13EC开头的
" y# ?( `, v, k; O$ |, b* [ write(fd,&data_write,sizeof(unsigned short));
3 L0 f0 h+ R+ c& p: P
0 N' r8 F- S: p8 F //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
: M: O& ]; t( l' `, L8 k read(fd,&data_read,sizeof(unsigned short));
: \ f6 K. m! O+ t! }8 y( ?
5 ]" @0 w; l& X% f9 A if(data_read == 0x13Ec)
4 ~2 Y: K7 i/ G" E {
% ]7 h; J6 I; C& ^7 A2 d
`. m! c8 X2 [/ i M5 B# w printf("data_read = %x\n",data_read);7 `( D6 i0 s; j- Q2 o; N( j
}
) Z& b- g- P% q1 w$ }3 H
* g y: g4 k$ g, g! g msleep(10);
, c5 \* X3 L' Y* \9 r2 z( s$ e
7 W. t+ A* \' J% Y) {0 F: s* E/ N /*3 u- Z7 o8 \, a Z* p
ioctl(fd,1);
; ?) z0 m' J1 K5 N2 L1 M sleep(1);) @! h8 l5 n7 s% j3 a" J( I$ E
ioctl(fd,0);" j1 |# y; G0 O8 {+ w
sleep(1);
7 |3 o% _/ w: v+ B! v% u */
) v5 k; W6 L$ ?& S R } ! A6 j) G6 e6 d1 V) e7 u, Y6 ^
return 0;
, F1 a. T- R7 X7 C* i. f8 C# I + e. N' x7 N2 g- P5 w0 ?
}+ g) b4 J5 D9 e# D( w" ?$ }* o
5 r4 ~% x9 i9 ^8 y! m) [# z5 s多谢各位指教,谢谢! 急3 {% I- K) Z; J/ Q! z+ J6 g
% V8 [# @, t: v, T1 f
' }9 I+ J8 b% U% d! q
: D8 d0 r% P `. F% g
& r4 j& O/ {# D: k+ S6 d* A, m* `2 O% a+ k& p9 x* z; V
|
|