|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
5 J; B+ u! `* P2 d( ]/ R/*
7 [- d8 n% g+ X; _% R * Copyright (C) 2009 Texas Instruments Inc
, q5 D" A R9 ~! ^: Y3 I *. i1 B, F7 I/ c4 q
* This program is free software; you can redistribute it and/or modify
( K {- w& `" i+ P * it under the terms of the GNU General Public License as published by0 f% K1 `7 A2 n$ l* l4 u/ y
* the Free Software Foundation; either version 2 of the License, or D' g( v; e& ~7 C% L7 O) w
* (at your option)any later version.
' I; g- `+ ~# _( {0 G5 N- S/ A *
) O0 h" }1 b: i+ N8 y) i0 ~ * This program is distributed in the hope that it will be useful,* C* `% B- O) _ Q/ f
* but WITHOUT ANY WARRANTY; without even the implied warranty of
: ^& S% Q7 e4 X1 d& ]0 A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the; Z1 C: X8 }3 C. A- Q3 m
* GNU General Public License for more details.
3 W( N U* E9 U, H9 c/ `- ]7 \" m5 t *
" H3 |$ o: @* \6 o7 Y, o9 v" p' R * You should have received a copy of the GNU General Public License8 c$ Z( H+ f) z( M
* along with this program; if not, write to the Free Software
5 v4 C) Z' n1 d% P; ^7 o * Foundati0 j6 i- p1 h. y+ k! r$ E
*/) R( N5 D$ v% ^' i9 F V4 s, G
#include <linux/module.h>
e! `1 w/ B% k( U" i/ o+ O5 q#include <linux/init.h>
& e+ t1 A" O( k* ?#include <linux/errno.h>: J: @8 x J$ y+ g/ t
#include <linux/types.h>
' c* d- p& g/ ]- H2 U#include <linux/interrupt.h>
% K; M9 ^& g5 h+ v6 h/ S+ S#include <linux/io.h>2 G7 k, H6 \5 B; y9 T. ?) j7 a/ L
#include <linux/sysctl.h>) N' m: e# P0 b: Q
#include <linux/mm.h>/ W- u. Q. q+ A" d
#include <linux/delay.h>
2 Y# s' ~* N' p6 t3 _#include<linux/kernel.h>
8 B% l% i" u4 T9 t' L6 r3 I#include<linux/fs.h>
0 x0 D# }4 `2 m) m0 o" v& i#include<linux/ioctl.h>. i9 r- H' u% \/ U. X/ Q
#include<linux/cdev.h>
, [: {0 I5 s5 }% f" i1 j3 |#include<linux/kdev_t.h>& N/ ? t% O, t0 a$ h- y3 W
#include<linux/gpio.h>( O; ?7 X' f; I. \4 H
#include <mach/hardware.h>
5 d' [8 J0 f9 c* Q' `- N6 r! y#include <mach/irqs.h>3 J, s7 _) D0 @ V: P4 y
0 K! L1 i7 B, |* [
#include <asm/mach-types.h>; v- `: i7 u; ]/ y2 u3 |
#include <asm/mach/arch.h>
+ P( M# s/ t' \, Q& h1 [2 x#include <mach/da8xx.h>6 ~9 `6 c& x! y: |
#define SYSCFG_BASE 0x01c14000
& M2 T& ^0 h J, h#define PINMUX1_OFFSET 0x124
4 V4 K" D! X( y, }. [; w3 L1 j M+ f#define PINMUX18_OFFSET 0x168 5 ?; {5 H+ |# `
#define PINMUX19_OFFSET 0x16c
( L4 X9 f9 J8 l) r4 J#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
" N1 _! c9 B% x#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
0 Q% q: c, c6 |% f/ ]#define XCR_ADDR 0x01D11010 //MCBSP1_XCR( ~$ {$ {2 ~$ `, p* u' f; D7 F' d
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
" E4 v) l& n! j#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
% Y4 P; Q! I a( \- D" l' ~3 } " U0 r$ m( y7 n9 V
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
+ E2 x5 i' O+ |#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
( s; a0 }& M/ P" o/ d& I//PSC
9 h! {# ?0 V* F#define PTCMD_ADDR 0x01E27120
) L# P% y7 j o# o% \; {% @8 V#define MDCTL15_ADDR 0x01E27A3C8 y5 Z0 u3 a) \& o) t& f5 `. x
#define PDCTL1_ADDR 0x01E27304
* \ N3 ?1 |9 s! T! z8 F//GPIO8 direction
" _, N6 y# z8 U. m/ T#define GPIO8_DIRECT 0x01E260B0
; S. t& W' }9 Y9 O( |; D: }#define GPIO8_OUT 0x01E260B4
3 X7 ~0 E( k% }/ C! m7 y' {#define GPIO8_IN 0x01E260C0* S( d0 ^" K( M
1 M' I$ ?! E9 c1 y//#define MCBSP1_RINT 99 1 C; d. R+ j' S- A* o
//#define MCBSP1_XINT 100 0 f, O- [- s" o) s( Q' R
static int MCBSP_MAJOR=239;
. p" V$ O+ W# s$ R9 V9 @static int MCBSP_MINOR=0;) {" |) o8 \ s. y. b: V* Q& F
static int count =1;
* l' E- h2 a- y1 E2 k ~, Q1 G V+ r. k
#define MCBSP_NAME "MCBSP-device"
& p7 o3 F$ U: Q2 T: k$ U* J
* y: M3 |& j! l9 o+ c' b" [2 }static struct cdev *mcbsp_cdev;
' z. w1 _( N( h& P' M* Y( Zstatic struct class *mcbsp_class;
' p) [* b) p! nstatic dev_t mcbsp_dev;
( _$ x) S% r8 F/ P, Y! q8 lunsigned int DRR_data;6 Q# N* m; x( p# q
unsigned int DXR_data;8 f4 l( [6 T, n' Y6 G! D$ u! U
static int mcbsp_open(struct inode *inode,struct file *file)
* C7 p+ G3 f6 D, A- c8 H{
' p. E- s) N, e( Y' S' U
' h( Q1 D: E0 ^# _ //interrupt enable,initialized
+ n3 B( }3 t. F- e0 P5 H unsigned int temp;
& t. t; y: S- D v2 x4 L7 t //SLEEP_EN(GPIO8[10])---0
1 a: Q+ x+ R: C9 V temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));3 P" b* r+ W( a. B+ I5 l% s
temp=temp&(~0x00000400);9 V& a8 K. W7 v0 r' Q
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
2 y% G' L) [2 w7 r //RESETn(GPIO8[8])----0----1
) Q! ]* E3 \0 | temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));) V! l* s4 X1 N: h m. H [. a
temp=temp&(~0x00000100);& b" A) \! X. J- J K a" @$ P
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---02 `* h( B; G! Y
udelay(100);# t% E. T* W7 y
temp=temp| 0x00000100;
9 ] j/ ~0 l1 L l' W% |& V __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1 L1 p1 Y6 P% r* l) L. _
udelay(100);
9 e1 x1 m0 V {) x6 h+ R printk("open success!\n"); i" O! m! ?. H- H) H
return 0;; C' s% B: Z9 @: D; C" s# U% s
}: o! R+ ]1 X, X8 L- Z: D# E
* u" }: S! T* h) r4 {3 a* F2 |/ cstatic int mcbsp_release(struct inode *inode,struct file *file)' s$ w* G. s: ~( G/ v5 |6 K
{7 R5 Y0 q Y. j! E4 _6 f4 t+ w0 J
printk("release success!\n");5 H; D/ u9 d$ J# J) E5 s
return 0;: t6 {) M" I! E- ~- D0 ^6 [
}0 ?" u$ H" J0 ?$ \- r
. m$ G2 f7 ]7 z6 C! P
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)* k( K B9 W/ d" L+ [
{
7 |& g( x% R6 w" E& U copy_from_user(&DXR_data,buf,len);
/ ~, T) A: U: d4 ] I& d. c* f# D iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); # H; E+ W1 R" d" t9 ^/ z1 ?
return 0;
$ E( w& }/ D+ r+ ~8 W 6 N- v8 z' E$ W: Y
}
! n) U1 y! V# z4 c* {% l' X2 F! h, y4 {: N; t3 @. G f) h
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
, V. d/ c) c. `( ~6 x( D; l1 h{ / }6 d9 j1 B8 i" J( z7 s( }
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- Q- f m1 P {5 g( g- i copy_to_user(buf,&DRR_data,len); $ N1 b h9 f2 I5 b7 o) `% e
return 0;9 o. L; N( s% H/ V3 @. n9 v4 d
}
1 N' W4 L/ N( [# ^+ C; f2 |# @
6 N( B. Y ~$ P" z; E$ b% I, K. [1 U* s3 |7 R
static struct file_operations mcbsp_fops=& G' w; G+ l) X; A' C
{
- _& U( T& K" m- G( O7 _ .owner=THIS_MODULE,
% u7 p% P0 X( K! u2 M .open=mcbsp_open,- G e3 d" Z5 R2 W" ~" t
.release=mcbsp_release,
! r c# F# o. G .write=mcbsp_write,
& q4 q; [5 N- k4 h- o, a .read=mcbsp_read,7 n0 A0 V, r- q$ s3 y1 U: k) j9 Y1 c
};3 v! v8 A I2 G7 T$ f' b6 ]
static int __init MCBSP_init(void)
) Y$ {" C0 P a/ T{
; w" w9 x: ~* M C int ret;
5 u" |7 e4 P; G( Y5 H unsigned int PINMUX1_REG_old;, R1 S* ^. Q' M: o/ W x
unsigned int PINMUX18_REG_old;! e( j5 X9 |, @; P9 D K! a% G; H
unsigned int PINMUX19_REG_old;
+ w3 c( L! Z. l' S+ i' C' R unsigned int temp; 6 F) f1 c: n% Q$ N6 c
if(MCBSP_MAJOR)' q+ h* l$ v$ r
{# S1 t# m9 m8 v6 k8 c
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);& H# o4 ?, p J2 a
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
0 x5 x/ l% N3 W b6 g8 Z }
# R7 k5 k7 V1 }' `! B else# g' O% {% P, D, w$ c% u' b% q
{ L! C: ]# g- i. B: {: W* D
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
6 T$ {% [; u; j- L3 m$ p MCBSP_MAJOR=MAJOR(mcbsp_dev);
- e( Y) q4 t8 K$ w% S& H/ r }
5 i2 C6 a- ?1 q" a ^1 A X( c. @7 T# j( r
if(ret<0)/ V5 H# o& ~( a3 \; q& f
{
P1 M9 [9 k3 D) ~( O0 ~ printk(KERN_ERR "register chrdev fail!");
$ [# r4 ^3 C7 u. e# {8 f. I3 K8 f7 Z return -1;
+ e5 w) W& Y9 n: A3 p }
y$ q& Y8 A* v- s H
: _& v1 b; z1 N& R2 u mcbsp_cdev=cdev_alloc();
. M- @% ~& I: |" C& W- K3 E
# H+ C5 X b- x+ b q( Q( B* a if(mcbsp_cdev!=NULL)
% N2 l: p3 U% F: m V+ i {
/ _% X1 o' `& s% X& d' \ cdev_init(mcbsp_cdev,&mcbsp_fops);
9 Y" z3 b+ i, L: n1 Z# E mcbsp_cdev->ops=&mcbsp_fops;" b4 m/ I9 N( [6 P" [" x
mcbsp_cdev->owner=THIS_MODULE;+ k* t b2 G( x4 R
4 B* i. V' g D: P% j, N% w# y if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
) `% t9 H" p7 P2 ]. a printk(KERN_ERR "register cdev fail!");5 j2 i5 P3 }+ E0 U: y3 J
else; y6 U' n2 [6 ]8 P& A1 ` Z
printk(KERN_ERR "register success!\n");) K5 `5 A* I2 I4 J U) R$ P
}1 k* W! Q+ T/ [% z
else
4 }) A- s1 k. t5 C {# C* R& A9 H2 [
printk(KERN_ERR "register cdev err!");7 O. Y" I2 `, y( d1 V O9 ?
return -1;
" R5 O+ s2 R* {+ h3 N; t6 I! w }* H7 x& I. R b' O+ ?
9 N5 r8 J+ b' Z
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 A/ u/ O, W, C& r/ e( L if(IS_ERR(mcbsp_class))
6 D. n$ v" {7 L- {( z {
/ n) X) J$ L0 j/ M" g printk(KERN_ERR "register class err!");
( u$ O6 Q( h G Z x; p return -1;
% C) S; Y; U; w$ I; _ }- V% @- I/ U9 e
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
2 G8 \/ x. p; g. M, W! V7 Y6 F( h& o; z4 \6 m2 \# q
//PSC
" s& C) W" C0 d# N) d. p //add Enable MCBSP
' i5 a( M3 P) V& m2 w$ E //test
8 A5 @8 K& W0 y9 ~1 v6 r5 y( G temp = 0x80000003;- N, r: [+ E, A- `
writel(temp, IO_ADDRESS(MDCTL15_ADDR));2 Z: ^, t! X* n
temp = 0x00000003;3 x3 P/ Z' x0 [! T2 ?
writel(temp, IO_ADDRESS(PTCMD_ADDR));! x( F0 H% P1 k" r- L* W* K( j2 ]
" C) ?& {0 S8 J; G# A& C
temp = 0x001FF201;7 V* d* J7 S2 J3 D6 u
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
1 L5 P& v. b+ v: J3 K4 k$ A $ x! q) l5 k6 T, x. w- E
//PINMUX
+ j& E" J% t4 Q+ j //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
0 S8 n$ \; @4 ^0 ]$ e PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 E. A1 a: w% ^) q* V PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
! L2 O4 p) e8 d: r# W* M writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);6 G: [# K! H9 p5 X+ j6 W
: `4 U, _) Q7 L; r //SLEEP_EN,EPR,L138_SHK1,L138_RC6 K( r1 z. \ U; h
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); ' G8 ?5 ~. V- e: d7 p- v- E3 w
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; & E7 {% @ \) q; `( _9 X: } b! A7 e
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' q0 I2 L+ M, |& }1 i7 ?( T 0 q! u8 _7 C3 G$ |; \6 u
//RESETn,L138_SHK2
+ _. k4 S7 a+ B PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); : G5 q( P! X1 w% J
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
& N, v7 m; C- J# f6 u# l writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) j5 g8 Z+ i8 z: q) B " B7 Q' m0 N* w4 |8 D# x
9 g8 A+ ?% ~; Z ^+ x //SPCR Register: M" Q3 z: W* W; B/ u& D
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset- L$ P' [1 Q, n0 ] T4 j/ d
temp = 0x03000000;//(DLB=0)4 b% ]5 J9 |9 h/ @1 b& M
// temp = 0x03008000;//(DLB=1)
$ ~( A; R, z- J0 Y4 G5 [5 ^ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset9 [# y8 U- w' p2 x, y
temp = readl(IO_ADDRESS(SPCR_ADDR));
1 F9 |' u- z) g% p) ~2 Y printk("temp=%x\n",temp);
6 ^: C" }( U" j U# R * o3 q* [( Y* U
//PCR Register
& Y; m l* H4 s //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-08 f# T1 o4 a# S6 j1 o: O
// temp = 0x00000F0F;
( c$ V+ f% p" W: J temp = 0x00000B0F;' V/ X" L; s1 C* O# F
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
" E8 O: B! q7 S temp = readl(IO_ADDRESS(PCR_ADDR));
$ r/ o+ P: y; B, o printk("temp=%x\n",temp); : V/ s, y& N# o' W* A5 [
//SRGR Register* c7 q' D ^- t% u) d8 `4 `
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11 S! y T2 {* Y& E1 H
//temp = 0x301F000B;" H' ^# d7 J" ^0 K! Y1 n: F* D) z
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
& s9 k B6 A' x/ I9 X0 z temp = readl(IO_ADDRESS(SRGR_ADDR));
$ X+ h* h4 A6 a printk("temp=%x\n",temp);: Z* ^# a4 k% U/ u: ?( o% w
//RCR
3 X0 u* @2 i. V0 | //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,. {+ v/ }; l8 V7 d0 u7 J
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-01 p# A- Y4 [9 e/ r) J' W+ A, j" e
temp = 0x00440040;, j, o9 O. Y5 B2 Z6 M( ^/ B: c! j
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
7 l I! E( X/ S. o temp = readl(IO_ADDRESS(RCR_ADDR));
) X: v% k% P8 K, | printk("temp=%x\n",temp);
, W; I2 L& R" f3 W) s //XCR9 a( n# }' n+ k. u; h- k1 f5 j
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& z% X: A0 k9 |$ t3 x# @ //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% }( _! O8 H3 E
temp = 0x00440040;+ k1 n$ k5 T9 f/ X" ]
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 7 F+ I% A r: m
temp = readl(IO_ADDRESS(XCR_ADDR));7 R$ w" [1 R7 q; o9 A- i* x% k1 k2 A* Z
printk("temp=%x\n",temp);" q# U, ] ?7 m' N8 q( i' ?
udelay(100);5 v/ x" A) K/ c$ ^
//SPCR Register
5 k; M' d0 n/ ]& E3 w //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! Z: I. i( V$ V- z3 f8 A: @6 c6 C
temp = 0x03C10001; //DLB = 0 VS DLB = 16 h/ z( M* E( Y! z8 T
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled0 a8 F6 m) ?/ r# j
temp = readl(IO_ADDRESS(SPCR_ADDR));& J6 X" e% C8 {
printk("temp=%x\n",temp);
0 X% Z- z1 h% C- I udelay(100);
# U, X1 V2 I, G7 ?: n$ N, z& |+ m/ L: \( b6 Z$ V& m1 w. p$ H
//set GPIO direction# O) J& d( M' x) o
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));5 g6 d+ W2 |8 L5 k4 N& T& G
temp = temp | 0x00000100;//EPR----input
: M5 ]5 ?1 g3 k) ? temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output5 C$ n7 A+ F* Z- K7 e0 z
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ! E8 v/ m% L1 C$ E" v
1 `. s! _0 ?4 z( W8 I8 | return 0;4 s) U" Z$ `3 ~/ N% {( l7 _; X
}
3 e" B2 X9 r$ q1 Vstatic void __exit MCBSP_exit(void)+ u) a8 y. B: k
{) h$ D& P4 T4 H: ^9 L4 L, v
printk("mcbsp chrdev exit!\n");* t- o: ^$ A" h4 s9 c3 U- j
cdev_del(mcbsp_cdev);, W9 J7 z0 U0 v1 x4 a6 k
unregister_chrdev_region(mcbsp_dev,count);
/ _$ i$ v1 V* o4 [, H( F8 E( |8 @ device_destroy(mcbsp_class,mcbsp_dev);: y* b( M2 e: @+ T% Y
class_destroy(mcbsp_class);- j1 U7 k/ t h
}
: ~0 Q! X2 S7 R; Gmodule_init(MCBSP_init);: p/ {/ c, w. n& n2 W- } o
module_exit(MCBSP_exit);( a+ P. E' {' K$ P* M. J2 {" Q
2 [. g! P8 `! D) \6 L
MODULE_LICENSE("GPL");
5 d& y# {! P, @5 f3 Z6 z( g2 f+ d* l: H0 O1 m0 t/ K5 R
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
& D2 o0 t u- H4 o! V我的应用层的测试程序如下; y# S' z: u: d9 `" I
#include <stdio.h>
0 D p- S: U! u& U#include <string.h>, X/ ^; @ q+ T) A4 d7 v( Y
#include <fcntl.h>
& N" I2 f! O( B$ a#include <unistd.h>, W8 R1 X( U3 G5 ` T# v
#include <signal.h>
, J* @4 }# b8 N5 T( E9 n7 W#include <pthread.h> //线程
3 M6 }$ V4 x( M6 h#include <stdlib.h>
) y$ ]& I: A) a/ ~' K( P: M#include <pcap.h> //捕获网口数据
2 d6 ^: U( `; [1 U1 F#include <semaphore.h> //信号$ B0 K, _; C! A9 U$ X
#include <sys/types.h> //消息对列
/ H" ?/ c1 V, n- v/ L' l! O#include <sys/ipc.h> //消息队列
d2 k/ j% e: ?% p: d8 {8 D#include <sys/msg.h> //消息队列, ]0 I' b' Y! i! S+ f
#include <sys/select.h>
& G& S0 d" X# L' z, X, m#include <sys/syscall.h>1 E6 J0 `: S% r
#include <sys/stat.h>& [7 {3 F" [: {2 J- \* q- J) K, e
#include <sys/mman.h>; ^7 h+ M( K* y. f3 R+ A3 j j o
#define msleep(x) usleep(1000*x)
: Z4 y7 o# H. [8 l8 O) U3 G0 c! ~+ }; D* ]$ e; |% E( v
int main()
* F' y- {, ?' M# @{ ( m6 y1 X/ X, l' U5 R0 D1 @! G8 h
//MCBSP,ARM与AMBE2000交互设备0 ^! z- y% q. x- |" Y* O
int fd;
/ o9 [$ E/ s7 w0 w# ]' K unsigned short data_write = 0x5555;
, `: r( A1 j3 \ unsigned short data_read = 0x00;
8 l0 @0 d' B- j8 Y% U$ n; j fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: p9 R* I- r4 {* F: M( U- R // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);' |9 u* {/ u7 ] l. p. d. d
5 J7 s% W, f6 C# i if(fd < 0) o5 x6 s* ~$ ]2 U
{
) C. q7 u+ @9 o9 d6 q perror("open failed\n");
- d% Y% O* Z3 {2 ?! a return -1;1 H. B& k% o8 \) H, ~, o3 S: o
}
! Z) \) h+ K g$ `% A; e: q9 x1 z & O6 {4 R$ d* o$ z* v# s0 _
while(1) }0 V5 [, T' \
{" Z U3 M' ]# |7 b( K) O
3 o) `! |& B6 U( m
//AMBE2000每次读写是24个字为一帧- v4 w! K& D' X, B( X' n6 g9 \7 X
//写数据时将数据在底层存储起来,等到中断的时候再发送+ X7 p' @$ y2 N' ]' f' U( [$ A
//AMBE2000输入数据是以0x13EC开头的
; l" ~, \& Q6 v" z write(fd,&data_write,sizeof(unsigned short));
" P5 c9 c Z! G* A' O8 W3 n# P
% G- E# \$ B6 R( f/ i* S- I //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
' R/ O3 H, w2 e' ?% p read(fd,&data_read,sizeof(unsigned short));
7 |' u: c1 T9 o1 P' }0 ^" }8 c
2 J& u- c- N3 k" ~8 i& k; U1 Z if(data_read == 0x13Ec)
5 u; C) {% W! A, t' I+ Y {( G/ x. u) I! V( Q! B- @
# R4 w8 L) F0 g( Q- L v3 M' n, R7 m
printf("data_read = %x\n",data_read);( l% {9 D ?0 l/ X
}
* b9 x3 R& @- c* X B0 i: i; w # u( |. E: \! R4 Y8 x8 c
msleep(10);1 j+ v1 |: r9 Z& L+ p
4 r2 \! Z1 | F6 y, C9 K- t; M* s /*
m7 z9 z7 [7 q; V3 Z) ^+ K ioctl(fd,1); . N. c2 }# O6 k# l/ u! E5 l* p
sleep(1);' r, n" n# w6 v) t; ?$ o
ioctl(fd,0);; f. A) H4 k1 F% G" W
sleep(1);; Q1 R1 u/ }- f+ g# d
*/ ! v/ v- |+ _' N: ~, u
} 3 Y0 @6 @& b6 \
return 0;0 o3 I/ s; o; Y l* a% M
/ }+ L8 j4 Z& B: A}
" O6 a6 i1 ~) l; [0 V& t' E% u9 q |% R9 |6 L, ~
多谢各位指教,谢谢! 急. h. }# w6 O" b# E7 N a
; g$ e3 r0 u! {, j* t& [$ n! X; R U
2 k" o' C6 _; T
) y. W8 H6 U" P: I/ S S) t( n* |3 n
|
|