|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ' C3 a2 b5 @1 _" Z2 F w
/*
- T+ [% O- Q& g- X. Z+ n4 T2 L0 P * Copyright (C) 2009 Texas Instruments Inc
~& e! j( s% ~, h2 E5 u3 l! ] */ e# l1 P& V" L
* This program is free software; you can redistribute it and/or modify
4 O3 \( ?$ S- m: j- a/ ?# { * it under the terms of the GNU General Public License as published by! n" ?. `! d# P( E; O, s
* the Free Software Foundation; either version 2 of the License, or! d! e/ Q9 E- Q8 X
* (at your option)any later version.
+ a/ u. a; Y/ O' ~0 U- }- k/ i *# q. D& U' W2 C8 J7 o
* This program is distributed in the hope that it will be useful,
* N E) h' f2 z$ g: I% _; n+ L * but WITHOUT ANY WARRANTY; without even the implied warranty of7 t/ L( t: G- P! e3 x, V& z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* i! _: G0 {; @. S" g9 d) x* D: G6 o
* GNU General Public License for more details.. V9 F: e3 {. l1 a5 a3 ]! j
*6 y4 z' U7 {! Z! Y
* You should have received a copy of the GNU General Public License0 k4 K; X3 ?; N7 @2 l6 i
* along with this program; if not, write to the Free Software
, q6 u3 ~9 ^1 Z: v5 r% B" S1 x4 \ * Foundati6 @: a) f' G! {4 P# B3 a C
*/
$ d S' j6 [. t. E#include <linux/module.h>
1 x- x, M! Q0 V#include <linux/init.h>' j; M0 c2 m) g' }: r
#include <linux/errno.h>
v B! Q2 D$ T% [% [#include <linux/types.h>3 s$ q2 ]" U7 [
#include <linux/interrupt.h>
' r$ V1 c: U* w#include <linux/io.h>" O3 U* H+ D8 W0 q* V o; `
#include <linux/sysctl.h>7 G5 V9 h. \- B0 E# [
#include <linux/mm.h>
6 N- O1 ]* j5 x6 c* P& e# a#include <linux/delay.h>8 b+ O3 o0 i- u4 W' ]
#include<linux/kernel.h>. h' h$ r. F, v; c$ e
#include<linux/fs.h>. s7 O8 w7 Z' D7 V
#include<linux/ioctl.h>
( }$ z) u1 s5 Y+ m, G+ U#include<linux/cdev.h>' h: _0 V k: M3 g6 w0 t4 b
#include<linux/kdev_t.h>
. N9 c. _* t/ |9 D& c7 }/ i# C#include<linux/gpio.h>
m. w+ T# X; }+ F1 V) J+ s& G) M( w#include <mach/hardware.h>; G* F- }, o4 y+ o3 |
#include <mach/irqs.h># Z5 Q" W2 S7 l6 M4 I
$ U# C- v# A. ^. H. q8 B7 E+ d' M#include <asm/mach-types.h>9 L) F- d* f1 e6 m m3 J
#include <asm/mach/arch.h>
& O2 ~ `! w% P( h; L; C" S#include <mach/da8xx.h>
$ P- T8 m, U9 t: |#define SYSCFG_BASE 0x01c14000, ]" O" Z5 ~$ _" r
#define PINMUX1_OFFSET 0x124 / w8 O3 { g K8 L. d; a: V
#define PINMUX18_OFFSET 0x168 9 Z! }: \$ z6 R7 }$ Q" p
#define PINMUX19_OFFSET 0x16c
. B" b7 [5 K" q# E5 l#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR- ]$ q) c3 ?2 \( J/ r3 z9 k
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR; E- s0 |0 m, W+ R* V
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
% c5 r3 g2 b: \4 \#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR/ j% |( N7 \" L+ {
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR- {6 W# C* b1 g
$ O0 a! E* P$ T3 ?- a
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR& J/ D% {2 T6 ^, l1 d" [& G
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
$ d0 D4 q; w7 u/ M, U//PSC+ @1 c' B9 M( i$ o9 f
#define PTCMD_ADDR 0x01E27120 + [) X& j5 w& y5 t
#define MDCTL15_ADDR 0x01E27A3C
& s. O) \5 S* `' p5 _8 |7 C#define PDCTL1_ADDR 0x01E27304. U9 j3 w$ {' v$ w/ ]
//GPIO8 direction8 `1 I4 Z, D5 X, m
#define GPIO8_DIRECT 0x01E260B0# v* y* ]; C- n. \ Y8 K
#define GPIO8_OUT 0x01E260B4
! X7 [6 V: i$ l7 ?; |#define GPIO8_IN 0x01E260C00 g) q* d' y9 |+ A
- ], N+ ]) R7 O+ n* I
//#define MCBSP1_RINT 99 7 W, p, X3 E; _" f7 y
//#define MCBSP1_XINT 100
6 J" I. s2 C* d' Tstatic int MCBSP_MAJOR=239;
; b, Z% u/ \; l9 ]2 u0 estatic int MCBSP_MINOR=0;; |+ G4 S% {+ O7 I! N
static int count =1;+ e1 \7 z P5 r* i! b- ~# X
3 d0 k5 g: m7 S |( o' D; \* ?#define MCBSP_NAME "MCBSP-device"4 ^, f S& A% Q9 B# O
/ F! q/ w# D5 D0 ?% ystatic struct cdev *mcbsp_cdev;) p2 ~5 p& k: u* u4 B. A; q1 [ {$ e
static struct class *mcbsp_class;
% k0 o8 d, F( Y/ Cstatic dev_t mcbsp_dev;6 Q! ^) ^ l- \4 Z% y
unsigned int DRR_data;
7 @. w' t' y) R% ]* K* Xunsigned int DXR_data;$ g5 x9 A* W0 {* q: E3 @ ]
static int mcbsp_open(struct inode *inode,struct file *file)
- C. \' e0 A$ P- [% J{( {8 y$ H" l1 c8 m1 V1 x: K
. `: P; o4 H' Y3 O' l
//interrupt enable,initialized
+ N: C( T1 f# G, d* m unsigned int temp;' U( Y: P- p& g/ [: y' z
//SLEEP_EN(GPIO8[10])---09 q" n, a1 H: u) d" K2 D+ d1 [
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- b+ {# @8 v7 Z# X- _. i* k temp=temp&(~0x00000400);: W/ b) d# P6 U1 F1 z' h; q9 T7 l [: S
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
( V" ]3 B X; F Y* I6 p //RESETn(GPIO8[8])----0----1
+ C5 @4 I' d* Q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
) \4 m5 N3 @+ R4 K' a- c/ Z temp=temp&(~0x00000100);
/ @0 w3 g( _2 S4 Z$ _ O. V __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0" o8 l. @! _# }- t, y
udelay(100);% Y$ k1 i2 _- A/ w; e
temp=temp| 0x00000100;
- Z6 `$ M0 ]) G+ [# Z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
# Q5 \% ] w/ L6 F9 y4 i udelay(100);! ~7 o0 {, f1 Q# v# A, r5 |
printk("open success!\n");* G( `% a( z M1 _1 Q
return 0;
" |. |) u. H4 @ ~+ r) J Y+ j}4 e2 L% C& N" y$ X$ z/ B2 [
# G2 t$ a8 k8 T3 t) J; }7 b' v; @+ r
static int mcbsp_release(struct inode *inode,struct file *file)0 v8 c2 c c4 y4 A) L }! q9 x- W
{
" h& r& x( b3 O' y, `6 q printk("release success!\n");1 O0 e' l* M, Y/ r* b. D& K( A
return 0;
/ |! T% j* J% L}0 b$ x6 p0 d$ }$ [/ u; u% h
& X/ |0 s1 i8 I% Ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
/ a2 \1 u7 e* i5 v) `* `" S6 f- E$ N{2 H7 |* [. D' A, ]% C* d5 J
copy_from_user(&DXR_data,buf,len);5 j' U5 Y7 b' ^8 w
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
8 l! a, \8 n8 p8 C- \ return 0;
- f" ~0 i) F" A; ~8 J
4 B6 i2 ]0 K' h7 p}
) G( {" X2 ?( `
4 u8 A4 o1 [8 e8 F! _* Kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)' ~3 M, w& r1 z) t, f
{
" p9 ^# f9 h0 n3 Y DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
) l& {8 K1 P- F) n: b) O copy_to_user(buf,&DRR_data,len); / H+ U4 m' W" {3 W& c5 p9 q4 w! m( z8 [
return 0;# j& J5 Z# w. J/ Y/ i5 b9 {( v
} X9 Q0 q& j8 q, [+ x6 L6 ^# K
% U4 q" y3 E" w" C6 R$ n0 A2 t/ P# s: E/ q7 ]2 C8 k
static struct file_operations mcbsp_fops=- g- \, [- R( t
{
& m7 f# u# Y, b8 r3 O! T .owner=THIS_MODULE,; y5 x" Y: K' M4 f# U
.open=mcbsp_open,+ e& n3 s* N0 N" U, ]" k7 l
.release=mcbsp_release,
8 J- C2 e& {1 d8 t .write=mcbsp_write,( z: |& Z& j4 X9 x' N
.read=mcbsp_read,
6 L& F- B1 ]2 @' W6 Z" m0 x. x};
, k5 T" O3 N0 v, r! k! S: B- k7 ystatic int __init MCBSP_init(void)
6 ~3 k; V1 ]4 ]0 w& h{9 \" ]' p/ ^. }4 C, }, r2 p( C2 E
int ret;
, h+ w, s ]7 d9 C unsigned int PINMUX1_REG_old;
. o$ S+ N5 Q' G( p u unsigned int PINMUX18_REG_old;) d* ]8 C: n- k2 k
unsigned int PINMUX19_REG_old;
3 p) H8 O& y/ F) ]. W unsigned int temp;
2 l& t& m, X8 b- _$ S: _( D/ q if(MCBSP_MAJOR)8 U& i r! H( G
{
; y- O5 V2 a( n/ [- ~3 ^# C$ O$ N mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 Y/ b# S1 N& g
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
2 ?! N4 }% B& Q7 m }8 u& x/ X9 u* }# [8 g7 ?
else5 |' ^6 z6 B" t; b- g- J
{; t+ l* g" J3 w" P. w1 F2 Z
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
. V3 S( [% n4 f* S6 s- }6 Q MCBSP_MAJOR=MAJOR(mcbsp_dev);
# X8 N# M% S& D I }+ n, Z/ V- x% l K4 |8 P
$ }! ^4 q5 j' M3 s& ? if(ret<0)
* t& e( a+ N! `' J$ |% q {/ @: c8 i! j' T: W" S
printk(KERN_ERR "register chrdev fail!");+ A% m# O" S, Z: s+ R* p, M
return -1;
# {, |0 a' w. x8 @. t! X }7 M. U/ Y' |0 @5 o# H( R
! T0 P+ K. r1 e1 R mcbsp_cdev=cdev_alloc();8 H( ~& ~" c6 F
1 \/ O, j' ]" M if(mcbsp_cdev!=NULL)# ~+ M% C" I8 L! a7 f1 k' d8 r
{7 t# Q9 j9 B7 i" A! y
cdev_init(mcbsp_cdev,&mcbsp_fops);
4 h$ Z( n5 D C8 @+ L1 e/ N mcbsp_cdev->ops=&mcbsp_fops;! H' v2 f1 {. `
mcbsp_cdev->owner=THIS_MODULE;
7 u. G" J) N! }/ a2 w 8 U& z: f: y$ n2 E
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
6 z+ @/ ]6 @# H2 H; a printk(KERN_ERR "register cdev fail!");: ^( M9 g# N8 U* n# l
else# W' k: {+ K5 J2 a: L8 }8 h& ^& j2 c
printk(KERN_ERR "register success!\n");: w2 r6 m" `- l4 z9 b+ O
}" A. w5 K3 q8 }! q3 ~
else
' A5 l+ t' l) L& K- D {
1 z! W! O7 x1 r, W4 p; I printk(KERN_ERR "register cdev err!");- n6 z X7 P& Z! I. a8 `
return -1;( S% p5 t! {, Z2 }
}4 q5 a3 \/ n% T! v: A8 S! s
# X4 A- n. }: P6 U mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);8 b( }7 U* Q1 y9 q) _8 l
if(IS_ERR(mcbsp_class))8 \# s! ^- e9 D) {' Y
{
1 E( l, `! ]) ^4 M$ k8 r+ s printk(KERN_ERR "register class err!");: G- p' D! K, C6 b1 e9 Q% L
return -1;
7 ?4 H) n2 q' Z0 ` }
' L) u v2 l8 Y8 c E+ V) s device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
4 N0 @) E( d7 A1 x% h) P; |3 x$ J5 F4 ^ V1 A) n
//PSC+ N; ?' [* ~5 I
//add Enable MCBSP6 k- e# }) J# ]8 Q' S% g
//test
9 m2 t- m2 }1 H: ]9 D temp = 0x80000003;# i: Z; \! P' E% D9 r0 J
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 q( i0 u) T9 Q* ?+ ^( M temp = 0x00000003;
" g% ^* M$ n$ X+ ~4 i writel(temp, IO_ADDRESS(PTCMD_ADDR));
' e( `* Q1 @/ U E3 M8 j2 ~- z& k . h s0 m7 R- x8 U& m
temp = 0x001FF201;! Q6 B3 B3 E. J# C' t8 U8 ~+ B1 _' k7 R
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
3 K& ~: W' L# f+ C' x . B- \; a; L) b0 L) C0 g5 v
//PINMUX . D/ Q: p+ p: ^$ U/ c. r
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR, L) Q; a% R( j
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); * g# g ?' ~2 z/ u0 j
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; / }* P0 h7 M0 \% m- @& [
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 t# a- c0 G% D
4 S( c2 g+ L8 X //SLEEP_EN,EPR,L138_SHK1,L138_RC
9 i: U: q" v! E" m9 }6 w! y PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
3 ^9 A; h; r3 G: t) |( ]' x5 A PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
( p/ H: d% s6 G. T0 [7 D writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 k; @/ M. O7 B) o( ?
7 Y! Q0 L/ a `' o( b8 [ //RESETn,L138_SHK2
. ]$ e, `3 R0 P0 G% K! L3 q4 D PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 6 X, n6 V$ u ]7 |0 W
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; / e+ X/ b6 }. V9 }
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ W \8 [ d/ D. O
; L h4 b+ f3 q e: j/ ~
3 y' ?! m+ |9 w$ {5 n' L0 `0 B //SPCR Register& A$ d* r; j# X$ ?+ K* G% c d
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset0 P' e! V: b5 C" v6 N" J3 E
temp = 0x03000000;//(DLB=0)3 N J$ u, I4 a# g$ H& d7 Q
// temp = 0x03008000;//(DLB=1)4 U: b( @ B9 N% C5 ~
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
6 A! H+ M2 N1 ~ t- X temp = readl(IO_ADDRESS(SPCR_ADDR));" E# {6 L3 _, W4 ]5 z& S
printk("temp=%x\n",temp);
4 u2 h7 U; `) I1 X9 _
% d, \; d4 f; x* \0 [5 ^2 D //PCR Register4 z0 }$ l! d; B% m: ]" i
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) P3 g2 Z+ q! }7 Y4 _( I // temp = 0x00000F0F;2 T) A- P5 a0 \' k
temp = 0x00000B0F;6 M1 g. s9 w+ H( K4 E7 Y
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
: b# N8 z* m6 P' ~ temp = readl(IO_ADDRESS(PCR_ADDR));) z( R. A' O+ u5 w
printk("temp=%x\n",temp);
0 v5 K1 @% l" f/ s# y5 R% c9 T% Y //SRGR Register, r) J! Y( q& y+ ^( E. Q
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
5 s/ v' X/ {7 z% W' Y! w //temp = 0x301F000B;
5 v, e* Z( Q3 ]9 L9 m writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
( l' N& u+ ?; R1 o T+ R5 v# C temp = readl(IO_ADDRESS(SRGR_ADDR));& Z' b' \5 G* g
printk("temp=%x\n",temp);2 \9 [, v+ u9 C* o& @6 _: J$ o
//RCR6 }$ T! t4 J3 D
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! }0 a. n6 p. Q3 _: |2 X( D1 y3 ?! Z
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0" @' j8 f0 h6 J/ ], H: Z
temp = 0x00440040;& B2 Y6 F* t2 k4 \" W$ j S
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 6 E# L5 q4 E4 U: E
temp = readl(IO_ADDRESS(RCR_ADDR));
; `( B, s% O: A- V- | printk("temp=%x\n",temp);& k5 U: N& i4 M W3 u3 r# B! V
//XCR) i# `. ?+ ?+ f( o$ t
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1" h8 G6 l' M8 }7 C
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0- v- U+ Z7 p @
temp = 0x00440040;
9 x5 \) q( l8 J1 a writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
$ U1 r" D k- Q$ L9 {8 t1 Q7 }( ~ temp = readl(IO_ADDRESS(XCR_ADDR)); B7 j8 C8 x, S% N! V" t
printk("temp=%x\n",temp);
; }' Y% g# \5 Y. @1 q6 h; B0 `$ n6 a udelay(100);
C# k" \7 x0 O" @ //SPCR Register2 t4 q4 y; L# r$ \; ^6 S! c1 J
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( D" q$ G1 o2 H D temp = 0x03C10001; //DLB = 0 VS DLB = 1
% N" Z( J; T5 t: O writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled& L6 X% Z0 {1 s" d: j3 k
temp = readl(IO_ADDRESS(SPCR_ADDR));
1 Y, _; V, ~% D: L! _ printk("temp=%x\n",temp);6 \5 |, T0 U) Z. w' h* `
udelay(100);3 O# o1 w1 J2 j2 W) N# W7 t6 n
; X+ H; p: z1 i5 [! ]
//set GPIO direction5 T2 e9 J8 ]1 Z' B
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));+ V9 s9 t! N; K! ~* D2 C2 M/ S
temp = temp | 0x00000100;//EPR----input
7 c9 y: p" f; E' n2 r( R3 ] temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
0 t( b; q+ G6 M* v __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); , n) e4 W+ L1 c7 o9 H
* a4 O0 m. F+ P/ g, M L a& | return 0;
0 }% j/ d& A$ D& K}
! ?0 | \$ Z- U4 ~* W# P) lstatic void __exit MCBSP_exit(void) X: p7 K7 ~& p% x
{3 w8 g- ~6 y# o: Y! }
printk("mcbsp chrdev exit!\n");
) k" S/ n" u7 O. ^* s cdev_del(mcbsp_cdev);
$ u/ y- f3 A* {' \# V unregister_chrdev_region(mcbsp_dev,count);
" U* h- X E" E# _2 M% R* H device_destroy(mcbsp_class,mcbsp_dev);7 l+ z' I- F0 k* n( m2 c
class_destroy(mcbsp_class); r, B) v$ ?5 K0 O4 y* W$ c2 s8 O
}
& C( {0 ~4 s1 M7 |module_init(MCBSP_init);" `% |; L" q; N2 x/ R. d& c
module_exit(MCBSP_exit);
) ?! o9 t) X c; y* d9 J, a
2 `' b, }: t' C- Q1 F. C" GMODULE_LICENSE("GPL");
4 j, S! S# ?% i5 ]. [4 `. L5 Q: {* x* x4 ]. G
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。* G2 H7 G' D& ?$ E5 ?
我的应用层的测试程序如下
4 G6 L' ]4 {* N' L& S* k#include <stdio.h>
) s* [ X4 C% p#include <string.h>: @# m1 {/ g( a
#include <fcntl.h>: }3 a" c3 ]4 [) N
#include <unistd.h>
- ~ Z; j, o8 l#include <signal.h>% s2 D' E1 |* s8 ~3 O! l. o8 s
#include <pthread.h> //线程$ E9 ?* k3 N* h0 r# G
#include <stdlib.h>
! F& J. Y* I" a# L( H9 t! F- R#include <pcap.h> //捕获网口数据8 \0 ?. j6 k7 T
#include <semaphore.h> //信号
9 L: U% |! y6 d#include <sys/types.h> //消息对列/ r6 j- C8 M5 p4 m: D/ _1 h
#include <sys/ipc.h> //消息队列* c3 F6 k& M4 t) O& T
#include <sys/msg.h> //消息队列# j1 N% p2 ?* D, Y& y3 n
#include <sys/select.h>9 b! o$ P$ D& g I) T( L9 I
#include <sys/syscall.h>4 n9 j ~+ _: g1 m8 {+ K
#include <sys/stat.h>2 b, g) A# |7 G# I6 {3 |. |
#include <sys/mman.h>
; n% u) T4 [# I#define msleep(x) usleep(1000*x)
. ^% j3 V) A$ O8 ^
& Q1 W; j, z% vint main()+ g T8 t/ @6 e. F/ R! Q& \2 {
{
% E3 ^! p$ k5 y5 K4 s E/ o0 f$ b! n //MCBSP,ARM与AMBE2000交互设备% M4 |2 U& N# x! y& `" _1 _
int fd;
, l4 J t6 U7 ?0 V& ` unsigned short data_write = 0x5555;
: L" y8 S4 L& z, A. P( W unsigned short data_read = 0x00;
) {# W @/ V! i4 | k1 B, o, e% g fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
# M8 X& ]: N. g: i' X // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);& r6 H$ S A0 ^9 u
0 z0 P" V& d* F6 x( r if(fd < 0)7 l) g( J [: ]8 ]5 J# R
{$ q' Q/ j9 h# L. z% ]4 k& q
perror("open failed\n");
. r* f+ i5 n$ t# i1 k return -1;
* i5 |9 a7 }; {$ w4 P9 ?. l; M }# ?. T. O% N, M c5 l
; H' y, A5 \2 f+ S
while(1)0 d; A8 m9 Y4 e* s& F @5 `8 O
{
- [0 {- C( R* x4 \ K X% T 3 `& @ p; {2 v0 O- ~% L
//AMBE2000每次读写是24个字为一帧 L* P; R, W6 \1 m# F9 ]) G9 O( E
//写数据时将数据在底层存储起来,等到中断的时候再发送
$ n& W; R$ m9 @) z- J% I //AMBE2000输入数据是以0x13EC开头的$ [/ K& {/ U9 ]8 G& j. s4 V, y8 V
write(fd,&data_write,sizeof(unsigned short));, f' V3 E1 X* r. n+ P! [
) l/ v; S3 R/ a //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 % q; `3 r$ D" c8 p% r( G
read(fd,&data_read,sizeof(unsigned short));
: S- T5 D8 Z8 ~; X 5 l6 o3 R+ `/ h" F( B
if(data_read == 0x13Ec)& a9 s. X1 m" s
{
6 e5 W# Z, ]3 Q w- S1 @& h: P/ I
printf("data_read = %x\n",data_read);
; W' n& G) ~$ E" o% j, _/ J }. ^& z5 ^ Z6 F
/ U) ?1 N0 g$ M* h3 Q% ]
msleep(10);
- J# C" U; G4 p
8 o) U9 I: f6 j* B) o+ f: r9 _ /*
, L2 S& q4 C' k( K2 {. C5 N% A4 Y ioctl(fd,1);
; J3 X d" V: u8 N sleep(1);
* O9 s+ C. B5 s4 ~% D. `# q8 _" v ioctl(fd,0);
8 L+ m3 ?" H6 M$ m4 z; h$ ~: x sleep(1);
+ S9 P/ o' K/ G1 z& }! c1 k2 v */ . \% }9 E" t% l3 o. v
}
; x# ^; Q2 z6 n$ L return 0;
3 `# k# J9 B. V' e8 g$ L* C, K / u4 r Q8 a# z4 R4 ?1 G
}8 G& i" {" A) ]0 {
& J. z+ \: D. s
多谢各位指教,谢谢! 急* ]3 ?- }' o; p! m' |. f/ s
0 A+ {# g! o! O1 l4 W k
- G% ]- w5 W0 J# g# a
* f! a' }4 m2 @1 M# }' v& a
% y3 N% E3 i& B3 W+ ?8 R9 I$ @
. t C; S6 E2 K1 F- s9 r% e |
|