|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
Q6 q6 l& D1 n1 W! b) I/*4 C4 z7 E9 i$ g. I
* Copyright (C) 2009 Texas Instruments Inc5 ^/ {" A$ }* B: D% K% K
*+ h( T) Z) C6 H! m, b
* This program is free software; you can redistribute it and/or modify, P& F. y q, L
* it under the terms of the GNU General Public License as published by
, Y, _( u( p7 F# E; b7 u7 F) b * the Free Software Foundation; either version 2 of the License, or1 M' v1 A+ Y( E: D/ G
* (at your option)any later version.
6 {9 @9 c1 L$ Y# ^" W *- ?3 t7 c3 n7 L- }. B, Y8 B8 n/ Z9 c8 y
* This program is distributed in the hope that it will be useful,; X' t; {1 T6 E
* but WITHOUT ANY WARRANTY; without even the implied warranty of
+ B/ `+ c8 Q% E9 l) |& o9 `* C3 A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the' q; V9 v! e( q- @, T* N
* GNU General Public License for more details.2 X. n u Q; e# f# c" s
*
( ^: o/ `1 L( X, O * You should have received a copy of the GNU General Public License
; a/ x/ }5 Q- g' z& n * along with this program; if not, write to the Free Software }% y# u+ f4 [1 l6 o" J. J0 ]
* Foundati! E6 ?) |4 w$ T' |
*/
* @2 ^4 { R1 e- \#include <linux/module.h>
$ c+ S* s' U2 }4 u. t; U#include <linux/init.h>
8 R) Y/ A: x+ L! G3 r#include <linux/errno.h>
8 E6 W4 F; U7 o0 Z0 B' P4 k* z, }#include <linux/types.h>- ^+ Q3 [. H3 _
#include <linux/interrupt.h>$ s5 z! c2 P; u
#include <linux/io.h>6 s4 y0 `& m, {+ _9 _6 i
#include <linux/sysctl.h>
+ S* j8 E1 k8 s. a#include <linux/mm.h>0 M: J! f( @5 M2 H
#include <linux/delay.h>
: H) P* W f- b+ X! F' [#include<linux/kernel.h>
9 [, o' B5 L/ K: c% f# d#include<linux/fs.h>
6 }2 X# [0 Y. |7 L/ D5 g, w#include<linux/ioctl.h>
; W1 i# M$ T8 r#include<linux/cdev.h># {5 M2 E6 ?; P2 e. p$ o) T) `9 O0 J' H; [
#include<linux/kdev_t.h>
. Q" C' n- I; g* M3 Z3 M9 d#include<linux/gpio.h>( S5 D$ T" X2 B' y Q: H. w8 P
#include <mach/hardware.h>/ e9 V/ `% D P9 Z) `1 y q
#include <mach/irqs.h>
! v# J |0 K7 M; t5 e X
0 ?: o: | [7 e( r, n6 q* L |#include <asm/mach-types.h>' Z9 w& r1 U' E! y
#include <asm/mach/arch.h>6 H" P+ C5 n g1 @* M, m
#include <mach/da8xx.h>
4 l8 \! X" H4 }% k( n l#define SYSCFG_BASE 0x01c14000: P' p6 [) q" S# ~9 d
#define PINMUX1_OFFSET 0x124 ) N9 _* [9 r9 h( @; A
#define PINMUX18_OFFSET 0x168
* }& n. E4 r+ A \#define PINMUX19_OFFSET 0x16c
4 q) h: T# n' ?( F#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
' H! s9 q6 n1 [ N) G#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
* L8 n& K3 Y* \6 B4 O B+ `) q#define XCR_ADDR 0x01D11010 //MCBSP1_XCR. P- E9 W( z7 a- h5 L
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
, _4 r2 v! S3 h1 u! j6 l: u7 c+ V& _#define PCR_ADDR 0x01D11024 //MCBSP1_PCR+ A: M: o! p. E/ \4 z* n. p0 f
: q2 I% O/ W, z. t ]# j3 h0 m#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
; p" T9 _7 L: i% L( F7 @#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
* L1 x9 |1 U& y7 O0 {" |//PSC
4 n* n7 c( ~0 J6 ]/ y#define PTCMD_ADDR 0x01E27120 ; I( c" G2 r5 H; b- |0 }, B9 J
#define MDCTL15_ADDR 0x01E27A3C
. c* }3 p- m/ v D: G6 o0 T( ?+ ]; G#define PDCTL1_ADDR 0x01E27304
* U+ r% h7 A" Y9 k3 a% A//GPIO8 direction, j/ O4 l0 |6 y
#define GPIO8_DIRECT 0x01E260B0: I/ f u D7 u9 k
#define GPIO8_OUT 0x01E260B4
3 A+ ?3 G( i6 s) d/ [+ D#define GPIO8_IN 0x01E260C0
7 z- L/ E7 X9 j" m4 c4 v$ t$ A/ F0 F8 r
//#define MCBSP1_RINT 99
! w! w) w" `2 e- i//#define MCBSP1_XINT 100 z' T' `" ^8 C l
static int MCBSP_MAJOR=239;* ~+ Z" K4 I: L, h
static int MCBSP_MINOR=0;2 S8 m8 Y0 M0 Y# O2 H0 N) w
static int count =1;6 s0 C' F# d3 R) ]
/ g' W6 o$ H2 b" y% z7 j$ l& ?, x" \. f
#define MCBSP_NAME "MCBSP-device"
/ s1 E! T4 o+ B# \( t$ t
# B5 K. O. S8 V H5 P" Lstatic struct cdev *mcbsp_cdev;
% M( Z6 V! x8 u& `6 D6 K/ wstatic struct class *mcbsp_class;
/ s7 O+ i# F+ r8 n: k+ D& fstatic dev_t mcbsp_dev;
, B/ ~3 i k' C' cunsigned int DRR_data;
# ?# c' U7 Y3 b |1 G8 s' C* m7 sunsigned int DXR_data;
% a3 D. R" Y& bstatic int mcbsp_open(struct inode *inode,struct file *file)
5 p4 K/ H- l# j6 H8 g{
7 G4 a( H% o' Z0 H
4 F- K/ B) w9 d! y( y$ A" z //interrupt enable,initialized
. ?6 V/ Y9 ^% ]* `! \! P; v6 h) j unsigned int temp;; z& e+ {) j6 ~/ p3 F, P( D. k
//SLEEP_EN(GPIO8[10])---0
/ W' z$ ]* h/ _8 P$ D temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
$ i6 g% N' b" m: u r( V temp=temp&(~0x00000400);4 ?) ~+ e; F1 m. W' P1 J, d0 O$ C
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]& }2 X5 |/ A5 d! s- U$ S
//RESETn(GPIO8[8])----0----1
( U4 k3 h9 l: W: I" p5 O1 K temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' e: S$ `1 Z$ m ?+ t' l
temp=temp&(~0x00000100);7 [; c) a% g: O1 d9 y* m
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0& B! b4 i$ q+ ~9 \$ G g
udelay(100);
- `3 g$ S! h0 g0 ^! Z g3 |+ q' L temp=temp| 0x00000100;
0 D& l! \. @' q4 o __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
^( j A" Z% y( P udelay(100);
- L3 l2 f$ u7 R6 V printk("open success!\n");
, W- V: j A8 P! \; N ^: z6 U return 0;( D5 {& Y; |; z; P1 K# r7 s' [. Q
}
: v! l* I) I4 X" t( d7 x- W8 V7 g# ]: v, S
static int mcbsp_release(struct inode *inode,struct file *file)" t% O$ I: h5 X6 z2 h* w3 U
{' r0 y. ^, x( {2 S' n3 n; [$ S
printk("release success!\n");, V; U( ?$ G* A3 ^ @
return 0;" K+ B2 _9 ?# M. L/ ~
}
2 M Z; F6 C; } h* x! t/ ?
6 O2 O* D1 O# @3 ]- k# b4 Ustatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 P1 s7 p( e% g5 ]$ j{0 F+ X% q3 \4 X3 t
copy_from_user(&DXR_data,buf,len);
$ `, D z; _# Q( \) H iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
; A" S: t3 N6 V return 0;7 T' P! n0 b- x, E# r
) m! d0 B3 f* b6 q* q
}
8 z2 g+ a6 o X! T
+ P6 I* \* R6 C5 \% Ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)- C1 C- R# {5 h/ {& f; H x# ~" `
{
- p7 f# s$ y6 O( b+ [ DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));6 I Y& |; [& R% j+ C
copy_to_user(buf,&DRR_data,len);
v& {" X- s% b# b% ~ return 0;- e, w' C' D8 |$ j
}- @( f# q, v8 F6 _6 z8 `0 L
1 i+ a7 ~0 J" R) v0 F
* N m+ U$ H8 _& Ustatic struct file_operations mcbsp_fops=
$ E: W+ @2 N6 g5 |{
9 g% `$ y1 Q9 R+ I4 J- j9 H .owner=THIS_MODULE,
& M7 T' X' F+ V9 |: L( e .open=mcbsp_open, F2 q% V- F( k! D- c' D' a0 l3 L8 e
.release=mcbsp_release,
5 {/ w) P3 F8 T) v, w .write=mcbsp_write,! i! A3 w6 P4 j5 M: @# P
.read=mcbsp_read,+ x% T' m, s! F( I/ @% f0 V( ?3 c! z
};
- T5 I$ ~5 s. }static int __init MCBSP_init(void)
9 L% B2 P8 r/ [- H5 S, s{0 y" `$ y& g4 D% H+ D1 x
int ret;
% Q% m2 q3 |$ \2 L unsigned int PINMUX1_REG_old;
j& w0 U2 r! S* s3 j unsigned int PINMUX18_REG_old;
- C7 X$ C& @/ v1 G* F4 p; v- X unsigned int PINMUX19_REG_old;
, j% s& P6 C- z$ |: k" l( I5 x unsigned int temp; ( d/ L9 F8 e K" m
if(MCBSP_MAJOR)
5 X% v# Z, ?, V: ?1 @# @ {8 Q" k) z5 \4 Q
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% Z3 ]/ R7 P0 ~ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
$ ]' |' f4 ^$ |9 R# E9 u$ v+ B }
# j8 K2 Y+ M. Y7 j else' w2 W( ^$ U; t
{' S& W$ A( h! g* P
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);" L) ~0 G, j" o' z7 D5 U0 T: x
MCBSP_MAJOR=MAJOR(mcbsp_dev);
$ {6 ?. F3 g6 v2 ^ }
& n" M/ L# E/ q' q7 ] r # a+ }% M+ ~! B9 o1 s
if(ret<0)
8 U0 p1 N6 V+ G: F {
& k) S' I _" p5 G5 k printk(KERN_ERR "register chrdev fail!");( f8 r a, b, A
return -1;
- O% F+ j9 X; i }$ q. J* F. h0 X0 d/ U! D6 a" ?" h
9 ~( E' ]% P" h) @, ` X mcbsp_cdev=cdev_alloc();: L' H4 C- P$ a
# J8 L4 @" x5 w1 h' O# E- | if(mcbsp_cdev!=NULL)
. z3 y- X) }1 F- M {
7 m" R0 M# o4 m, _ cdev_init(mcbsp_cdev,&mcbsp_fops);
! T1 {2 E! @6 s/ n9 q mcbsp_cdev->ops=&mcbsp_fops;9 f( x* M1 @7 p$ F/ I2 Z4 {* W
mcbsp_cdev->owner=THIS_MODULE;
8 N1 v$ \: _0 q8 E! M8 e8 n ; j5 ^3 |! K, Z+ P- \7 J. v; u
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 H9 ]0 z8 o* M' J6 w3 f# y7 q printk(KERN_ERR "register cdev fail!");
# b, B2 s0 b1 g5 v; n3 {1 s else$ B# s! L( K: g- `
printk(KERN_ERR "register success!\n");
8 U* I! w& I4 m3 `5 w4 ] }
9 d7 }6 v" {7 g7 ~" z. U+ U else( f! I7 A4 U: b$ D2 g& I2 ^
{8 g/ x5 R: x: c+ A6 M: S1 Y
printk(KERN_ERR "register cdev err!");- W5 ^# `/ y4 z4 ?) Z
return -1;
! {$ A5 M, ?) p8 w- x6 ] }5 H& Z) m' ~: T& b3 z% \+ J
" K l2 \! Y# V7 I2 C
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 D9 X% k7 {( o0 e6 T; K. W. B$ e if(IS_ERR(mcbsp_class))) \; [0 Y+ I" O" Y' Y1 \% i. T; ^
{. \* R( c, H& M
printk(KERN_ERR "register class err!");; U0 Z" g) m4 A4 z) g4 R
return -1;
3 x8 m. {8 s: V+ s }. }4 a6 v+ w6 C/ M- J' r V" C
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
1 s% M @7 V6 {3 H3 V7 T, N$ z) |3 o2 Y
//PSC% P" b; d; f( m# G
//add Enable MCBSP
4 O4 l( k% k$ ?* X //test
h, J& |0 [: e, M4 z temp = 0x80000003;5 \2 t$ S" u; g# l: j
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
- B: M" e, m- M& r) y% M temp = 0x00000003;" I0 ?$ z; }/ c( i# u
writel(temp, IO_ADDRESS(PTCMD_ADDR));& w, ]4 J+ e D4 _- c! n
1 |0 E* e7 U: q* c7 b
temp = 0x001FF201;; P& x% n }! [+ K0 S
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
/ J8 f$ c5 N* I8 Y$ k, N
, O Q4 C+ |& ~$ D L" D2 | y: f //PINMUX
, q" |0 J1 [$ Q //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,- c6 H1 Q" U- X( c& M9 |3 m) w. i
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); u9 J$ B! V: L) g" V% E' @
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ' n8 E0 Z+ R: M1 \9 t% ~9 O% t! N
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
/ z& G4 N: c' D1 X) x" i4 @ ]$ j# W 3 r2 i) l& f. H5 n! R+ [
//SLEEP_EN,EPR,L138_SHK1,L138_RC
9 J9 W3 z5 e2 K: q: `8 I PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
, \1 T$ _4 i3 R+ x* [5 P% ^3 y PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; / h9 [3 o& p, x R3 x2 C) J
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
/ y) I/ k, Z9 \2 k+ g- R% z
, f/ o8 I8 E1 F1 Z5 _" T //RESETn,L138_SHK2+ b y( h( L+ A: Z" W
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); $ ]% s+ [4 Y' W
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
, `: B% z5 ]# A writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);) D8 {- I& W5 }+ A9 c4 x, o
% W; B1 H) }2 W0 f7 m 8 A r7 E) Y& F5 a
//SPCR Register4 ~4 v) F7 B" m- z4 o! E& M
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
; ^( q. _0 b: S- J8 R temp = 0x03000000;//(DLB=0)% R y8 J, \$ Y
// temp = 0x03008000;//(DLB=1)
" V2 I7 T2 r" ^; j+ b4 ` writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
$ R0 f# z3 I. L$ k. T temp = readl(IO_ADDRESS(SPCR_ADDR));2 H; w, @$ P1 L4 O$ N, X5 }: d# ^/ a
printk("temp=%x\n",temp);
/ o W/ S: }8 q7 C# D( a* k : c$ v1 F& A+ L% E- K! U* ~
//PCR Register, |/ D/ n9 _0 P6 H# Y+ f7 @6 U0 M% P2 [
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0; ?1 g! {' k, L' O+ t, h
// temp = 0x00000F0F;3 k, a( [6 T4 T; W- I
temp = 0x00000B0F;, L+ A4 s; t0 h' S# Z" E
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 1 r1 p8 \) I( c( _" I
temp = readl(IO_ADDRESS(PCR_ADDR));
* U' x% B2 ~# y5 r. N' r printk("temp=%x\n",temp); 9 H6 E0 z0 m5 Y& q
//SRGR Register
8 W& a; V4 t/ a. @0 N //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
' R. D( x2 V/ o# G //temp = 0x301F000B;3 z/ P2 @& S" P, M8 @( p
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 0 h0 S& T2 x+ S0 U9 _4 B& g. t
temp = readl(IO_ADDRESS(SRGR_ADDR));
+ g- ]6 v( r+ ?9 p printk("temp=%x\n",temp); y, {0 X5 N7 D# m
//RCR9 e! D% \) p, q8 B& i0 {& q
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1, S. C! `% X) l. X
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
( ]4 ^' U( X* x# f% n temp = 0x00440040;
! I3 k9 W- d9 R/ y writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized . z$ {0 j* B' Z3 w% c6 l0 |
temp = readl(IO_ADDRESS(RCR_ADDR));' u* O& ~6 r/ o- y. c0 b) x
printk("temp=%x\n",temp);" ]9 e' x$ n) Q" c, t( _5 _
//XCR
6 n2 K6 Y4 u% R# U$ V) _, k( C //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
- G+ d; M( H I; {4 t+ c' {& C( p //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0- e6 b( a* j% E- a7 \7 I/ Y
temp = 0x00440040;; @" }3 h3 R" j3 ]6 K( F* g/ n% @
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
2 B" g% ?( G: A0 M6 U0 q9 O$ M4 t temp = readl(IO_ADDRESS(XCR_ADDR));' m5 b z) g) E( b6 A9 n, E
printk("temp=%x\n",temp);9 }1 B- ^7 Y4 G* F
udelay(100);
( ~) a7 H' C7 J: J- F //SPCR Register
7 [$ U6 D' A3 V# K3 E //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
2 ?; T/ \0 o- a+ ~ f temp = 0x03C10001; //DLB = 0 VS DLB = 1
$ A+ W2 c' s! B, e writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
9 I& R; X6 q. m0 c# ~' A m8 [ temp = readl(IO_ADDRESS(SPCR_ADDR));+ W0 x. q5 j7 W; D: \+ F# S
printk("temp=%x\n",temp);6 g0 Q; \- h! n/ _5 ~4 h
udelay(100);
5 C5 G% ?" J3 `( ?, X2 V3 {
- o+ e6 g1 n) M: B //set GPIO direction
1 [/ M* P: J- n7 _ temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
- V# [2 x1 X8 N: O2 o) z9 Q temp = temp | 0x00000100;//EPR----input& ]! n4 m Y# t
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
) H" p$ w! }6 o3 n4 x1 q. Y9 F& @ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); . O! l5 n( Z S3 q! }
0 A6 ^, e4 T+ H3 s4 K return 0;
8 O' x! X* s1 f}
+ B( M2 U; C7 Y: |1 C0 b# Xstatic void __exit MCBSP_exit(void); @" w- B1 b) t7 _: w
{2 U2 z; p. x: L
printk("mcbsp chrdev exit!\n");
. P: _# M' Z! G2 O8 M$ c cdev_del(mcbsp_cdev);
6 C) X" o0 @4 Y unregister_chrdev_region(mcbsp_dev,count);( U) Q# I2 g; _
device_destroy(mcbsp_class,mcbsp_dev);) |! T4 f8 e F5 H2 z
class_destroy(mcbsp_class);
9 y8 `$ x( W. j}4 e/ Z! u) h4 m( j" E9 b9 T
module_init(MCBSP_init);
; L! V9 n$ _! _/ \/ D4 R) Umodule_exit(MCBSP_exit);
- ~/ n& o- M+ s5 D5 M$ a" O7 ^ x! x1 Q- |; m! f1 c
MODULE_LICENSE("GPL");+ F) `6 B2 r1 l1 o+ d7 c6 \4 Z
8 u' m& m: e' A4 S我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
: T. v% `: s" F* u" H9 X我的应用层的测试程序如下# h2 G& V$ o" N( E; ^9 l* ], T- s) R
#include <stdio.h>
7 J0 i( C6 u' a1 [#include <string.h>
. A/ G7 Y8 k: G* p) E#include <fcntl.h>8 ~& N. L: Z7 k4 _: \* R8 o
#include <unistd.h>2 T2 H) Z$ f& I; ^" N" M+ V, }
#include <signal.h>
P' J2 e @3 f' D4 b; b3 v#include <pthread.h> //线程
! w% |* B& G" z* O+ J8 V# h#include <stdlib.h>
}+ y) {, r! u9 `$ D9 h#include <pcap.h> //捕获网口数据
# k# Z) Z/ }6 e$ X' j: r4 g#include <semaphore.h> //信号0 O1 S' m, D \6 Q) g
#include <sys/types.h> //消息对列
& |$ N6 V4 p# k5 n* K3 ^#include <sys/ipc.h> //消息队列2 \7 M& T8 g) U, @# n- ]1 A
#include <sys/msg.h> //消息队列
) ]3 {# Q' J3 `6 D#include <sys/select.h>& N( C; |- Y8 y1 X& z$ H$ d4 Q- q+ U$ s
#include <sys/syscall.h>3 [4 {* r7 q' d6 n
#include <sys/stat.h>) }4 Y5 r! x0 Q) e6 S
#include <sys/mman.h>
+ h* N. }" Y% X# a5 r#define msleep(x) usleep(1000*x)
1 _' L$ q( Y" i# v$ ~4 D- O$ s) H9 e; ~% U
int main()
' q% e m6 k2 H/ w" u* u% E0 }{
/ T/ D* m; o$ e7 t0 a //MCBSP,ARM与AMBE2000交互设备
, Z% B! \! o5 A" E# O int fd;
" a2 V4 T7 R/ [; ] unsigned short data_write = 0x5555;
0 s$ Q r, Y/ i- v unsigned short data_read = 0x00;
; Y+ h8 |3 e5 h3 g5 f fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);! c, K, J0 ]6 r/ F; _6 |4 u* f# @
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);# r" i7 J/ B! ^$ q7 a% I
1 ?" y8 X* X. n2 T) X if(fd < 0)
4 ~% x5 W/ ^2 K" ]9 B {1 }8 q. B' B. i
perror("open failed\n");
- N2 F; R- R {1 c& V return -1;
1 ]; P' u. g5 @ r- V }
# P3 h% ]/ K! N8 t& L6 t& F0 S
N) V/ s& v8 T- i while(1)
% \" {. N2 c8 J! k7 t* O. m5 ? {- e ]" b% G( }' v' F; ~, W
+ W1 @/ P. Y& n: _6 W. h //AMBE2000每次读写是24个字为一帧7 l; B! Z& d$ C
//写数据时将数据在底层存储起来,等到中断的时候再发送
' O3 N. z; l9 F //AMBE2000输入数据是以0x13EC开头的
6 N! f: p0 G# a# h' Q, ~- H U write(fd,&data_write,sizeof(unsigned short));( U1 g7 F8 d# { ?% \* _
. l6 w6 |: O2 }, h- r //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
- X1 @. j# ?7 K j read(fd,&data_read,sizeof(unsigned short));
+ g$ Q3 P" h* T& b! p
- `# O9 X; p4 @: ^# A o8 g! G8 Q if(data_read == 0x13Ec)
8 j" U4 G- P! f" F6 Z0 N" C; u' O {8 N+ o) ^3 n c& {) j: E1 E
- I1 U9 S( P7 k! q0 j
printf("data_read = %x\n",data_read);
: J& o8 H& c) [ }
7 F: M$ s O, W& M! e* E 8 f3 T4 }7 r& ~ ]4 v- A0 W# F
msleep(10);% z, t( |, j: ?# i' S
' y- l7 r5 a0 W# Z+ ^7 j
/*% N& ~" H7 _9 W6 l- S# p7 ?% `
ioctl(fd,1);
5 z% T/ H# `+ Z/ u v7 h: z& v sleep(1);& Y* {6 K& i$ C& N( X- G
ioctl(fd,0);
, p7 Z9 Y# y( m/ h6 R8 n sleep(1);. i( b* e6 [# `5 h
*/
2 R1 v+ v+ j+ q% p } 9 R/ c4 W1 I9 ^
return 0;
, H6 Z$ C, g0 r
7 y- [8 @. ]/ A6 P7 g6 }: }! w}
! V* Q2 x8 @* I& J5 M' x1 p
) G; m$ E; \: L/ y# B0 e+ ^2 j多谢各位指教,谢谢! 急
, z: L8 E h' S7 a% |' ~
5 m) W# w5 ~: o' p/ L$ u$ ^; p d$ d# K* {1 s4 |
9 U6 ]$ F! x. |2 f
( H! J9 A! k$ J! C+ w7 i- j" y, q+ V: g5 _+ _2 k( a
|
|