|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 1 w. R; e& f5 D8 _# x
/*
9 z8 i8 ?: y0 q" ?9 @' n9 l * Copyright (C) 2009 Texas Instruments Inc
1 u( ^7 F+ q f *
' X: D4 O. p; S9 v1 h6 K, R. I * This program is free software; you can redistribute it and/or modify" o, e$ g Q% c$ i
* it under the terms of the GNU General Public License as published by
1 l. d0 `7 f& D% N! T# f9 } * the Free Software Foundation; either version 2 of the License, or& w0 i- x6 X( t8 B
* (at your option)any later version.
6 d; \6 G- n- ` *
! N5 T$ \' B1 g * This program is distributed in the hope that it will be useful,3 Q! o, F) M7 _" e) o- R
* but WITHOUT ANY WARRANTY; without even the implied warranty of7 U! m, ]" `9 ?: G4 q: ?5 i! k
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the' @; ~) y8 f6 v9 W0 J1 C3 I% r
* GNU General Public License for more details.
$ j' D7 h0 X) S* b. h- [4 q *
' i/ R6 B0 m# I# Y6 }- Z * You should have received a copy of the GNU General Public License
/ Q/ [) K$ z: H9 \' I * along with this program; if not, write to the Free Software
6 V* [. A4 S) c& k * Foundati
7 p, T- ]5 S& Z& y! V*/
; O `2 i( Y( s5 r. |#include <linux/module.h>$ _: N3 J U) e5 C
#include <linux/init.h>
3 I$ r g; E0 S% {#include <linux/errno.h>+ {' |$ `6 J/ f- c* S
#include <linux/types.h> Q/ ~. M2 U A$ t* a
#include <linux/interrupt.h>- x6 ~' B- P! a$ z7 A
#include <linux/io.h>$ I- x' F! j. \$ ]$ F
#include <linux/sysctl.h>
* Q, P. g) n4 ]* k7 e#include <linux/mm.h>- X+ J3 }5 v/ r
#include <linux/delay.h>
5 `. M* O! D' N, H" X#include<linux/kernel.h>7 n) G6 s% {& f% H
#include<linux/fs.h>& R6 f# @; a1 @9 i7 p5 I
#include<linux/ioctl.h>5 p0 M2 [; T& T
#include<linux/cdev.h>
0 t9 ?0 X: p- I; }# d6 ^* w7 {( ~#include<linux/kdev_t.h>6 C6 J# g6 M# }8 u1 m- C
#include<linux/gpio.h>. }! s0 p( K1 M& ^$ w& t
#include <mach/hardware.h>
@+ v- @6 A" x5 O$ [5 P#include <mach/irqs.h>' x& Z/ [: w' Q# ]
- @ T( F) H$ h Z: k6 K#include <asm/mach-types.h>. K s+ }4 z, u# ~; V
#include <asm/mach/arch.h>
2 B0 H( O0 X9 E: m7 X2 e' H/ M#include <mach/da8xx.h>, m, F) \1 s* q4 o. L; m. n
#define SYSCFG_BASE 0x01c140002 t* I: o7 @% V1 R3 w
#define PINMUX1_OFFSET 0x124 % C# I+ G2 r. ?8 u9 |' {! U% P
#define PINMUX18_OFFSET 0x168 ; j. u. e' E! ^7 s1 ?' p' X
#define PINMUX19_OFFSET 0x16c- y3 l' Y( u9 j' T* I' _% G& g
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
' G* N- K; h3 p' g* [2 \5 i1 ^#define RCR_ADDR 0x01D1100C //MCBSP1_RCR h$ t# U8 ^1 J1 A* P
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
: _% O5 \5 @+ B" d#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
9 G9 M* j! v7 B2 P- F# M4 y. t#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
! W% c4 i4 z% t2 e0 v& z3 P
, X& ^; I# G5 i! a# ~#define DXR_ADDR 0x01D11004 //MCBSP1_DXR0 L( {1 t( d6 U9 ^& {9 Z, q: k
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR) Q _" I6 K) T
//PSC
8 d) h! l& x; H f( g#define PTCMD_ADDR 0x01E27120
" e) L/ a' z1 r: T) W#define MDCTL15_ADDR 0x01E27A3C5 f' E- \/ K% _6 c
#define PDCTL1_ADDR 0x01E27304
5 A: J b! y2 o, I//GPIO8 direction
6 k1 z/ x- `: p* ~#define GPIO8_DIRECT 0x01E260B0
- E0 Q$ o* Y& X0 ?/ o% Y1 f#define GPIO8_OUT 0x01E260B4/ ^; T! W- Q3 _" z5 l
#define GPIO8_IN 0x01E260C0
. g8 s+ f, ~3 O6 l: {1 a" S0 X; j' B, B2 Z% y
//#define MCBSP1_RINT 99
# ^9 {8 F$ q4 G2 d I$ F" w3 A//#define MCBSP1_XINT 100 9 B# g3 g0 [$ v8 Q. g) Z4 z' x
static int MCBSP_MAJOR=239;
9 W/ I( x: i; `. Z+ Istatic int MCBSP_MINOR=0;
* O# j3 |2 j8 O! Q: }static int count =1;
! `, g; A0 k* U
- G- f0 {( ?+ R- k; \#define MCBSP_NAME "MCBSP-device"
5 W2 G2 F5 R5 r! p& K2 L2 S" X* m% V8 _2 g
static struct cdev *mcbsp_cdev;! _0 h ~# P6 \
static struct class *mcbsp_class;
0 q. x x" y# ^9 xstatic dev_t mcbsp_dev;3 i* [. W- ?8 k' q E$ @1 x
unsigned int DRR_data;
8 N5 C0 a# \7 g" T+ {2 _) `# Tunsigned int DXR_data;. x6 t" U. t3 [$ L/ X! [
static int mcbsp_open(struct inode *inode,struct file *file)# V" D5 w6 m# V/ m0 w$ L
{
1 b0 |2 ~& g, U( T4 ` " K4 J! T3 }* ?- {
//interrupt enable,initialized
, k) W% E0 O7 R7 i unsigned int temp;- @3 O0 A3 l1 l2 N* _* C' T0 Q1 m# H5 v
//SLEEP_EN(GPIO8[10])---0) q' Y9 d& f6 z( E
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 a, @! F0 ?4 `8 v
temp=temp&(~0x00000400);1 v0 ?2 z- ]% I' B, i1 j
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
2 \. y0 H- }/ a0 ], @8 h5 \ //RESETn(GPIO8[8])----0----1) G+ `6 p1 u" q$ h! s3 G
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
7 [7 v9 L7 G& o4 ~5 v7 ?- A8 P. { temp=temp&(~0x00000100);6 A2 C6 Q' e9 m1 }, n0 H( d
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---09 w5 f( ?( S+ K A9 x& T
udelay(100);- \- R# P9 y9 D1 p
temp=temp| 0x00000100;
2 a7 y6 E' u8 O" v __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---15 ?) s8 w+ y1 y$ P9 d0 J4 q$ m6 a3 S
udelay(100);0 S) T# ? B4 A' P6 \
printk("open success!\n");
- Y9 U3 }" a; }; R return 0;
& R' X+ r) `! x. R) z) [}
8 {% h) P" v* @9 Q5 \4 B; t' |+ l5 U; F" j8 h" A
static int mcbsp_release(struct inode *inode,struct file *file)
! t) d$ d2 n: g/ j# i& `- D* }{8 V5 O" w9 v5 G" Y# M, s% {
printk("release success!\n");
8 B, P7 H6 S0 f4 ^' Y/ V return 0;
T1 S, |! @9 q' W0 H}
2 m j! v) h, P0 J# D' l" S% M( M0 X/ Y6 N% U/ {$ ?7 n2 U
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 g0 r' n* W, c* }7 h{
9 ?, z5 k5 w' S; ] copy_from_user(&DXR_data,buf,len);% a8 f' F; a# h" j! ~$ V
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
# v9 X/ u) ?6 g* p return 0;+ r% E$ t9 B* }* ^$ {2 Y2 n+ Q
( U4 j# C5 S' D" U& e$ _
}0 A) g/ R& k' M3 q4 ?0 i3 q: @
' c4 c. t9 F4 l7 v( O! F6 p0 p9 ustatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)/ ?! P2 T1 c7 K: R0 L4 }# G
{
- ^( Q( D0 U- [3 l! O DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
' f5 p: c" M6 L4 m7 z' K4 | copy_to_user(buf,&DRR_data,len); % f }! B' ?4 I; g- X9 _
return 0;$ l$ B8 m; w5 e) C/ B
}
1 j$ ~9 T( Y9 y. M6 P) j* q X# ^+ B! d+ f9 a; U5 r8 v; p3 S
3 U1 A( k! F/ f$ z$ a+ s* {- Nstatic struct file_operations mcbsp_fops=% W, R1 d) I4 G
{, Y r8 C5 Y% k: W) Q# S, |
.owner=THIS_MODULE,5 |& v9 K; s1 O, |. [
.open=mcbsp_open,; G9 Q: _6 k+ x% L1 n3 H i. b; B
.release=mcbsp_release,7 W8 A$ Z9 u! m& K7 I0 @* _5 ]
.write=mcbsp_write,# U# J2 s9 i" G: g6 U8 C. h
.read=mcbsp_read,
# _( e$ y/ |: V: Y3 S. y5 @};
& _- ]* X5 q/ I* j- b& \, Fstatic int __init MCBSP_init(void)2 Z: ^& e3 \: n2 E
{
2 @ S* ]9 {& U$ Z' c/ A# q int ret;
( J/ e( {3 n4 \# [ unsigned int PINMUX1_REG_old;) i" c/ G5 S. \" E8 L) t
unsigned int PINMUX18_REG_old;& M0 x( m& X' L: X, C
unsigned int PINMUX19_REG_old;2 L- Y+ R2 z/ q0 H
unsigned int temp;
3 n1 ~2 E3 L3 b' N1 a. r# p- n if(MCBSP_MAJOR)
- J h( A5 p" A7 T! Y2 d, N {% }$ R+ l9 e, y
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);2 \# }: F( R5 u5 h6 u/ l& Y% r3 Q
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);$ x- Q+ F& d, N! ]! c# u
}
5 c1 ^, C2 ?2 u- B else
1 g- L6 g! |% m/ ?, [% Z {! x j k6 s5 r
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);+ W+ x. c/ ~# e& x* |
MCBSP_MAJOR=MAJOR(mcbsp_dev);) O: I: F; s- J8 C6 {1 Q/ m
}. X( Q" v8 Q' g3 J
1 ~: o/ v5 R* ~- c if(ret<0)6 }6 t+ A: E* s2 L
{
& ?/ V' j( N) `" N+ z& h printk(KERN_ERR "register chrdev fail!");3 J- d6 k0 X% V2 ?) [
return -1;
# T/ N- V- h c9 a. d% B }* U/ d5 [- c5 j' g4 F5 f- {
! s" s3 c, f+ U w6 ? mcbsp_cdev=cdev_alloc();, H5 E: m; r1 j$ t1 d0 V
/ h# J- r# a3 ]( U& C if(mcbsp_cdev!=NULL)4 b: I& `9 y: Y: |8 @
{
- l9 A3 ~# ~' t7 }7 Y) g2 E cdev_init(mcbsp_cdev,&mcbsp_fops);
$ ]; _- Q c2 H6 s$ O mcbsp_cdev->ops=&mcbsp_fops;: W Y/ J' [; L, q
mcbsp_cdev->owner=THIS_MODULE;
6 Y% p* X' q) [# k0 T [+ I* [
* e0 x4 G# @6 ]' L' _* P if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
% L T8 x2 |4 G' |0 k i printk(KERN_ERR "register cdev fail!");
' i' k7 P+ \ A1 q9 B else. _# s3 Z8 @+ Y8 _
printk(KERN_ERR "register success!\n");
- S ?; P0 x4 t9 j# ~6 E+ s5 o }
# ]" `7 }6 _& \/ H6 h- E else
- m X0 P' ^! ? {
% d, d" F8 W3 B8 s printk(KERN_ERR "register cdev err!");
! H1 y, E* q8 y* c4 z( J Q return -1;
/ C" u' b% O9 I3 Z7 }) E$ f }
4 p1 j5 e) X" z4 L4 V
% f0 V4 r# N. {3 ~, t" j mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
* w5 O. n2 p# M; o1 v$ H8 j8 M& ` if(IS_ERR(mcbsp_class))
5 _+ _* a/ Z1 d V7 s {
, | ]; K3 P& X5 D/ w printk(KERN_ERR "register class err!");& s1 N8 C. w# F
return -1; S. S- J' K' u* t/ _3 B
}2 i. @: f! \2 C: q/ f; ?7 V- H, Z
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 R" C9 x# G5 S( P0 k, t: f4 o* u, L$ _
6 \! ~5 [3 _$ d8 ]# a; a# Q Q
//PSC
7 Y/ q5 k& g: h: i; Z1 _( W) o9 J. F //add Enable MCBSP
: h I2 ?7 U/ a# Y //test
, U* C' g- D# k }: H8 [ temp = 0x80000003;
/ X0 k/ K5 j4 I writel(temp, IO_ADDRESS(MDCTL15_ADDR));
2 p! C6 O! k2 |4 j8 Z* L temp = 0x00000003;
% z9 N2 _; ^% I j% w0 b writel(temp, IO_ADDRESS(PTCMD_ADDR));
4 E+ H) w1 ^9 @1 i+ K! }
) I; F8 ^- N1 b temp = 0x001FF201;- x q+ o. _" ], i7 w9 M8 ~9 @" ^
writel(temp, IO_ADDRESS(PDCTL1_ADDR));: X9 H) e8 ~6 W- R Y
. ]" X5 r. T- ]; D/ W, Q //PINMUX & T& b& [4 J, \* `
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,* j: ^8 r6 ]1 \& Y- \
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); $ Z% S% ~+ e- B& Y9 F+ {- ^& T
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 9 v# e& d9 N; Y O; u' M
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
K6 b s& | @ , e3 X# O$ ]* a1 ?$ q
//SLEEP_EN,EPR,L138_SHK1,L138_RC
( N3 b6 a$ N8 q# [+ v PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); . a- k8 l( s) a
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
. d0 }! T( z# m$ u) Y- H, J writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
- ^ ^8 d* k* x" v " }: I- u9 i$ l
//RESETn,L138_SHK25 Y' `7 |- V! c2 S& A2 Y( f
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); + V, S7 N+ P* r; o
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ' S9 a5 c' o; m% e$ Y) X5 C
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
6 l% J4 x7 I, P& i H* g$ u. ~ 2 t% \2 L+ a1 ~# O$ X
5 M Y2 { T( f6 f& Q% q/ p3 o
//SPCR Register
7 ^* k: R! v) M& \$ O! e //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 {, G; X! T6 t8 B+ p* N, ] temp = 0x03000000;//(DLB=0)
5 x0 X2 b8 N/ J, \! a& I9 \ // temp = 0x03008000;//(DLB=1)+ j( m2 {6 O8 U& B8 O3 S1 y( u
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
0 Z* J A m" i: |6 `* G. p temp = readl(IO_ADDRESS(SPCR_ADDR));
3 I, ?6 p3 W2 q' k printk("temp=%x\n",temp);
+ l* r" ^ H* T J4 \0 _
! b( a0 ]2 O# t/ x/ w" c //PCR Register
( x* c# K5 D# d6 w7 ~ Q //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0- ~- p3 Y& v" L; u% n) J2 Y! ~
// temp = 0x00000F0F;/ w% p7 P) @* Q! V
temp = 0x00000B0F;
+ C' t. a9 @3 j" G+ S writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
1 f! i+ k- I2 ?5 X" i& Z) X% C6 u4 L temp = readl(IO_ADDRESS(PCR_ADDR));0 O) W8 D! R8 A: |& P
printk("temp=%x\n",temp);
" a0 q- O U1 K% d //SRGR Register" \0 j; a. ~: y
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
. o. S, A5 w: E //temp = 0x301F000B;7 t0 |' Y' X$ k/ @
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
: o! e, ]8 W! ?/ \8 F temp = readl(IO_ADDRESS(SRGR_ADDR));0 R) v) l3 \; C6 d& o
printk("temp=%x\n",temp);% `' o. t8 ^# l
//RCR
. b/ e. X4 `5 I6 w3 @6 L: Q$ F# Z1 X //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,6 k' ]+ s( F. Y; j8 n
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; G$ @! {! z- b7 [# Y; _7 N" `, V
temp = 0x00440040;
& v- w' V5 q) q writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized " L6 O+ z, z4 {
temp = readl(IO_ADDRESS(RCR_ADDR));+ Y$ h; u0 G9 M5 z
printk("temp=%x\n",temp);
# T, I3 ^' u, e4 d //XCR
3 [+ o8 Q k5 R7 z //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
R; [$ Z. H4 t# M" z' z //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; ~9 S8 \0 V$ U0 G. G. z
temp = 0x00440040;% j ?) D) ]' k! T4 |; @3 P r
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
+ R6 n4 \4 ?/ h2 B5 c; o temp = readl(IO_ADDRESS(XCR_ADDR));
# I/ K0 c# x& } _ printk("temp=%x\n",temp);0 ]5 `! @! k, r
udelay(100);7 d$ q) o4 _2 ^2 q" D! c5 c
//SPCR Register
% t: F, E: l' N8 ^ //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
: Q' h# t1 T b3 z' x& n temp = 0x03C10001; //DLB = 0 VS DLB = 1
( s, S' k. F+ i6 t( [; b; [6 `0 b writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
# ^4 u0 [ p$ r$ S( ] }$ x temp = readl(IO_ADDRESS(SPCR_ADDR));
# _. V, o5 E1 x printk("temp=%x\n",temp);
% C# L% ~0 \ S: G% w& c/ F udelay(100);& x. ~. @; S% k6 s
+ Z3 x0 s( t8 U( N8 a% F$ F5 [
//set GPIO direction9 `# e# P1 X4 N* [9 e; G7 P0 O
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
# ]. d+ T9 C1 F; t" q4 I1 ] temp = temp | 0x00000100;//EPR----input
9 S R4 x% d( s, k. K7 { temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output: r5 i2 k# a+ O' ]
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); - S% B2 j( \) B6 A; x/ K) v
& v6 P( Z% C* N5 H; B& v( {8 { return 0;
) z, I- m D) v+ W$ e}/ z8 P2 |- ?& D( o+ B
static void __exit MCBSP_exit(void)
; X0 z0 p7 V+ g{
1 g4 s8 n% H! t& P2 `( a, O printk("mcbsp chrdev exit!\n");
% m$ c* B) U' T1 M# p8 I2 ^ cdev_del(mcbsp_cdev);0 o8 ^5 y4 \; f; [3 n' \& W2 s/ B
unregister_chrdev_region(mcbsp_dev,count);
* m. ^7 f |1 {, F& O device_destroy(mcbsp_class,mcbsp_dev);
2 M y0 n3 i/ }: |* l class_destroy(mcbsp_class);: `0 i7 {/ @" a% y0 @" }3 h
}, ` z: |+ z9 D4 v, j
module_init(MCBSP_init);
: p0 N. c, s I! d* g7 `module_exit(MCBSP_exit);% T+ g1 w- f- S+ {5 i) A7 @% C" B
$ f) Z6 J% K0 S& e! {1 Z
MODULE_LICENSE("GPL");, X3 @5 u; i, K8 _5 B) t
% I4 H; o. g" S& }+ L" q6 H& g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
/ E9 ~/ i6 Z4 L' z S! ~我的应用层的测试程序如下" g0 c8 j* M; Z7 R }
#include <stdio.h>
' j/ d) w' i: v& [+ n3 ^+ b#include <string.h>) z5 f/ ~0 o% H) T2 H9 j
#include <fcntl.h>7 ~) p4 C% i& i1 P6 @6 V3 N1 K
#include <unistd.h>7 R. v5 X: L- l' Q( o4 v ^
#include <signal.h>3 D n+ d! F$ a% r3 u4 y/ L' D: n3 D9 W
#include <pthread.h> //线程
! R$ N$ R! ?# A4 P2 d#include <stdlib.h>
) A1 Z5 C" @5 Z- O; M6 i! G#include <pcap.h> //捕获网口数据
! W, y$ {8 p/ b4 j; E8 {( _4 j" W#include <semaphore.h> //信号& p5 x2 v6 P/ a; k
#include <sys/types.h> //消息对列
: P- `8 J4 s; Q+ J#include <sys/ipc.h> //消息队列2 n* k) ]0 l' O4 {
#include <sys/msg.h> //消息队列& ~* w7 h% b& t7 f% ~0 U
#include <sys/select.h>: ?0 B: D0 Q. _1 n: K* W
#include <sys/syscall.h>
: q, t8 q; M) ~. d) g7 e6 L+ x#include <sys/stat.h>
0 ?) O% V k U#include <sys/mman.h>
- b* i( G! u! [' r#define msleep(x) usleep(1000*x)
) L0 Y# W' S) {; d1 ]5 \2 m9 r1 U9 k1 z, n1 K7 f5 Q8 s# k2 a) u& _
int main()
$ B) G0 z( @, k{ / v9 K* [! m- J- w
//MCBSP,ARM与AMBE2000交互设备
& ]* G. _0 ?6 E8 ^, Q, Q _, R int fd;
) \3 L* o7 \9 X( d unsigned short data_write = 0x5555;
3 v- t0 [7 g7 O" Y+ L( I unsigned short data_read = 0x00;
) K( ~. w$ R" b! B: w6 y fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; W7 V6 p: e% C
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 E% C1 q$ W& R: S
: Q; ?) a( N+ Y& v. h1 U9 L* |5 W9 F if(fd < 0)
- [. Y& Y: c: A- ]$ C {4 ]6 S; V! F3 \
perror("open failed\n");7 I* p5 | ~& T0 E+ O9 J
return -1;
/ q7 H; H2 p2 \% Y& S! T9 \2 o }
- G2 t. N: O) x/ x
. k1 i+ j* |/ n& h# J% }' I while(1)* o1 j7 q$ B$ Z7 K& W& |
{
: }8 Y0 j3 Q0 }" S1 T3 o # N$ t8 P2 h4 u$ a! F
//AMBE2000每次读写是24个字为一帧
6 `* E" _1 w. \ //写数据时将数据在底层存储起来,等到中断的时候再发送+ o$ v8 E, i6 I$ \( k
//AMBE2000输入数据是以0x13EC开头的
. E. l3 z- H) Q6 F$ | write(fd,&data_write,sizeof(unsigned short));- r- O( V% Y s r0 W1 S$ R6 ?
* r; x8 j4 q" c1 @6 G% G' b. a* N N
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
3 o/ X% ~4 C4 d+ d# D# `" [* T4 q/ W read(fd,&data_read,sizeof(unsigned short));
6 G5 }( t2 U# q o
7 Y: t# j" z6 U2 W if(data_read == 0x13Ec)/ H6 \, D) M U/ F8 f! ]' H
{
0 x$ v( I0 @* B1 W) x5 y/ i) r+ o
% }3 R% s, |- g5 G3 h; Z printf("data_read = %x\n",data_read);
& d; {' b4 m! l m" B }
l, k% ], e1 D) m3 @ 4 w/ Z6 u, l/ @& r# G; S$ B/ i. {# R
msleep(10);2 C, ~( x- ^' b! B' e
5 N2 z' i) l- I- W% u /*5 w6 b0 H) U% D( K/ u1 [- K
ioctl(fd,1);
. B( @5 N' a7 W7 [ sleep(1);2 _( b; p6 \, ~! U# P
ioctl(fd,0);- J$ G- @. d0 z* o8 [
sleep(1);
& b+ U& D" |- y. W! [* ]6 i6 }! g */ : p: C$ Q) Z6 r y) e2 t+ L
}
7 L) R& ~4 D9 l/ D return 0;
, k% x( o# e' k, l. E2 s
5 G5 M6 n! j- b3 S, X0 \}( A9 m9 d; N6 S4 W& }5 F$ t* m4 z
$ D5 E! U. g$ ?' V' F多谢各位指教,谢谢! 急5 J% ^; V) w, ~
( {( g3 Q2 f a1 J3 V, @% ]- ^: H8 `; y( \% {1 J
6 n! W$ R( l0 X
9 w6 t2 k3 h- D/ \0 s- B! Y: Q, F' ?) x
|
|