|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
+ K; _$ g3 J# ?& R( t% b/*
4 j# F5 {) V. | * Copyright (C) 2009 Texas Instruments Inc
! A+ i- ~ W. d2 k6 D *
( j2 ?; F% |8 A6 z0 M$ K * This program is free software; you can redistribute it and/or modify( G. c/ r7 X' n2 j+ v
* it under the terms of the GNU General Public License as published by
! M' f6 c3 l; q, E8 j8 `& s * the Free Software Foundation; either version 2 of the License, or+ Y, q$ b8 w2 w+ K/ t
* (at your option)any later version.$ t& F9 D- d2 Z3 |& g; K" ^. L
*& q9 } I1 ?9 \0 U2 N$ ~- g' X
* This program is distributed in the hope that it will be useful,
) G8 V+ Y! d5 J. e# E) c2 D * but WITHOUT ANY WARRANTY; without even the implied warranty of3 N" I6 P0 o! ]$ {5 O S) G2 |: U
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the8 b+ F Q9 j7 B! R: i
* GNU General Public License for more details.1 T0 v, F/ {6 f
*
" v2 n3 m) G* j1 e * You should have received a copy of the GNU General Public License ^) T$ k' v1 [# c4 C, c! [; J' v$ S
* along with this program; if not, write to the Free Software
\ L- x& o$ u. U4 l) V5 [ * Foundati
# P! Z: b/ B! n9 Q. f0 p' T*/
! A( I: P: s# d1 K. W6 [#include <linux/module.h>
, W, o* z0 g# E- l8 h#include <linux/init.h># P+ W& P" l& E8 Z
#include <linux/errno.h>) z' Z1 W% R8 Z; O: d) A
#include <linux/types.h>
8 Y% Y1 R7 f; {4 m#include <linux/interrupt.h>% t3 j2 z# b* m% z$ D( j/ Z* K s
#include <linux/io.h>) r0 K$ a; I3 n! B% I+ `. z
#include <linux/sysctl.h>% U1 S( i" p9 E; L. J, {% j+ T
#include <linux/mm.h>& G$ A$ C- O4 G4 L: U
#include <linux/delay.h>
# S$ a1 _$ m/ }' }, S) {#include<linux/kernel.h>
; M. w' x) Z/ n7 L5 O#include<linux/fs.h>
# e$ f3 q7 T# s; {' g9 f; o( n: B#include<linux/ioctl.h>, t% d* _7 @: `3 H7 u/ L
#include<linux/cdev.h>
+ q" `+ X" x& Y+ h6 ?#include<linux/kdev_t.h>
$ f! r! o6 O0 i9 m1 d. F+ \/ ]6 z7 O#include<linux/gpio.h>
5 t) q% @5 r0 L5 Z+ G#include <mach/hardware.h>
3 c" z, z% A: Q" K' b9 W#include <mach/irqs.h>& I9 ^: v) V3 N9 u* c
/ ?9 |3 {9 |. G#include <asm/mach-types.h>
1 E! Q8 e$ z5 ]: y. ?5 G7 y9 `/ G#include <asm/mach/arch.h>
5 b: x+ H r7 b& ^% E( h#include <mach/da8xx.h>1 n- i; t+ a i/ a# ]
#define SYSCFG_BASE 0x01c140000 H7 z2 G- N" E9 L
#define PINMUX1_OFFSET 0x124
) j! [+ u3 q; U& Q6 a#define PINMUX18_OFFSET 0x168
) L; T% O' k- x- }#define PINMUX19_OFFSET 0x16c
, b: ?* U6 f4 o* ^7 \- a7 Y#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR" Q( a7 r- L9 k0 N
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
, V+ S# ~7 U& Q* {2 O4 f#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
/ x. S7 W3 }1 U* U# u#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR t, b" b. g1 Y- \4 T, \
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
' c$ j* d0 x' g" [1 c9 f2 Z
7 A* Q( O5 Z: \. Z0 H#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
0 I( l0 F+ [2 c) L/ a. P5 m#define DRR_ADDR 0x01D11000 //MCBSP1_DRR. H. p" k; {6 n: _5 Y7 j
//PSC
8 y, V8 m5 [) u4 C( P3 N#define PTCMD_ADDR 0x01E27120
! u. U+ Q' r9 K8 P, t#define MDCTL15_ADDR 0x01E27A3C
8 Y) D5 e& X7 P& g7 I#define PDCTL1_ADDR 0x01E27304# ?6 a. }0 b ^+ U
//GPIO8 direction
, P' O- M- ]4 |% ~$ c5 \#define GPIO8_DIRECT 0x01E260B0$ X. j+ Q Q' `% Y
#define GPIO8_OUT 0x01E260B48 i6 T6 q. ]' I2 `) Q$ s
#define GPIO8_IN 0x01E260C0 T' H F' V: v; a6 c3 y
0 ~- n) {! w& O$ M- n4 o+ F. f
//#define MCBSP1_RINT 99 1 z7 L6 Z# L& c( a" ^0 Y. Q
//#define MCBSP1_XINT 100 : F- f+ [9 `0 ?$ C2 N0 E; E% p
static int MCBSP_MAJOR=239;
( K# u/ M3 V4 |1 A- w( xstatic int MCBSP_MINOR=0;9 M2 G6 H* @( p% N( a1 ~& Q) }
static int count =1;
r3 P8 S K( r! s; r. s: v+ |1 A2 J& T
#define MCBSP_NAME "MCBSP-device"
0 Z* u: a, @5 [2 z3 K# k4 J7 E: }+ p. `3 T: l, Z: c! H v
static struct cdev *mcbsp_cdev;: m! L2 @. D6 K: V x
static struct class *mcbsp_class;
4 z- y' R2 O o; Xstatic dev_t mcbsp_dev;( } t- M* ]1 @% h0 y# U
unsigned int DRR_data;
& O, n* K) ^8 O( j$ U9 M! N# X: J3 junsigned int DXR_data;
: N$ t$ G$ d0 r2 e5 {9 xstatic int mcbsp_open(struct inode *inode,struct file *file)* j) C7 f2 w$ A2 j5 F, G: @1 |
{
, G! E: [7 Z- W. @7 o$ e
2 x! X! t$ m$ ~ //interrupt enable,initialized
; x' Z9 H7 v' n- x unsigned int temp;, v, ~/ N, V. _, v2 c- L& M' C
//SLEEP_EN(GPIO8[10])---0
3 ?$ y) }5 z' I: Y- [) H* J temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; @$ o- P. R' w* q/ W; g t. u
temp=temp&(~0x00000400);
3 b9 S! Y* y# ~4 ~% x __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]( E9 N& x6 [# Y1 g
//RESETn(GPIO8[8])----0----1' y- ?# ^. C B- g# v1 R" n
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
3 o2 M; c" R0 |7 c4 N% o& M temp=temp&(~0x00000100);
- M+ y, S) M' J# b% I$ H __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
& ^8 L% b4 R& ]& w9 y3 F$ k5 m: W udelay(100);1 L! J, B0 X5 H; n4 r7 d
temp=temp| 0x00000100;; c0 b1 a% o# c6 Q J' W, @
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& P1 b$ C# `8 s8 ~" `
udelay(100);0 I4 C. G, p* o5 O
printk("open success!\n");
* g7 ~2 p( y; G7 d" l. ~ return 0;9 l" }7 T I+ w7 e9 J/ Y
}7 R) h% K! i q
, ]+ v- n3 }; r2 W( H# A0 W fstatic int mcbsp_release(struct inode *inode,struct file *file)
: @$ s, p& \1 A% r d{
# Q: R' P0 {) G/ ]) e7 D printk("release success!\n");
9 ~1 q6 @7 R( i! M% E( L9 P return 0;
5 J4 S1 [" [. q! _5 \2 B}$ h( x' s, E6 H+ U
" [2 W/ \# c$ U5 T7 F" P
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)2 l! U4 Q3 \) x ^- J
{/ C& n; I4 m3 h; ?
copy_from_user(&DXR_data,buf,len);
5 b. ?. p+ m5 Z3 D* q iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
+ G- j' u$ z( P return 0;! e1 ^4 }. U/ n5 i
) Y! G* q: S4 s& {8 W
} T/ |8 y- {; d' X9 t n
/ P v: k: A- t% B$ \) Q: o, S
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 f2 Y" v8 t s{
! n0 ]% |7 \7 o5 [/ G DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));9 V" P. J9 L' m- V6 p3 Q" v
copy_to_user(buf,&DRR_data,len); 8 g; X, t+ [% `. ?( K
return 0;
# v G6 U7 I+ D* T' \$ }}( }, O; ^6 H& J/ g: g# }" b# Q
* X, V O9 z- U5 |$ b% ?
# u' P. c# ~4 H
static struct file_operations mcbsp_fops=4 z7 A( [5 T; R8 T$ g7 N3 \
{
8 M) n" c$ Z+ V+ e. c+ j$ {' | .owner=THIS_MODULE," S6 V4 n6 j# y# ~" [
.open=mcbsp_open,, N# L; ~& J O$ t9 r E* Y y
.release=mcbsp_release,
9 S9 m& J7 L6 Q8 P2 s/ v .write=mcbsp_write,* ?+ p. L2 s- r
.read=mcbsp_read,0 j, U- ], k, @, y
};0 s( N e! z% D4 \7 z
static int __init MCBSP_init(void)
# C7 l+ O% ?) [9 S* Y( O{
: G* A j) Y$ ? t& K8 h) t3 P, v int ret;
$ |' `% @$ Y" l& O- k7 I' G, j unsigned int PINMUX1_REG_old;: z. j% R- R7 }
unsigned int PINMUX18_REG_old;; o6 n4 n9 m/ r: t
unsigned int PINMUX19_REG_old;
# R/ E4 c5 I I4 X unsigned int temp; & F y0 W, U2 [( o
if(MCBSP_MAJOR)( Z* d6 j0 f; [, O% _
{
5 w% @. t7 \+ \. ~1 X+ d7 d mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 h; c0 t8 B# b0 D, |' U
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
9 q! c% }7 n4 g( w5 T( s } M5 N+ A, d8 h% C" d, n; o
else. ^3 j* K3 P/ h6 p$ T+ r
{
, G% L* R- l* i5 Z2 Q$ } ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);: m1 t7 J' X6 m
MCBSP_MAJOR=MAJOR(mcbsp_dev);- q5 ?9 k" v/ t" E: {( |0 ^
}
$ ?: A. L: W7 k; B# m! M & I; I9 W0 b- E' l7 ]! h
if(ret<0); R, n4 S$ y0 {2 c6 ~1 N6 ?9 n
{
- ~" E; U$ t& J$ t+ P printk(KERN_ERR "register chrdev fail!");5 c B5 k6 a1 t
return -1;
& M1 I# i' t5 p, t }, O$ k/ r l- J. d, f
- ^8 E7 x* F& n: l
mcbsp_cdev=cdev_alloc();* a% x+ E& t# q
& S* O) c2 J4 O) V& S if(mcbsp_cdev!=NULL)
0 l4 x X) f. l6 x, f) [ {
0 `/ P* c! Y% T3 a- ], R cdev_init(mcbsp_cdev,&mcbsp_fops);: J/ X( K; ^: \
mcbsp_cdev->ops=&mcbsp_fops;
) D- w- F' y7 c( n( t7 Q mcbsp_cdev->owner=THIS_MODULE;
! u- n. j8 P- Y
" x$ c, O1 F2 c5 v5 X% o5 G if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 Y3 R: t& M) y3 y" Y2 ^, [
printk(KERN_ERR "register cdev fail!");
! J9 d: n- i) O6 { else, B, D% X8 a- [2 d* V6 _4 t5 h
printk(KERN_ERR "register success!\n");
v+ C7 I: j0 a- m5 {+ e }7 ?/ i. P% D1 ^0 W9 [0 \% _: I+ K
else% z, M+ {6 N+ @# G: ]% `( I
{
2 s- p5 K- j2 z5 ~ printk(KERN_ERR "register cdev err!");+ \( ~2 T( W, c) T& ~0 O& E* R$ b
return -1;
7 s$ l/ b* g8 Q3 v' H( R6 q m }
9 ?1 | c' p5 d2 D
7 A. R$ {/ l) B& F) L mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
3 W: q: H5 `& n, t1 w3 ? if(IS_ERR(mcbsp_class))) U7 e2 S* w) {% {$ v; b: z
{
7 w: }9 S9 j% D2 ~/ V2 a0 \/ F; h printk(KERN_ERR "register class err!");' H; e/ Z# w1 R
return -1;
D% ?( U) _) U3 t6 ? }7 h$ Q& Q2 }0 x
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 F7 C1 s6 ^9 H0 `0 Y
9 J ]2 d' R3 D$ m) j //PSC/ D- N3 {, N) B3 |1 c( a7 f
//add Enable MCBSP' T0 T" ^. }% U& L/ W. a
//test
/ c* M# D, ]* Y, Q( T temp = 0x80000003;" M6 U7 w, H7 h8 J6 Z; k% a2 f3 Z; P
writel(temp, IO_ADDRESS(MDCTL15_ADDR));9 |# c0 K5 S6 j- C) O% m
temp = 0x00000003;
' ?" @ W* Q" O( J% l& I writel(temp, IO_ADDRESS(PTCMD_ADDR));
4 G; W6 Y' N, g; h0 x. A: h
6 r# }4 Z. H$ T7 G6 j$ @ temp = 0x001FF201;4 F, a- R6 M, G T1 E$ `' m
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
' E+ b( j: j9 R0 H
2 C- W X( {' E+ j" R7 C$ J //PINMUX
. b2 B* m7 g* E2 h //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
; Z) t5 D" R V PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* |- e+ w3 V2 p/ l# z PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ; R' g" {$ b" p( a8 I; N5 B8 ?
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
& ?4 g+ N, S% y0 \% I6 h- S
, L+ b" G- b/ K* t //SLEEP_EN,EPR,L138_SHK1,L138_RC! G& w# M# @7 u: e/ v; {
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 Q! B o6 S; A' _- V' y PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
. K2 K& E" @+ A& A writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);; D0 z( W9 i% ~: g
$ y |$ H1 r) O4 \; U/ x5 G //RESETn,L138_SHK2
" V' I+ N. Y T3 C) u+ n PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
$ G0 G! R# p: k" | PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 0 {' {3 ~" s! | s( Y5 P
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% r, u, d+ B! P& W , { k5 x: W8 R: _8 |$ z! J
, C* \+ r& Q) [6 E) S. X
//SPCR Register
/ J3 q2 Y' c& H3 D, w& @ //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset5 i5 T! V" b: [0 K/ X* B
temp = 0x03000000;//(DLB=0)
+ F. G9 n4 y( t6 L" ?) q, `# u // temp = 0x03008000;//(DLB=1)
- U6 u: U9 {4 o d! J$ Z writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset9 k# e& y- ^8 f6 `; |" v
temp = readl(IO_ADDRESS(SPCR_ADDR));
$ }5 z9 ]2 H! B printk("temp=%x\n",temp);
9 s$ B2 K# ^2 H* w
( f0 q+ D5 l" a! ~( f5 s8 Y% f //PCR Register
# d. F6 M9 B. s7 ? //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0* V) f7 G7 |' r& H. V
// temp = 0x00000F0F;
9 Z) m* ]* @$ z temp = 0x00000B0F; z! Y2 ^& o I
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized # V; l# z- w, N) N" b) } n
temp = readl(IO_ADDRESS(PCR_ADDR));/ \0 |2 d3 a0 }5 z
printk("temp=%x\n",temp);
8 D, }. ~3 ^& y+ M ~% W6 f8 ~ //SRGR Register
, B4 ^& K# r: N$ v3 i! D! L' B/ y //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11: ]+ _: A. p, @1 V
//temp = 0x301F000B;% s5 k! @# U$ P2 ^- ^
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
; X8 _: |( y# V. V" S$ k- Z6 ] temp = readl(IO_ADDRESS(SRGR_ADDR));9 A* b0 g/ v. \" ?* C
printk("temp=%x\n",temp);/ Y, K) s$ @" A. a7 X
//RCR
" R' ?8 [8 j% a# L //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
1 @* W5 r% e: P/ }$ I# b //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0& W( A4 b2 e; ?( y2 c
temp = 0x00440040;
( P" E! m, S# c' C2 I" r1 z writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized 4 E% X% N/ A h/ b
temp = readl(IO_ADDRESS(RCR_ADDR));/ y3 F" \2 Q1 C9 k0 W8 u/ t
printk("temp=%x\n",temp);
' N' q* i: I( P9 g //XCR. h# B, c& J. M9 o' e
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
, D: u* ~) K" E# J6 f4 s //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% A* s" `4 J4 O
temp = 0x00440040;" i {8 o6 K7 e$ }2 m
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ' K) f( q. \7 ~" f5 ]! ~
temp = readl(IO_ADDRESS(XCR_ADDR));
: x& f2 u; F' q7 u printk("temp=%x\n",temp);
, P$ ^& }$ w3 @- _) y7 n5 a, {4 j, R udelay(100);* e/ v9 K: ^" o7 {4 x% i
//SPCR Register
( {; V9 m0 H2 y* ^ //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1, X2 B( B# o# Q( _# f/ {
temp = 0x03C10001; //DLB = 0 VS DLB = 1( w) f7 z3 Q0 `/ T0 O; r
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
: h% Q- [+ v5 h" W temp = readl(IO_ADDRESS(SPCR_ADDR));8 {' r( ]# T" Z& @8 j2 g' F# r4 e
printk("temp=%x\n",temp);
" ?& P. s4 ^5 Q7 | udelay(100);
8 f+ F% r4 A5 L
3 u& {% k1 o' a& I6 O //set GPIO direction9 h3 o+ U* ]) O" s- L( [
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 K9 S$ V/ Y) G; ~$ W! y temp = temp | 0x00000100;//EPR----input
# @0 p) f( G' S8 d. _4 G! N temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output0 G1 Z' |% v) C
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
B6 N4 _8 l I( h% W! j/ y
& U, J% G% ?6 N7 H! I: o return 0;
5 ^7 V: T' q8 H/ B8 o}$ {5 O x( e# q
static void __exit MCBSP_exit(void)! G( q4 u" z& n; w v7 k- G
{9 M: F( X3 B' f9 E1 @4 E1 `% l
printk("mcbsp chrdev exit!\n");
9 x( V% R; m) Q, ]; e" L/ ] cdev_del(mcbsp_cdev);
' b( h+ e, A7 B$ y% k2 ^, ` unregister_chrdev_region(mcbsp_dev,count);
4 Z. `0 h" L' l; y7 j/ B device_destroy(mcbsp_class,mcbsp_dev);$ `; h! E7 q: m! O {
class_destroy(mcbsp_class);( `3 ]; Q# Y& s' ~
}
; }+ h, `7 q8 qmodule_init(MCBSP_init);
* @% _: a1 F' b- E7 o9 k3 l. qmodule_exit(MCBSP_exit);" F3 ~2 z, F2 N* j' o
5 u0 n6 n! E' E/ h3 c# l; S- P+ G7 T
MODULE_LICENSE("GPL");
/ G; s, C8 U, n* {( ]6 I: T* o4 a0 R H1 ^& C4 T0 M+ J9 X
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
0 c% S( U6 K1 n2 a r我的应用层的测试程序如下8 h# B5 J# ]- }: V
#include <stdio.h>
8 l( |" S& j2 e( k: e#include <string.h>% m( H- N: f0 _* o _
#include <fcntl.h>
6 k) W' k2 a* O( x% P$ `" N* `#include <unistd.h>
1 ]/ {; S; t( G$ `# @% T#include <signal.h>1 z$ V8 O- O6 s! H' m& i" p" E
#include <pthread.h> //线程6 o8 c/ h4 p- h3 x
#include <stdlib.h>
$ E' S n8 v2 ]. ]0 J& m#include <pcap.h> //捕获网口数据
5 b1 l) s8 i; o( h ]3 f; G#include <semaphore.h> //信号
+ z; @; ?8 x4 g9 O4 u#include <sys/types.h> //消息对列
1 y; ? A& \# A2 b9 E#include <sys/ipc.h> //消息队列
1 J- `+ N8 t+ U5 W7 u @#include <sys/msg.h> //消息队列+ `$ g1 x1 m$ l" \ B2 h( @6 e
#include <sys/select.h>
' k8 u8 K+ [; C9 ~8 Q u: B7 U8 j$ x#include <sys/syscall.h> B2 S. d4 N" t' s2 y6 q
#include <sys/stat.h>0 E" I- u- K8 |2 m9 Q! d* T
#include <sys/mman.h>1 W5 U$ P, L0 d5 o
#define msleep(x) usleep(1000*x)
4 M. W* _) o% \2 E6 }" t# _% R8 N: `& O$ Z$ e0 L# N# O
int main()
k, o! l6 M' q9 Q" C4 p9 B' a{
' \6 G. g5 e2 ]/ h" W* b9 T //MCBSP,ARM与AMBE2000交互设备/ n( L& M; }8 m* u3 [6 V6 b
int fd;
& |3 q/ n7 F: m N* ~% i unsigned short data_write = 0x5555;" k3 F1 m& s. ~) A! Z O4 m
unsigned short data_read = 0x00;8 @# u+ ?2 f9 ~5 }$ g) w! I
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);3 j( r+ h4 u$ X) U* B3 N% }. L
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);+ h2 X( v6 i' h- H( _$ t9 J) \, ~
' W/ U4 L- a- R$ U
if(fd < 0) m2 F/ k# f) C# N
{
8 }9 k- f; B7 b perror("open failed\n");
9 P, ^; }( s. f& a* f; s return -1;2 O, M4 B) q% W
}/ g% }1 u& m2 t2 _- I1 W$ l% c9 ?
5 Y* j6 c3 S0 m2 j% c while(1)5 }) A' N9 y! l/ q. ?
{9 J+ d) U, ]8 ^. l# `
; v* d; K/ ^# U0 X1 N# _9 `/ U8 ^
//AMBE2000每次读写是24个字为一帧
5 P$ ]+ o: o: x0 h# ]3 ? //写数据时将数据在底层存储起来,等到中断的时候再发送$ b% h- ~! D9 X( n0 W2 A( j
//AMBE2000输入数据是以0x13EC开头的
9 x4 J7 f" c3 \. b write(fd,&data_write,sizeof(unsigned short));
: d: J" K+ v4 W2 ~
. }% L R! }6 h, _# K3 L0 K //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
{/ }, E7 L) R( r P2 g read(fd,&data_read,sizeof(unsigned short));4 \- P( Q R9 m5 o
0 X* `5 I9 v- C+ l
if(data_read == 0x13Ec)4 z. o8 R I5 d1 X7 s1 i
{, a4 } Y0 K( g; B) j
. K8 T0 p2 i/ v/ h0 i8 f
printf("data_read = %x\n",data_read);
* m# S# M# h1 B2 I6 K- N3 m" e1 u7 r$ b }- Y5 D: e/ {( \, t
0 A. X0 X! z! v$ C. k. H msleep(10);, S. b: ]. A0 _! A
; @$ }3 w" }6 @$ [6 n- M+ Q; T: ]
/*
+ U5 G0 O( l( `/ v e ioctl(fd,1); + u5 W5 z0 m" C7 Y* k
sleep(1);
7 l- g5 v2 L+ f" ~$ K9 W ioctl(fd,0);1 S8 G; _. B" X! B" u0 s) Q N$ L
sleep(1);
" d G$ G& T! e; [: y8 V */
9 t/ ^! {. M5 G } & m) B! m! V/ C
return 0; H' T) v6 S# ~( v% W2 M% ^* M% E5 I
* d" D9 q2 Z; h2 p! B9 s
}
* Y ^. i$ R' W5 `2 f( s% Z5 e7 h) `( f+ @0 B
多谢各位指教,谢谢! 急
. S1 ~2 }! `! D, R/ V/ I9 l E+ s+ q$ G+ Z$ |4 s+ n
- `" X0 ^1 p: p# {' x
) x1 E# V: q0 u" ~; z2 ^# A( s) M& M
2 B% n# e j! F9 O( g: b
|
|