|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
8 h+ j+ ?- b' T1 ~9 F5 k5 W/*
, C2 i) c( `+ _% k * Copyright (C) 2009 Texas Instruments Inc
6 {3 c7 T# z. J9 B5 L. l5 g *
( F' t5 T. H8 s! U- x+ r/ J9 n * This program is free software; you can redistribute it and/or modify9 G' c/ {6 e4 P* R* A) ?: `2 O
* it under the terms of the GNU General Public License as published by
8 p0 z* _6 g2 p, A * the Free Software Foundation; either version 2 of the License, or
9 b9 D/ T+ a, d, n# b! R. V) ? * (at your option)any later version.
2 h8 B% C7 z9 x2 @8 c8 h */ j! F+ h" I- Z" Z1 o
* This program is distributed in the hope that it will be useful,
' L! d" B- ^2 t" M7 g * but WITHOUT ANY WARRANTY; without even the implied warranty of K7 R# }3 D6 `0 z( x! Y0 M
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1 }4 x/ N4 t4 R0 n * GNU General Public License for more details.
( I/ n' H7 o- j2 _4 x1 } *
" p+ z4 e) w) v- p, S * You should have received a copy of the GNU General Public License
R% I7 `8 z8 m2 C * along with this program; if not, write to the Free Software- e+ @- Q3 D( M% G/ T) d& x) `
* Foundati8 e" D1 ?- l4 P+ X0 t4 l$ s- j
*/2 D! x5 p1 ^$ p& O% g9 }6 w4 Q z
#include <linux/module.h>
' }. c* Y; l# E: u6 T4 |: ^#include <linux/init.h>! j1 Z- e) E3 s0 N
#include <linux/errno.h>
6 B$ K# M. O. v+ G: k j% }" P#include <linux/types.h>
; Q/ n; c0 W2 O, p+ _: E#include <linux/interrupt.h>
- F5 l1 S% X8 O#include <linux/io.h>
8 L9 G9 M, Q/ v6 I& ^& u#include <linux/sysctl.h>
* I- i. q& j2 J- K& l& I* j#include <linux/mm.h>3 i" U- G' P3 ~
#include <linux/delay.h>
c7 f" h9 U( Q- C% H+ h#include<linux/kernel.h>
- {; S9 r6 ?0 F# M6 [ I" D3 N9 X2 C#include<linux/fs.h># l @5 b0 U& m/ U! P
#include<linux/ioctl.h>( k, J: C, v4 | L7 M9 D2 O
#include<linux/cdev.h>7 H8 ?' R& u4 x
#include<linux/kdev_t.h> ?" R7 q. J; x
#include<linux/gpio.h># G, ^- M$ P |* h
#include <mach/hardware.h>
' s8 n2 V5 r! V#include <mach/irqs.h>3 J- {1 N! A" f
# ^& C \# @1 |! I3 {
#include <asm/mach-types.h> n0 g. P* H* m& [/ V/ b
#include <asm/mach/arch.h>
. B, T3 w% M: i% ^( x n$ V( I#include <mach/da8xx.h>6 ~1 d: x J; P
#define SYSCFG_BASE 0x01c140003 L/ x6 \- {6 p4 ~" o! N& Z
#define PINMUX1_OFFSET 0x124 # b0 W. Q) N6 U2 }' r; P8 d
#define PINMUX18_OFFSET 0x168
& k$ q! g1 ?( k' a# |2 M8 k#define PINMUX19_OFFSET 0x16c
& E+ Z8 i% _& @8 a+ ^; f1 a \#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR' x3 D4 u1 P& h, n
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR) p. k/ B. g/ {. {* F
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
8 Q/ x- @! {+ C& c6 {4 R) t#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
) f8 H; o/ b# t7 I4 \* P#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
: _$ a" J- a& q0 y% ? 8 D; {1 l- I4 _6 V( q0 z
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR! N- y/ r6 h2 u+ x3 Y6 \ S( Z
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
3 J# X3 n. D) c1 r8 e//PSC% \9 s* l+ K9 [0 M8 i
#define PTCMD_ADDR 0x01E27120
0 u, s. W9 a2 Z/ F% p) N; I#define MDCTL15_ADDR 0x01E27A3C
% B6 N! |6 N8 `% |2 _6 N) n; i#define PDCTL1_ADDR 0x01E273041 ~% @+ ]1 N! Y- o f
//GPIO8 direction9 n) s2 \* k. d$ x$ m8 m# Q% @
#define GPIO8_DIRECT 0x01E260B0; o: U% W; X; v c ?
#define GPIO8_OUT 0x01E260B4& o7 c4 T) D/ R( v4 Q
#define GPIO8_IN 0x01E260C0
( d0 ~ k# O: l/ f$ k! R' H4 ^8 N( G' r3 t% n0 d, h
//#define MCBSP1_RINT 99 ' ?# W) B/ u5 l+ |( q7 z: v
//#define MCBSP1_XINT 100
3 G; o, q# _! A- tstatic int MCBSP_MAJOR=239;- ]& _ n5 s! u) P' h
static int MCBSP_MINOR=0;
' }7 i/ f- o& [% gstatic int count =1;. f" Z6 ^& W3 s$ X/ P' e. i
: k5 Z: l. f( x- Y5 A: q#define MCBSP_NAME "MCBSP-device"' T9 o$ \0 y) T! ^
8 v( g8 |3 s1 }; ]8 T
static struct cdev *mcbsp_cdev;
" M1 E' T2 {4 R8 r, h* N( q6 p* e4 \static struct class *mcbsp_class;9 n1 h+ ]9 z' @" Z
static dev_t mcbsp_dev;# o- {; l4 A1 v6 V+ z7 {
unsigned int DRR_data;
7 l7 N; S4 s2 }3 q( h0 \unsigned int DXR_data;
9 K; s2 J( n! s! L- I: A& X1 vstatic int mcbsp_open(struct inode *inode,struct file *file)' l/ L+ ?0 @! W0 _* D
{
1 \$ B* D1 U+ k$ X) M8 X0 R
+ j0 U. F. @0 P) f$ m, n T //interrupt enable,initialized
4 v* n8 u; w& T: K" s/ h3 ` unsigned int temp;
$ `1 V1 \$ s9 w9 s9 h, L //SLEEP_EN(GPIO8[10])---0
* E, h: q9 E3 M' |; r5 ~/ B temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));0 u+ K( n( N4 d6 j
temp=temp&(~0x00000400);' A t% {+ t3 u5 C! n/ a
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
0 i$ ^, r; a$ A- Y/ ` //RESETn(GPIO8[8])----0----1% j" P7 h4 |! Q, O; b5 Y; n! r. P
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 n: L$ E' `$ n R# P9 i
temp=temp&(~0x00000100);
0 e. {. T" g, q* \ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---08 y9 N9 A! m2 ~0 |$ M% M% U
udelay(100);
8 x' R8 @' R$ j/ Y temp=temp| 0x00000100;
$ [$ L( _9 i0 p+ s9 V2 O0 l __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
K, M" o! I6 k: L9 r* T udelay(100);8 Q( x( A6 J' M! B8 G
printk("open success!\n");! g& n* _1 k H$ q0 [9 T, j
return 0;
) q$ H/ s' l: d% M9 n}
9 K8 d' i& G4 J9 K3 C0 E
: {; I; Y1 j2 Q, b# Pstatic int mcbsp_release(struct inode *inode,struct file *file)
( v- d" B* F% e{9 h! {0 x5 i3 S: G4 }; I2 T
printk("release success!\n");
o( k) Y( o; ^2 G& _ return 0;
: k* g8 g; m$ V/ J}0 v4 r1 F0 ?" i) E5 R, W
) u0 A6 |9 |" A1 v& d
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( C& \$ E/ e0 M" u2 `. D- E{
- } |7 c" B- v3 z/ x2 O2 C copy_from_user(&DXR_data,buf,len);
1 }% A# p8 D) n6 l: c iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); + F8 Z: v: H2 \ s7 q d
return 0;) {' x" j) |! O1 v ]7 E& x) V$ M$ q
4 J% i; a+ p+ P. f7 \6 H}
6 g, u* [8 S0 y, i2 `
8 j# O9 R; P9 ~ |! Gstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)- W2 q0 A2 n$ k, v+ h# O
{ ( r& M8 o- a6 g4 Z6 e& R
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));8 r; ]# W) c' d, J: l, o
copy_to_user(buf,&DRR_data,len);
0 Q# R( p9 H' S" Y& V B, r4 r" b return 0;0 C6 O0 t+ H% \9 G! b7 _. t
}. c& D3 P% V9 \
3 C; x4 r6 D5 w: P* W. j
( V, C8 Z/ s( H( i$ ]static struct file_operations mcbsp_fops=8 N9 o; i9 ?) H, {' k8 h" p
{% r3 [ s( w% H3 `% y
.owner=THIS_MODULE,
; P+ c% ^1 U4 x, ] .open=mcbsp_open,4 l& u3 q: c0 y9 A* U
.release=mcbsp_release,
! `1 z* p+ y: V .write=mcbsp_write,
! l* R" i5 M4 q! k" P( @ .read=mcbsp_read,; `3 |1 r; |. a% ^& c9 z; O
};
8 t F, H$ V, q+ Estatic int __init MCBSP_init(void)" x, O1 `1 r4 d6 S# @$ d8 a$ T- D
{) I a: U S6 q1 q
int ret;
5 p( X7 J7 a$ A8 d/ m unsigned int PINMUX1_REG_old;0 A3 L r! \! ^4 l9 p4 R
unsigned int PINMUX18_REG_old;
" Q! p3 f/ }" f M# q! R' d7 J unsigned int PINMUX19_REG_old;
3 ~' E0 R) J% t5 N1 @' z unsigned int temp; 9 j! C9 i+ S4 ^3 R, z( j
if(MCBSP_MAJOR); e2 j) V; z5 o' `6 j! ~' K
{
/ b8 S( H+ A: E3 _ mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);. o, Z- y# T6 h, c- F
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);! M' f! s& K7 m+ I( s; _: ?
}% D8 E- ?7 L$ G4 q# C
else( z; i/ P2 ]- Q8 A$ [
{8 t( y/ q& x c1 v* V6 b% F& u6 U
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);3 |' t* i n8 T6 @' o$ G) y
MCBSP_MAJOR=MAJOR(mcbsp_dev);. S, o H \) o' W
}# i! E/ w6 ^% M' k5 F
: |8 `4 k/ d( Y5 w" K% r- J* j if(ret<0)
/ l$ {) @' I/ D$ i2 B- V2 }3 b! Z {
7 b' U% L4 u7 Z4 a4 z/ _/ j printk(KERN_ERR "register chrdev fail!");
: T$ N7 x! R) S( M# d8 E return -1;$ W1 s5 y/ ~6 w8 T& ?7 M4 ?
}, H. K! R, @: g. c; Y& m$ x
% a, C% {9 T( I3 c mcbsp_cdev=cdev_alloc();
" o7 a! U4 m( N! } . i; @9 c! s6 z( ^1 I8 K0 `
if(mcbsp_cdev!=NULL)8 W! Z; E" s: m4 U
{8 x7 l$ j* `5 W8 g! H! f
cdev_init(mcbsp_cdev,&mcbsp_fops);
" R4 D, T V4 r g. _# j. | mcbsp_cdev->ops=&mcbsp_fops;% S C' [: G/ Z1 H5 j1 h1 w
mcbsp_cdev->owner=THIS_MODULE;: m% ?3 G! c1 m
^* u w* p7 P, G) K& w1 f( {
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))! z) B4 M6 r: G( n
printk(KERN_ERR "register cdev fail!");
# ?* T/ T3 T" V- l# S. Y: C9 v else
3 q* j3 |9 x6 k printk(KERN_ERR "register success!\n");% t |, C1 m! m$ h* N1 V) E0 t
}
+ b& i- r6 m+ o; k2 A% X else
: P. I5 E3 T. I- H {$ E# C7 [4 w7 c7 G% }) B h3 H( E* H! ?
printk(KERN_ERR "register cdev err!");0 \8 I/ x1 u' d A
return -1;6 z7 \9 B0 k. M p
}
2 Q0 d) T& Z% s) P: n/ h 5 p- [2 o7 _( F- [5 Y
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME); I) p0 D+ }" ^, m% F6 Q' z
if(IS_ERR(mcbsp_class))# ~/ v [* z6 Y$ M7 k: t5 a8 w
{5 A1 Z! |2 D& V5 f8 X8 J
printk(KERN_ERR "register class err!");( M1 c# K3 M0 ?5 a6 ?# U
return -1;
' S) d5 l U W8 j: g% a' w5 b }' J" Z$ ?0 t+ K0 _2 N- g
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- q4 z4 {5 o" A* Y% z
2 C3 p% ^6 E7 B; K; k: _ //PSC9 _3 r/ U @: a
//add Enable MCBSP
. ]( d; o. g0 {+ m) U //test
9 c3 s1 x) }4 ~3 S2 l( e1 A temp = 0x80000003;6 g9 E: d3 E; `* A* ^
writel(temp, IO_ADDRESS(MDCTL15_ADDR));/ R: R3 |& ?+ m: d4 M5 }3 l
temp = 0x00000003;
( q7 A( {% p: I1 G# t! _ writel(temp, IO_ADDRESS(PTCMD_ADDR));: {' k9 V, e7 Q# d& j$ D
8 u, a: D7 k+ v' j, m- z8 Q
temp = 0x001FF201;0 |5 Q/ w& o" O8 n( F0 \
writel(temp, IO_ADDRESS(PDCTL1_ADDR));4 I& }; f' l' \3 b: P4 ]0 R# l
# E; F. y( |: x //PINMUX
" l$ N7 Y( c# k4 E2 C( B% j //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
: ^$ w; X; |2 B; o7 ^ PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 2 [6 t. `" V( y* R! ?- q6 u* _
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; % L, U$ G% Z1 [# c
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ J# X6 K) \; ~+ e
3 s% Q% `4 K1 F3 G; Y //SLEEP_EN,EPR,L138_SHK1,L138_RC+ j- P' K, c" P; d) ]( R) n; J4 _% R
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ S2 Q) x% j- a( S. L9 o$ X PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
) _6 B" z4 {. l, X2 l writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);8 ]3 x& Z9 J4 f" a n3 K
' t" N8 Y+ N% E& d) r' @# G //RESETn,L138_SHK2
2 K. V* `3 G1 _ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); . g& _6 n; l G0 t: O
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
3 g/ I4 W1 c8 ?0 `" g writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
. Z9 t( x: S _+ i( A # W4 x! y5 U, W% a
7 t$ F+ }1 h; d1 ~7 ~5 r
//SPCR Register
1 x" k$ I. X% ]$ C7 Q //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset) q& _0 T v7 s z# J! e
temp = 0x03000000;//(DLB=0)
8 J+ k6 q) J6 ~* W! r% ?: V // temp = 0x03008000;//(DLB=1)
& L! o& {5 s& @/ b0 d2 [ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset) p; N( h& J1 L4 S. q3 X2 M/ b4 m" [
temp = readl(IO_ADDRESS(SPCR_ADDR));
& G8 i! K3 o" I$ F5 I printk("temp=%x\n",temp);
: q: r! b, W$ r8 i- J# | ( p/ Z' ~7 k+ O: q
//PCR Register: f" O2 i- P% ^* ~
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( }9 m) m4 z: O# N4 ]* f, q // temp = 0x00000F0F;7 X$ X# @; b9 o% @& U
temp = 0x00000B0F;
$ W# J9 ^1 M0 ?: l0 K- j N+ }# ] writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
- t3 U4 P X) u3 S5 t% s; o temp = readl(IO_ADDRESS(PCR_ADDR));
' F, h* d& p! }; E7 l( |+ m printk("temp=%x\n",temp);
3 \* I) a( r% _ C s+ J( Y# b //SRGR Register5 h0 j6 d: k- \; N2 u) N, a6 |
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
* F1 L6 Q+ w2 _ //temp = 0x301F000B;# m' v$ ^. C3 v
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
$ c8 b4 ] o! t/ Q' s8 M temp = readl(IO_ADDRESS(SRGR_ADDR));
( ?* N1 l: ~( q# O+ Y& f7 ^5 K printk("temp=%x\n",temp);4 n# _# w* S g9 l4 x! z, X" a
//RCR& o; [& v. l# Q$ y: r
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 i D( d. u- [- X' q" v //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0/ a, Z& Z& q5 y9 |
temp = 0x00440040;
6 g6 s; D! J$ I/ `8 \" h/ i writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized i, r( |. I5 I2 v
temp = readl(IO_ADDRESS(RCR_ADDR));' o7 c- T3 V/ F8 N# m, }& T
printk("temp=%x\n",temp);. _. G+ W/ r. Q8 F b$ ^
//XCR7 z- K( z9 r) ]) z( P, c
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1) D( K0 S) R" g
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-00 Q8 }! y1 ^; }4 B$ m( c* _
temp = 0x00440040;! ~5 q+ I9 v* p) I( B* b! S8 D
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
( n) `3 o/ g& m, @ temp = readl(IO_ADDRESS(XCR_ADDR));/ S) q, s8 b3 m* Z
printk("temp=%x\n",temp);5 `- ~" S* ?; ]8 ` L+ D
udelay(100);
+ A ?; @. i" S( `, g4 r //SPCR Register% e0 I/ L) L$ Z% P; x3 K
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
8 P! O/ b7 I8 Y9 W6 q) s' Q' K6 k temp = 0x03C10001; //DLB = 0 VS DLB = 1
3 Y) c1 Q, w9 z1 t9 W writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled: D: v9 ^' ^$ n! J
temp = readl(IO_ADDRESS(SPCR_ADDR));
3 g i, @1 f5 X! j9 n8 k printk("temp=%x\n",temp);( R1 ~7 F, c# A/ g" O
udelay(100);, \4 K1 R2 g. n# L
5 H. J7 G0 y3 e4 B" L- |
//set GPIO direction
$ L9 @3 ^ K" P. g) U4 o* ~; e temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));3 {$ d" Z# l- d$ { J% [! x# o
temp = temp | 0x00000100;//EPR----input
6 z2 {# c* R# |6 Y* h" j: j temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. k8 D1 W4 e5 g; D" g. f8 p __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
+ z. O; ^9 V$ ^4 H2 ]* k# o
( q8 y2 \4 D1 o/ q: y return 0;
# D; p0 ]8 c( {- N- ]' a}2 C- Z2 P) z# n- T1 p
static void __exit MCBSP_exit(void)
1 y% E: g% H& m8 A+ l% ?{
6 S9 n, G3 F. ?7 Z printk("mcbsp chrdev exit!\n");8 l9 X- A+ ?- W+ r
cdev_del(mcbsp_cdev);
/ g8 B1 ~8 k4 Q/ w$ p unregister_chrdev_region(mcbsp_dev,count);
/ r+ Z- B5 t$ |5 B' W' o device_destroy(mcbsp_class,mcbsp_dev);$ [5 I: @4 a/ k+ _) _5 f
class_destroy(mcbsp_class);8 T, A+ j. n" ~# o
} P0 }2 B* z! C% x: S3 z
module_init(MCBSP_init);
( A* d# r, w4 ~$ Hmodule_exit(MCBSP_exit);9 X$ R. ~, H; R# x7 j. L/ m% i
$ h1 _1 F& \% e4 \* j) U
MODULE_LICENSE("GPL");! W/ u8 A2 D8 v( V
6 g' k+ I. h% k
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。- n! [! [8 p0 H$ i
我的应用层的测试程序如下, I4 E" S1 P# {2 [0 E7 k3 z
#include <stdio.h>
2 J, o9 s) F+ E" T4 ~#include <string.h>0 U7 G# S! A: m4 o. E
#include <fcntl.h>) E/ n' v7 U$ x2 R( X+ }4 Q! ]% P
#include <unistd.h>
$ Z- {# K4 S& y/ F#include <signal.h>
$ ]! Q4 o2 o% Q$ E# n' G#include <pthread.h> //线程1 A( d# r+ L7 \0 K6 ]4 A
#include <stdlib.h>' {' @7 W/ C4 V/ n# c/ `6 B
#include <pcap.h> //捕获网口数据
1 t/ D5 z8 `: u- J1 @#include <semaphore.h> //信号0 s1 k7 Z- b% ?# ?4 q6 u% }
#include <sys/types.h> //消息对列
% F2 p! Y) \) P5 g" W8 t#include <sys/ipc.h> //消息队列
; {* _4 i4 \4 u5 R. M; o c" r7 k- w#include <sys/msg.h> //消息队列 ]3 q8 Y, d/ i4 w) d
#include <sys/select.h>
4 |+ H4 _! e% \( E$ [/ l#include <sys/syscall.h>
+ X( Z k8 r2 U#include <sys/stat.h>; S& M0 p' H, A9 q) i2 R1 x: Z
#include <sys/mman.h># z2 g! T0 X: d8 r# K& N: J* q
#define msleep(x) usleep(1000*x)1 k% V+ |( `( e0 S* H: J2 m
. I" r% B7 F9 @int main(). ^ T$ v: x% N5 e. o7 u
{
( O, z c* y" {$ K4 } //MCBSP,ARM与AMBE2000交互设备 T/ ]) t7 }7 y3 u3 D9 \% V! M
int fd;4 W# h8 o! c! J7 \1 g7 G) \
unsigned short data_write = 0x5555;
" d) C$ |1 |: r4 }9 L unsigned short data_read = 0x00;* ]9 E. n: a% i- \& S
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: q3 z3 ~+ F: j // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);) n! v. B! G2 r
4 a7 b6 V3 h4 |7 J4 `- ~' R- |
if(fd < 0)
$ x# }: U) z' v' Y2 r {
( G4 p: h& E+ e2 u7 g perror("open failed\n");
. b5 ?: I4 `" B/ x( @1 g, H. p# c return -1;% ~4 p! l' _9 y9 E8 `. ~
}2 |" S" |7 x5 O8 O$ r1 G& A5 }
4 ~5 J" c6 [6 k, J& T+ t( X( X
while(1)8 O7 W2 h6 y3 ~9 z
{
4 `0 z$ B8 l* N0 W, Y 4 G( ~/ Q8 L( d+ z. ~' L
//AMBE2000每次读写是24个字为一帧6 w- X! q+ a c( k* l+ [1 m
//写数据时将数据在底层存储起来,等到中断的时候再发送8 n# P8 @( p' \$ t& o$ l9 O
//AMBE2000输入数据是以0x13EC开头的5 L6 C- ^' w; h3 Q k, F5 w
write(fd,&data_write,sizeof(unsigned short));$ G: f" d& F8 C
0 j' M$ |* q5 I) l //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
/ L* j$ I+ P# s# k2 x+ ] read(fd,&data_read,sizeof(unsigned short));
% K0 a- ^8 ? t# t8 v
2 U, C. t0 q* A3 z, V' u$ B+ g7 L if(data_read == 0x13Ec)
. ?( U' K, C& U- s9 b& ], V/ T {; D' Q e6 p9 c% a
3 K( D7 e2 N: V9 d
printf("data_read = %x\n",data_read);
; I( s5 Z# c, n; T }" G' ~* U0 B) S
2 {/ E3 q! ]; g' X4 X+ f/ l1 d
msleep(10);
+ }7 i$ Z" o2 e' w" n- ]- J1 f. k( O 5 l. D4 k9 O% G) n2 Q# t
/*
7 d" B1 ?1 k1 q( ~0 |- d$ R ioctl(fd,1);
; V- n- C4 K n {: I" Z$ { sleep(1);4 P9 B Q% o+ ]3 F
ioctl(fd,0);
; v) I+ z) L% L sleep(1);
% \, X! ^7 x9 X */ 9 i5 T4 ]# O, p+ {' p- e7 u% s3 z1 q7 x
}
8 k, b* I6 R! j1 B8 n return 0;
7 m6 H3 B$ l6 V% I5 c* L& C; x
- s O0 p( t& W5 I1 u3 W+ X}
' r# P) a. W6 \3 O
4 [; ]8 y$ B5 I. c" U: W. w, d多谢各位指教,谢谢! 急
, I4 d+ v1 A) i; W" @5 ]. C0 u4 _5 `4 l' m* U( w
2 U0 F9 Y- i+ {# d
3 e% E f+ P9 k
9 W' k, z% n( t! W0 n9 j
0 C! q4 S m6 H$ k- ~7 p3 d# Y7 g |
|