|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: . D5 \ i# Q+ j% D: u' z& K
/*- T4 U8 ]% ? Q$ v
* Copyright (C) 2009 Texas Instruments Inc
. i6 S) h# x! Z: C- Z( Y *+ k4 O+ V$ A2 |0 o! G; u" c
* This program is free software; you can redistribute it and/or modify
2 ^; i5 L: {: _: w4 N * it under the terms of the GNU General Public License as published by3 \8 O+ X2 G: K5 Y
* the Free Software Foundation; either version 2 of the License, or/ V) b8 h8 ?$ f- E# w
* (at your option)any later version.
: y% j) L. C6 b: u9 H* {% R' w: a+ C *
# D% t* g5 T; Z' w) t6 n * This program is distributed in the hope that it will be useful,: R+ H( i6 S; c
* but WITHOUT ANY WARRANTY; without even the implied warranty of
5 g$ H6 C3 B! {0 N+ w * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- e- q( c1 X0 m0 G! T * GNU General Public License for more details." M, D3 ~9 K/ Y* y* n' ]
*- I) o8 A1 C$ d# O; y
* You should have received a copy of the GNU General Public License
6 I5 Y8 l' H: y' m8 H * along with this program; if not, write to the Free Software) _* a" v8 F; Y- i# F6 S: P! A
* Foundati
2 ^6 R* s9 C/ Z* e; \*/; s5 B) m7 V3 j+ _) v5 m/ F; X8 z
#include <linux/module.h> c) T) h* e* q
#include <linux/init.h>! V6 l- e+ ~9 g( P# w$ l
#include <linux/errno.h>2 d; J) {: Z8 [1 P& K% ]. l
#include <linux/types.h>5 [+ H) e) [3 b- F. B( A' K: ^
#include <linux/interrupt.h>/ U. X' V8 U) J/ y
#include <linux/io.h>
/ o$ }- A6 e3 q ~5 G#include <linux/sysctl.h>
`5 O9 h0 Z, h" X; e8 V& {#include <linux/mm.h>. `. }8 C- w3 D9 o- H$ p
#include <linux/delay.h>
0 m6 F9 M0 i0 c5 o#include<linux/kernel.h>
- }7 U+ [7 V/ b5 F0 c( H7 i#include<linux/fs.h>
7 {$ W3 @. Q; l2 X7 K#include<linux/ioctl.h>
* A* N% M, _( V4 E3 p6 m, B3 l#include<linux/cdev.h>: u; c$ E/ k) T- T; C3 D
#include<linux/kdev_t.h>- k4 u- H: r+ I+ M' p
#include<linux/gpio.h>, Y: c$ O! W7 B! V) S6 _
#include <mach/hardware.h> c8 z) d6 V$ j
#include <mach/irqs.h># a* a3 E" W6 g$ g3 K( M3 r5 ~3 g l# r
, e% Z: @2 P) t9 b
#include <asm/mach-types.h>
; Y2 _6 T8 M0 B' l+ U#include <asm/mach/arch.h>
& T4 h$ t! R3 o6 Q/ b! K2 q#include <mach/da8xx.h>! a/ r% ~' T* ~
#define SYSCFG_BASE 0x01c140004 j" ] v/ e" m+ N
#define PINMUX1_OFFSET 0x124 / w4 g$ [0 L% V: w8 E& s" k' f# K9 b# X# K
#define PINMUX18_OFFSET 0x168
- Y: L! O0 G! Q8 ]#define PINMUX19_OFFSET 0x16c
' {' j8 u( x: R0 l; o#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR: t2 v$ o) T) I! V
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
2 x7 o0 U4 w. r1 B: _' A#define XCR_ADDR 0x01D11010 //MCBSP1_XCR4 n+ N' @0 g4 G( T
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
m" Q2 C$ M; \% G e# |+ |( B1 ?#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
9 f6 L' |/ N! {: y- J. N 4 R( R Q: g6 f b; i* I: R+ R" [
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
) [& }2 B0 T' l# a( z. }+ P: r+ S# a3 q#define DRR_ADDR 0x01D11000 //MCBSP1_DRR U0 ^6 J& [* m
//PSC( l# G3 z% b: B3 u# [$ C; Q9 F! z( l
#define PTCMD_ADDR 0x01E27120 5 P& N1 u% ?) N
#define MDCTL15_ADDR 0x01E27A3C
# v. h4 W4 _( \ [; n; U#define PDCTL1_ADDR 0x01E27304" @5 q# I! |3 o& z6 l
//GPIO8 direction+ O+ B4 C% @' \! n
#define GPIO8_DIRECT 0x01E260B0
8 U+ ~/ R; d+ k1 r#define GPIO8_OUT 0x01E260B4; l: w: m, B; G
#define GPIO8_IN 0x01E260C0
$ ~: f- d+ m: \1 Z+ Z% p( ~2 F1 \- {+ c. y6 H. `" I# m3 g
//#define MCBSP1_RINT 99
4 W+ C, Z# I: ]7 M//#define MCBSP1_XINT 100 : ]7 E$ S, D/ a, w6 B
static int MCBSP_MAJOR=239;2 E% x; f8 c, J
static int MCBSP_MINOR=0;7 [( {( j! \0 B2 L( k
static int count =1;
' N8 E. [ s- m* I- r( X9 {2 ]2 E4 J2 g$ O! J, v
#define MCBSP_NAME "MCBSP-device"
- p: Z c# P5 [% V* `8 C1 ~
, x F7 E) ~/ e& l x$ Cstatic struct cdev *mcbsp_cdev;
" Q7 [0 `- g1 d3 f4 t9 r, m/ M& sstatic struct class *mcbsp_class;
% U, o) }- L! x0 b/ V1 R. I6 M3 T8 astatic dev_t mcbsp_dev;
, D" @ ?& Q, O0 M1 punsigned int DRR_data;5 C8 D, w; S2 ~. k; ]2 [
unsigned int DXR_data;
. ]& Z) |! i( }% lstatic int mcbsp_open(struct inode *inode,struct file *file)2 s; E8 T1 t7 `/ h' s( R
{
* s) _; f; s: f. c
. h4 r8 V. f' w/ _' P4 D //interrupt enable,initialized7 `; y) c. a4 [' p9 O; l5 R3 H4 X
unsigned int temp;
' G+ F' y) Y5 { u //SLEEP_EN(GPIO8[10])---0
5 ^8 S& Y! x" N6 K' T temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));7 a2 r4 g% ?/ h0 @) O+ M* R; B
temp=temp&(~0x00000400);
1 K; C6 n2 [0 |- C1 I( l) v* L __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( J# }9 S( t9 o' E9 L
//RESETn(GPIO8[8])----0----1
0 v ~- M2 V$ L: ` temp = __raw_readl(IO_ADDRESS(GPIO8_OUT)); v0 R) i; p6 P0 C$ v$ y+ }1 F
temp=temp&(~0x00000100);; L" J% v6 y, ? A4 ?, ^- Z7 ?
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 s1 D3 Y5 l0 Z# N0 g udelay(100);
0 b N f1 L5 m temp=temp| 0x00000100;. ~+ Y1 u' T! m2 W2 C; i
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
- O9 x8 [4 k; s- e6 Y* V udelay(100);4 ?+ f! Q+ @" {
printk("open success!\n");
( A! Y9 y7 }, ~: P" Y return 0;4 v" t) r1 A/ o, P8 F
}$ F! T- V' x5 t" u' H7 K
& X3 L \: g4 e
static int mcbsp_release(struct inode *inode,struct file *file)! r/ `. K+ p5 N. q. n* ]8 x
{
# X. H. I! }' P8 p! \1 k9 l1 T& U printk("release success!\n");( `+ ?$ \% ]4 ?
return 0;
5 Q" n/ | j+ f. z6 p3 I}8 L; H) |: o$ d, A5 F
g8 W2 k5 s W0 r# wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; ?! q: U* X: U" [{. M- k$ ]- l8 u: `
copy_from_user(&DXR_data,buf,len);
& X2 Q v- K1 g& M iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); : K# l) B# x) D( `& g: |& k( `, ~, A
return 0;
0 d0 t( G# h& W
" d: Y0 R$ o! g+ l5 S}
1 F5 ]8 n7 [/ u& ^2 y
/ U) @. e1 t7 y, V7 L2 ]static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
- M J, \8 g" L. K. q) m9 X' l{
+ L; J" O# W- o1 }6 C% [, j DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
/ ?1 {0 F# E! w+ D& X copy_to_user(buf,&DRR_data,len); 1 |: F- u3 f1 z
return 0;- f" {7 i# m; ?9 i4 _
}
$ Z) s( T! a3 k+ O0 S, A; v% j9 o- K, b$ u, p6 |1 Y; B
2 I, t1 x2 ^- h1 V& X
static struct file_operations mcbsp_fops=9 e1 s' ?% c0 q& T9 g* g9 Y6 h
{
8 C; _2 P! T2 k" @ .owner=THIS_MODULE,7 C }/ ]% j, W" I7 g/ n
.open=mcbsp_open,
9 ~" Q, _( o" |9 F .release=mcbsp_release,
6 d6 s4 V6 a' i& `2 ]: t .write=mcbsp_write," @7 S7 m+ k$ F
.read=mcbsp_read,
+ ^) Y$ c5 O; X7 E. @};
4 Z# S9 I/ G) D& l! `: t" estatic int __init MCBSP_init(void)
( \" f& l( G5 s/ L( }" q{
7 Z9 [& B3 t# o+ F8 n# b int ret;% O( r1 g- ~( k N. B
unsigned int PINMUX1_REG_old;
5 ]9 {1 b7 H/ X) M# I" G" z unsigned int PINMUX18_REG_old;7 G; ]4 u) q: `( U- j( i
unsigned int PINMUX19_REG_old;
2 P4 ?. M- @( \; q$ ]6 c! F unsigned int temp; 7 j/ A" V/ }# P' B
if(MCBSP_MAJOR)0 k7 q. R! C5 d k
{
6 \# z6 j" z( o) C1 J, ]# U4 }) S mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
0 M/ O M3 q2 `9 R7 x" Q/ A ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 z% s. ?5 |, u( W# V, `* W }
2 }! }) u. d+ X! i$ ~; G5 } else
+ N5 X. G+ `; x. k% D# m {
1 f5 X6 V! n; @* ?' g' @ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
! F8 u% I5 O* x+ [3 g3 m% l MCBSP_MAJOR=MAJOR(mcbsp_dev);( @. _0 i+ i* L" p7 |& c- E
}; I6 `0 f8 W* P- v: m
+ [8 b6 x6 x0 m! P if(ret<0)# o' ^& K4 Y* r+ w/ t/ l
{# {' ]* s' |1 \
printk(KERN_ERR "register chrdev fail!");5 l5 Q' a$ v+ ]8 b4 u
return -1;8 [4 R8 ]: A: p9 F8 H/ n s& `
}( o$ w1 ?: ?% a3 v4 F9 |8 x
, F& c, G! V( z: y3 [' c mcbsp_cdev=cdev_alloc();
1 L: x: Z7 G2 I/ o6 E3 [2 M
) ]! a6 \; P. z6 i3 ~0 {. i0 A if(mcbsp_cdev!=NULL)* U1 E/ r A8 `+ s, {
{
+ z+ V# H3 m6 f cdev_init(mcbsp_cdev,&mcbsp_fops);
8 W. b% P* Q! p8 M1 n+ ~9 d mcbsp_cdev->ops=&mcbsp_fops;- A6 f4 g0 v" }2 p; L
mcbsp_cdev->owner=THIS_MODULE;" q7 j4 N7 s, I! @$ {# v: f+ V
* {" x) S9 P( g7 R7 E if(cdev_add(mcbsp_cdev,mcbsp_dev,count)). W- P/ N# V2 v6 M O2 E- K
printk(KERN_ERR "register cdev fail!");
- H( e2 m. K: e0 s else. D: Q+ h( |3 L2 Q; D- F
printk(KERN_ERR "register success!\n");
/ g% ^3 S+ w2 r% ]! B6 B }5 i1 d# v5 _! y1 v8 R
else
* S: Z2 C0 q6 u! k) g% e) G {: F) n6 Q3 @9 E, A8 G
printk(KERN_ERR "register cdev err!");
* E. {2 m! M+ x return -1;' U0 W1 U. s* g
}. E3 o0 ^$ v0 Y
_7 _6 m7 a5 B+ {7 a6 G [ mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);& I5 [& P5 A: |9 {- |+ b- V j
if(IS_ERR(mcbsp_class))
" b8 u4 z9 P- n8 s4 }' L {
4 G% @6 W7 @0 C& H5 g printk(KERN_ERR "register class err!");8 t! E' m1 u. O. }2 B2 t& ~
return -1;% h, ^' o9 J5 C
}
/ I7 k2 w) O8 s device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
' N2 {2 e8 t- K( F+ M+ K9 X( |% y/ Y9 F
//PSC
6 m# d5 I9 `# K- R! ^; T$ t- B0 R //add Enable MCBSP
& ?& X, N' }4 W9 n# k; G; S //test
1 M7 d" J. U' e6 u5 C2 I temp = 0x80000003;
3 e$ Z$ O/ F ?: h writel(temp, IO_ADDRESS(MDCTL15_ADDR));
0 N) h7 w. T3 X+ j. [- m temp = 0x00000003;
* |0 S: l2 U0 W0 Y9 G; X j writel(temp, IO_ADDRESS(PTCMD_ADDR));
$ {" r0 ~" y" i @& Q
: s, D" i2 f7 G% i temp = 0x001FF201;" G# J9 V8 O. w' j; J. i9 ^$ A
writel(temp, IO_ADDRESS(PDCTL1_ADDR));# K3 f9 t9 \1 K0 N6 e4 y; V, u
! g) Q9 N) y2 L
//PINMUX
9 U5 h6 ~# m( `' O9 K //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,/ l9 N: q5 k( C9 ^ M1 Q
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 7 P$ D$ M; ?" s s; q4 D
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ! K3 F/ W$ e2 q& _
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( f3 m$ F7 u- k, \9 s
, c- m3 E9 z& r2 W+ y: S* z7 t //SLEEP_EN,EPR,L138_SHK1,L138_RC
$ w& ]/ Z& O8 }6 Y$ Z! ^ PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
. A* u! x- k, ~$ G ^2 I4 o9 q PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
# m v% y+ [+ J( V v2 N/ D2 W writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
7 I+ C/ N3 U% D+ t1 F A) S \
5 f9 E. `+ |0 f; E //RESETn,L138_SHK2
4 q2 E0 Z8 W! n# P, a9 Z: m! a( W0 n6 J PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% h1 O4 y3 M/ e" ?/ j3 k PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
8 E7 c% F5 R( c) Q8 i. y# H writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);3 l9 V" L" E! w" l
# k) Z0 E4 Y5 U6 P& t1 O5 M8 d' ~$ y
# P9 I# A* J/ r: Q
//SPCR Register
k/ J# Q) }+ U6 c' O //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset( T) A, Y& u: l& _
temp = 0x03000000;//(DLB=0)9 I& s' m/ ^3 @( g2 m
// temp = 0x03008000;//(DLB=1)) f% [- q8 B% H5 U( G# f7 p
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
/ X6 N$ Z! l: B, e! T0 C2 n temp = readl(IO_ADDRESS(SPCR_ADDR)); |9 o; ?0 b. \+ D4 w8 }
printk("temp=%x\n",temp);5 p0 P! p: o% t' G" h! `& a' L
& n" w+ e' Y3 G' M) ] P7 i1 j //PCR Register
+ f* {- K7 C1 V/ t5 j1 w //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0) \; | j+ U; p
// temp = 0x00000F0F;3 O, b$ i3 R, H9 L9 p! Y. u ~
temp = 0x00000B0F;
/ f+ |) G* l3 l( N0 { W& Y writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
6 b8 K7 z! Y( d temp = readl(IO_ADDRESS(PCR_ADDR));, _- C2 {1 {# w: E
printk("temp=%x\n",temp);
: ?. v9 N/ o! F. ^) x: c! D //SRGR Register
& l# D; Y0 i; u3 X //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
: B( b; f, q) P- |, t$ y% ]7 X/ E$ k //temp = 0x301F000B;
9 l' }$ y4 P8 g4 O; J4 _8 A4 { writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized + N! f' L/ D( |- `# N
temp = readl(IO_ADDRESS(SRGR_ADDR));" _2 X/ E7 I6 Y; B
printk("temp=%x\n",temp);* P9 r* I y4 U) x
//RCR
' B6 u/ Q7 x' |! s //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 ^& Y9 i5 H* H2 A8 f% @" a: ^0 y //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
! _; e* v$ W7 M temp = 0x00440040;. x/ D& ~- F5 z1 O+ D5 _
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
0 ^1 `1 t/ `- c9 ^" M, p* F temp = readl(IO_ADDRESS(RCR_ADDR));
, m! B8 `( o; O' X* x printk("temp=%x\n",temp);( l: \4 F; ~- O6 k8 E' X
//XCR" A0 S! I/ L' N/ {" _& h
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-11 Y1 m. `. L! J u5 z; d
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0" h- d0 ~. O! B2 `! V
temp = 0x00440040;, Z4 q- \' |! Y4 J
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
* C% n; N6 D0 m, v* J temp = readl(IO_ADDRESS(XCR_ADDR));
& K9 E0 Z; ~, p2 ?0 d4 j: X printk("temp=%x\n",temp);; A/ V& j, Y/ |8 T* X9 H; `
udelay(100);
+ }/ G: L9 f, N" A1 o //SPCR Register+ @0 Q- }8 _# \( I, l
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( h* u! y p& _1 U" c temp = 0x03C10001; //DLB = 0 VS DLB = 1 `6 x b& m K S, w8 b" ^
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled. Q7 c8 u/ j$ l* i' o
temp = readl(IO_ADDRESS(SPCR_ADDR));
* F9 T v& r! ?& B/ \, D printk("temp=%x\n",temp);/ B4 r+ f8 ~( k+ ]/ o% ~$ S
udelay(100);* h" y+ z9 t$ q5 x
& i8 m, L% D. h
//set GPIO direction6 m- R# `% z* O& g4 }7 u" {
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));; T0 a# p& Q8 V0 J' o
temp = temp | 0x00000100;//EPR----input' R, _7 ~( H% ~# Z$ c2 L& _7 h j
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output; B Z4 h _& v, i' P0 ]9 j7 g3 {. W- U
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . C9 G; b! u& R. `- P
( m9 z, \+ Q' Z" C return 0;1 {" b/ U; L* Q+ }. M
}
9 x/ Q8 V/ S( j. l; S# L, Qstatic void __exit MCBSP_exit(void)% k2 C- ~. U } W6 D2 Z
{7 G# T, y. b8 Q) U4 S
printk("mcbsp chrdev exit!\n");
8 \% T; x* `1 g. n6 p% ~ cdev_del(mcbsp_cdev);
5 t- l7 Z" \' w7 X+ E unregister_chrdev_region(mcbsp_dev,count);1 |) {: C# ~2 E, p
device_destroy(mcbsp_class,mcbsp_dev);
5 `+ }* L8 J, Q1 l2 v# R1 B6 n class_destroy(mcbsp_class);
- W$ a0 L) L$ z% `! K) _}
, Y( B% @3 ^. D8 t" l8 E5 vmodule_init(MCBSP_init);: {+ A( g( I e! g/ ?' p; _
module_exit(MCBSP_exit);& p; i6 t. D8 J5 J
) W& r6 ?1 s+ z9 u- X& l+ l1 N; H
MODULE_LICENSE("GPL");
* C5 S) G8 @* I, R+ u: Y( ?% i
0 [( @' c, D9 G* b8 W8 y4 b& v我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。1 U2 t+ i: Y, |) `0 r. w
我的应用层的测试程序如下/ d. d& K# F' X& x& `2 O( }
#include <stdio.h>
! ^+ m+ b3 U' A2 q. i, V#include <string.h>- m7 {9 q" O5 Z+ y7 K9 i
#include <fcntl.h>2 Q) t$ V i1 K) r3 D2 L
#include <unistd.h>
N, s$ j' ]' e+ \9 F$ [7 p2 j#include <signal.h>3 X6 [) T8 K2 h# N1 |9 _8 Y
#include <pthread.h> //线程; k& }+ X, \# r+ C
#include <stdlib.h>* Y" R% K3 F. a6 u
#include <pcap.h> //捕获网口数据
i! ~5 k1 l* f: h/ D* T#include <semaphore.h> //信号% L( v3 ^" d& W1 r5 S, j7 M* h! _" `
#include <sys/types.h> //消息对列
" X: i4 f/ o3 j z2 s; B#include <sys/ipc.h> //消息队列+ x1 x- D$ u- r( }, [: v
#include <sys/msg.h> //消息队列
- M" o; V/ S2 o: Y8 }#include <sys/select.h>
; B* f, \& i+ J8 I% H7 g#include <sys/syscall.h>
: Y' T, x/ a J& X; l& S#include <sys/stat.h>2 T* L! I; ~% O( ?
#include <sys/mman.h>
) w! o+ Z0 r1 X7 d8 x$ ?0 k#define msleep(x) usleep(1000*x)
5 d2 A! k# V* R" N8 e1 K/ F: }1 E6 C4 z: `+ i; }9 }7 |
int main()
1 H, y* R6 O* a2 }{ & l' K5 N6 |# B t* [
//MCBSP,ARM与AMBE2000交互设备% S' z8 l7 m) i' }: O
int fd;+ Q. v& H" ]/ r [+ n
unsigned short data_write = 0x5555;" @! s% W( \( I* U) `8 ?
unsigned short data_read = 0x00;" | y4 F5 L- D0 t! s
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( J# r/ j& V! ^3 f" Z7 G$ {
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
/ h) ]3 b' ?& u9 p ^
5 t& p/ ? k$ ^# f* J% L if(fd < 0)
$ _0 N0 Z: o- K+ D {
- x8 @' [2 Y" x7 l8 K7 @ perror("open failed\n");
7 q: A- f3 z* P% Y% q) ^. u* ~; p4 c( B return -1;
/ g/ F5 x, K% y }7 d0 i4 j- A6 Y: M
9 y, ?* B# \) i while(1)8 M6 I$ R8 l& u: T/ z
{' B. k* `1 [! v; _) ?! S1 y
: T$ J) c0 `3 y7 U
//AMBE2000每次读写是24个字为一帧
! G9 Y r9 u: r4 @- _2 H //写数据时将数据在底层存储起来,等到中断的时候再发送7 I5 r( Q+ F P5 Y. ?
//AMBE2000输入数据是以0x13EC开头的
8 O3 w/ v9 _" W; O1 Y7 h- } write(fd,&data_write,sizeof(unsigned short));$ Y% S, B# ^' Y; {1 z; k4 x- Q& R9 v
& g7 B. D% j3 s+ C% s5 h9 V+ l4 Y
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 7 m, Y5 b" R! \. p0 z5 C& q
read(fd,&data_read,sizeof(unsigned short));
0 E: @* r( p& t/ A d; F( z3 z5 a5 R, g
if(data_read == 0x13Ec)/ E$ u% w5 V7 k
{* @) M5 u3 i7 z/ X4 P8 l7 I
% u) F* O* x1 H- u6 _ printf("data_read = %x\n",data_read);0 G" J/ L6 z# w# d1 t N
}' y! E5 G ]' H/ |
. u# ^4 l o" R3 _' z) h9 v msleep(10);, m$ N* R6 J% D
" e& Z, C( k3 Y3 N4 j- C" \
/*
. c9 L0 q3 B- ^. G" _: H ioctl(fd,1); & @9 B6 h v8 d6 F
sleep(1);8 R% _9 |3 X1 ]7 F5 U% B4 m
ioctl(fd,0);
9 @+ L; n7 ~7 k' ]* H4 c8 b$ b/ Z8 } sleep(1);
1 P# B% }' _8 ]! G0 @2 f, ` */
5 p% _7 ]# x" N7 T7 b! h9 R. l }
5 L6 `1 ]! p: V$ a" u return 0;; H# ^' Z4 B ]( F! ~1 P
( }- E# [# s& s) G6 T! }5 H- Q: D
}3 J# Z6 L2 Q& y2 Z9 y: M% y
+ F: x/ m5 A+ {6 A多谢各位指教,谢谢! 急
1 ^" m0 j3 N: i+ X* p" P
$ \% C. j, R% d4 ^9 F3 @$ P( n( o
+ H! v0 H, {5 [
7 m) r" D3 f+ ~2 R! I
' U- u+ S9 `0 Y% w" H# O1 _ |
|