|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 9 x" } @: y# ?! H$ b4 ~* M
/*
' y; b, n% q, b8 B; n' C * Copyright (C) 2009 Texas Instruments Inc) u6 W& [5 [) C8 N4 X; v. M$ [
*1 k- p$ T9 H; [3 f7 v
* This program is free software; you can redistribute it and/or modify
6 m3 T+ ^2 _% }; s$ q8 f1 o * it under the terms of the GNU General Public License as published by
& U" [! ^' G, ^% [& x" n * the Free Software Foundation; either version 2 of the License, or
/ M' O; m. I% ]7 `2 I8 M * (at your option)any later version.! \; V8 D8 |0 o1 H7 M+ y
*
$ n& @: w$ x4 i* b6 O# n * This program is distributed in the hope that it will be useful,0 B( h0 ^$ i0 H) c E. }
* but WITHOUT ANY WARRANTY; without even the implied warranty of
7 S6 {) U; u; P% }* A * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the, ~# H) R( m# a* h9 f
* GNU General Public License for more details.
# w9 K7 B6 ?7 ?* o0 s *
6 ]" y* |. } ?. J4 z: z+ G+ ^; y * You should have received a copy of the GNU General Public License$ e, Q) |: I3 u: ^* ~5 l
* along with this program; if not, write to the Free Software2 o5 @+ {) v+ V0 S9 z+ _
* Foundati/ G2 G. D8 {) H1 M+ I5 L
*/
8 C6 F4 Z0 D, Q4 p/ @% F#include <linux/module.h>/ D# R: u2 |9 }
#include <linux/init.h>
& I0 n- i6 v, }+ {6 e#include <linux/errno.h>( p g! I6 Y, u* \5 M! D
#include <linux/types.h>$ b& N9 f9 B8 n: n
#include <linux/interrupt.h>
3 u0 `9 j+ E1 M/ b; I( n0 l, U! i#include <linux/io.h>
. v% }8 H: n# ` m#include <linux/sysctl.h># Y1 N# b5 M6 R1 c) g# U
#include <linux/mm.h>
6 S% J! V H, c( e#include <linux/delay.h>9 _! T# t! w O: F! S9 F
#include<linux/kernel.h>, J- e" E/ e* G' m8 U
#include<linux/fs.h>
$ L, ?% ?, X& F+ b#include<linux/ioctl.h>
" O" E( G: b7 k/ @# W4 H#include<linux/cdev.h>. z. g/ u* W/ Z6 Z7 ]; B) }
#include<linux/kdev_t.h>
$ A2 \: X7 V- j7 l0 i#include<linux/gpio.h>! T4 _1 k! E [: n$ m, |( F
#include <mach/hardware.h>
9 V+ T+ P$ w8 W" Q& l2 Z. {#include <mach/irqs.h> `' T+ r+ G+ q- \- {
5 {2 b$ ~) C$ N: M! Z' n: J#include <asm/mach-types.h>
1 o7 Z3 W% v1 E C% w' T2 `#include <asm/mach/arch.h>, w; ]$ M+ m5 E" E6 f
#include <mach/da8xx.h>, `" M5 [5 u' q0 b
#define SYSCFG_BASE 0x01c14000, A6 [4 w$ `3 S O4 l
#define PINMUX1_OFFSET 0x124
5 g0 O/ \& g9 x3 l#define PINMUX18_OFFSET 0x168 ; I9 X0 F( ]9 [
#define PINMUX19_OFFSET 0x16c
' z4 ]: X- q( ]7 o8 I#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
) s, v; F" V0 _$ q& U- o2 ~#define RCR_ADDR 0x01D1100C //MCBSP1_RCR8 [( s" U1 r2 f
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR/ x5 ~5 N; A! `1 U% ~
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR- r( V% y6 t0 D+ B$ r
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
5 F) l& O- j3 P& C; F ; O7 t$ c! N8 U, ?7 k
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
0 i$ [! z# z( M: ~" r9 r4 e#define DRR_ADDR 0x01D11000 //MCBSP1_DRR* f) e, u% k5 ^& H+ r3 F
//PSC2 L! B% e# B7 Z
#define PTCMD_ADDR 0x01E27120 6 ^) @/ p( X1 v0 c! k
#define MDCTL15_ADDR 0x01E27A3C' M! O, }! i' X" v$ F9 n6 v/ O( A
#define PDCTL1_ADDR 0x01E27304
3 V. L; \: g) s6 i) M% p//GPIO8 direction: \' [, x2 C1 X
#define GPIO8_DIRECT 0x01E260B0. _) {( y3 _3 D5 p0 t& Q2 D" d
#define GPIO8_OUT 0x01E260B47 U2 e4 b$ b4 d) q. v# D
#define GPIO8_IN 0x01E260C0. N; ~) E, i0 I; D- t5 d
3 |$ Q0 O& h" ~- U0 }" F//#define MCBSP1_RINT 99
( }! _5 ~+ ]. i8 v: \//#define MCBSP1_XINT 100
1 |. A) g3 M) Gstatic int MCBSP_MAJOR=239;
3 Y3 ^0 i* ?/ k$ m2 fstatic int MCBSP_MINOR=0;
9 T+ K h) a2 Y2 @static int count =1;$ Z/ \1 R+ D: R" l; _- W
2 Q& J1 Z3 T$ x( O+ c
#define MCBSP_NAME "MCBSP-device"
" E3 y0 h! u) O m5 C. @( n/ n2 ^ v/ w1 C; h: k/ {2 Q
static struct cdev *mcbsp_cdev;( J( v% O! d6 o8 ?9 |* L( A
static struct class *mcbsp_class; a2 j/ J& u r/ g5 g( F2 `7 `
static dev_t mcbsp_dev;& _3 Q+ z6 q% H
unsigned int DRR_data;
9 J: `* Y1 O$ H: f6 R2 }1 t& F8 ?unsigned int DXR_data;" I/ ~$ Z! F W; L d3 d
static int mcbsp_open(struct inode *inode,struct file *file) I0 H4 Q; _: }1 u9 i. B4 ^% u
{
3 u8 e# W. d1 l7 ?+ q' g
2 }9 w) G7 E# @3 b" m! v+ z5 [ //interrupt enable,initialized8 X. u# z J; C* }+ L! H' G: v( \* N
unsigned int temp;
: i. X5 d$ D( c! k' P' \7 t //SLEEP_EN(GPIO8[10])---07 f/ A/ G2 }! P; V0 q [
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
9 @) o, b6 l. ^/ A/ x2 R5 h6 j0 ] temp=temp&(~0x00000400);
0 ~% X+ Z4 e( G, O __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
7 n9 g8 K. [/ b K //RESETn(GPIO8[8])----0----1- u5 m, @- @+ u2 c- K# z+ d
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));: L9 D# u; u+ d# y, E0 i
temp=temp&(~0x00000100);7 d# v6 r( {4 K& B7 @
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
4 V: R3 ^. U# t; j udelay(100);
0 m8 j* b0 q' t( B7 R6 ^0 v temp=temp| 0x00000100;
; K- @: w% T& r( H3 ? __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 Y& l) `, [' K9 } @, M
udelay(100);# c4 L% l3 T5 w& N) c
printk("open success!\n");( m/ Z1 s: k7 a' w' g' Z9 Q% S
return 0;2 Q3 C( j" [8 [1 |5 z" K2 a
}
, \" p; \8 @$ |. H$ c5 ]8 ^; k: A) S/ D, r$ j, f
static int mcbsp_release(struct inode *inode,struct file *file)
* K+ y% B9 Z0 l: L1 M{
- w5 u( V1 i# \ printk("release success!\n");
$ G5 C5 _2 c9 l! u return 0;! [3 r6 U1 s, }3 I o
}- Q& h& ^: x# s! K! N2 H
' L0 x5 G; K& u7 H2 V; Q3 v2 qstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; v9 u( T, T$ s, r( ] p$ {0 S4 W{
0 G& e( p! D; _0 t) a, L copy_from_user(&DXR_data,buf,len);
0 r. |2 Z, n5 j; E iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); . G/ G) x, U' T' \1 K) @
return 0;
& q( o* x; l C$ [: E+ v; D, } # W1 M, |) |2 W& O9 U, l
}" k5 p7 ]: T+ N5 e
& |3 l8 w: H0 a% M
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
8 H% M# N1 W6 z0 W& ^{ 0 }( x" {; S* q' u& {) I
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
& K+ ~9 A: u) U* `- d5 f/ X* w; h copy_to_user(buf,&DRR_data,len);
3 T k+ t% O& g0 R! C$ a0 q return 0;8 O) P1 v: P# z; m. u
}2 O2 t7 l- B8 }- M0 |$ X: l( l
" L7 s. n) L6 G2 G# |/ q2 y+ k+ b h, n# I
static struct file_operations mcbsp_fops=
# S" b5 S4 t9 k2 E+ s% Q2 ]$ G9 s{ y4 C1 P. z Z/ y7 b* n% ?: v
.owner=THIS_MODULE,
, G% w" f8 ^+ q. t .open=mcbsp_open,! w1 A2 S H& t. y5 \9 ~
.release=mcbsp_release,* M9 m1 h$ I2 I0 P$ B
.write=mcbsp_write,2 Y9 a4 b( `. i
.read=mcbsp_read,6 R+ s/ O* @* q: j
};; A* v( F" D) |0 Z
static int __init MCBSP_init(void)
+ W F- B! D% |1 Q# [6 G{
: |! r% ]0 d5 g8 Q; X int ret;; T& a7 Y0 I( M; b% m# W" O g
unsigned int PINMUX1_REG_old;( m0 W8 j- o9 E# `
unsigned int PINMUX18_REG_old;. M4 s. @) ]: {7 ~ `! B1 n
unsigned int PINMUX19_REG_old;. N: \, F8 j1 `8 }
unsigned int temp;
3 V: A; h( D2 g6 w- s if(MCBSP_MAJOR)
! S4 n7 n& A! A: y; g {& r! ]" I7 p, }& l a0 ^: L
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);* R6 G8 F" n O9 H; a
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
8 T$ G. _$ W1 ^5 E& N" F }
( \" X) o3 M" N0 ~3 J else" L+ j' h* o/ {' M2 e
{
* F* L8 W; j4 R4 m A5 y ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 [9 C7 t; W' H/ A9 N( d5 r& a. h
MCBSP_MAJOR=MAJOR(mcbsp_dev);
2 x5 R+ E% d6 f- \% Z9 r }
, W2 _5 l) X+ M/ X/ ], L
# ?% q* }: I9 b7 n% e/ W# T if(ret<0)
# s! W, p r! W {+ N' L! y! a/ N6 e$ p* c7 t
printk(KERN_ERR "register chrdev fail!");
# o: ?" c! l8 i. p: Q return -1;" Y) J' L5 H- o" q
}" \7 s# _& J6 S' D N+ V& \3 ~
) e% o. {4 X* ` mcbsp_cdev=cdev_alloc();
) Y6 V6 y+ G5 [$ A 8 k$ i- s# z, o2 x/ S
if(mcbsp_cdev!=NULL)9 } F$ P: y, f$ l* }4 S, S) m0 B* a
{, J2 j/ _3 q$ i5 ?" C+ _. Y
cdev_init(mcbsp_cdev,&mcbsp_fops);
9 H' g# B: a+ y z6 D: H mcbsp_cdev->ops=&mcbsp_fops;
: |5 S) n# J! N! s. P# @$ \ mcbsp_cdev->owner=THIS_MODULE;' E K( z2 w7 b. l
% @' U5 Y8 y; C4 v3 i
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
( F$ n0 o8 R& A; v, X4 b printk(KERN_ERR "register cdev fail!");
8 N# I( K) j. ~! |; W else. t9 W" e: D) b* Q# }% {
printk(KERN_ERR "register success!\n");2 i& C+ a. |8 m6 c) A
}8 _# p& r# O8 |) v
else
5 M. ]' j7 M: b1 p8 E; e/ I6 p {
. x) ~' I0 z( y& W; E M' b# R printk(KERN_ERR "register cdev err!");$ }7 D: h) b" p9 v+ [
return -1;
! V7 \/ j! P. D2 u% N' b' { }
1 r' j( N+ R/ A4 l% ^' O4 ~
/ Q0 i! o$ f* ~. z mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
& j2 [1 f. z1 z' Z6 j$ l if(IS_ERR(mcbsp_class))0 I0 O, a6 G) @/ @" O9 d2 ?# `
{$ g1 _1 X) R; z5 K& I
printk(KERN_ERR "register class err!");( ^% D5 X9 ^+ N! a
return -1;" {) B! Y6 C3 f6 K! V/ x
}
6 T) s+ P! W& I' v device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
; u# h" w4 G# h# |1 q" ?) {) n6 L6 U. l! e' }# n0 s, r
//PSC2 Z K) R$ y3 L+ a6 f
//add Enable MCBSP7 m `; ?7 s8 o* |0 E v
//test
" ]+ K' R# x* C0 y* R$ E temp = 0x80000003;
! ]5 n1 L$ P7 u* D$ U writel(temp, IO_ADDRESS(MDCTL15_ADDR));+ q. S' @; D3 W+ B, K, M; X* \
temp = 0x00000003;
$ m/ M% z( {4 }: p# m$ B& U writel(temp, IO_ADDRESS(PTCMD_ADDR));/ F' @1 d3 ], a0 `- e2 e3 t* _
N: [" A$ N/ V: j# j2 J6 s
temp = 0x001FF201;
+ X' A- G+ t! }) B. j1 c writel(temp, IO_ADDRESS(PDCTL1_ADDR));
# F8 `8 F# h$ i" M: e" e
* t+ x7 }7 l8 t x5 |/ o //PINMUX
6 O8 T: y3 h4 \ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
$ {. [5 m, a/ S! p) C/ L! j PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); & P9 h7 V- c1 L, E
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
& O% r0 w& f2 j- M* t& l writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);& u: {0 e: j1 P. J
4 Y& |! R( D* K2 j
//SLEEP_EN,EPR,L138_SHK1,L138_RC
8 h; a8 |3 F+ X& u8 s PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 3 O ~/ q7 c+ l% q
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
. w& P3 k8 n& b4 q( z writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
9 w+ |! p9 O0 q ; P! g7 Y z. c
//RESETn,L138_SHK2
" A2 k4 L: n7 ] PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 5 a ?4 k2 e7 [5 @" K) Q
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
0 ^1 n9 H6 Q- H7 q/ z! ^0 X/ Q+ Q writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);, m2 Q) ?3 g3 e5 ?7 D' d8 h# Q
: M, T7 u: [5 r ; K. Y& f$ b0 V. k C
//SPCR Register
( ~# l2 G1 n h' G% M //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
+ k: P" H* M9 N temp = 0x03000000;//(DLB=0)% u2 v& s% ?1 ?" D/ C
// temp = 0x03008000;//(DLB=1)
% j( Y: a9 P# P writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset1 D1 o) E9 p! @# c# Q2 l
temp = readl(IO_ADDRESS(SPCR_ADDR));
" A; r- u& r5 V8 {) g' d4 A8 i printk("temp=%x\n",temp);
/ c" B% m1 W! I' m
1 v5 q* Y- y6 ^& I //PCR Register/ d7 r2 j- c2 o K- G
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
4 M: U {1 `* U: q% R // temp = 0x00000F0F;
$ Q9 b& X* Z3 S) D temp = 0x00000B0F;
' Y) N, o6 ^( y- r writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
6 R$ j7 ]7 j" y) A! c temp = readl(IO_ADDRESS(PCR_ADDR));
+ G& ^1 K/ F5 r( {' `$ }% g- m1 f printk("temp=%x\n",temp); * A# b% m% y- H$ J6 m d
//SRGR Register& R8 m( u& u0 n8 g* R
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
" f1 g3 H3 }7 Z# G% v9 g, f/ ~2 | //temp = 0x301F000B;
1 g& c9 L9 x3 u; I. K( C9 |6 B) i writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
5 ?! ?0 { i, y4 Y, e; o9 ? temp = readl(IO_ADDRESS(SRGR_ADDR));
2 Q- K9 w, M9 y% e) B* r printk("temp=%x\n",temp);6 V' X' X/ Z1 B; r) O
//RCR
( K8 k. ]% T! E4 [) F% G' E! } //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
' Q3 i1 P6 A) D& `% i! E7 b9 Y9 ~. I //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0, Z+ ~! a/ `4 r8 V2 A3 b
temp = 0x00440040;
8 h1 M- w+ k) v writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ) M7 z: ]: H0 U
temp = readl(IO_ADDRESS(RCR_ADDR));$ H2 Q1 X) B5 A: {' _ X7 |
printk("temp=%x\n",temp);
7 U6 w2 C. K- P //XCR L8 [1 Y0 b/ T0 F5 k0 V+ W
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
3 h- y. H! X/ h# u6 s6 k //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0! L- [+ O; u0 {! I; [4 @2 V
temp = 0x00440040;; X5 t2 _$ H+ C& x
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized y% |6 x& K+ W' k
temp = readl(IO_ADDRESS(XCR_ADDR));2 W& Q% x; G/ p* K: R
printk("temp=%x\n",temp);
$ ~/ X! Y1 F! j( B* O udelay(100);! g' ~: J0 E3 T5 ]
//SPCR Register
; Z3 d, [* d) q ~( \# ` //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
. i9 q/ i- ^5 e6 Y1 k m) |5 g temp = 0x03C10001; //DLB = 0 VS DLB = 18 L/ W/ P" v" o- }: e
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
/ W U, o% ?( e0 l- S& w temp = readl(IO_ADDRESS(SPCR_ADDR));
. X7 a0 B \8 U- V+ Q2 B6 f printk("temp=%x\n",temp);8 b7 D8 [( D i1 Y; y5 W/ y
udelay(100);' w" @0 T8 q3 q
) l, {/ h! m& c+ f
//set GPIO direction8 \% e* J) m# D6 q6 ~
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));3 m, L& D7 r5 j2 G
temp = temp | 0x00000100;//EPR----input2 s( e" |" o) M& ^$ F% r
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output* L3 `2 U$ o% s
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
8 E6 F0 w7 X/ M! c) f4 Z; J \0 X1 U- [$ L8 D: j
return 0;! f, i3 B6 ]# q" m( T
}( m' Q! A: K5 E5 D
static void __exit MCBSP_exit(void)
3 V) ^8 X1 A. v: i{
& C$ K0 i) ?# u2 m9 c7 C printk("mcbsp chrdev exit!\n");$ G/ E) d1 ^8 p- v
cdev_del(mcbsp_cdev);
/ t$ c" E5 ~* M2 U unregister_chrdev_region(mcbsp_dev,count);
; H8 o8 w# I7 O: \+ ^- M device_destroy(mcbsp_class,mcbsp_dev);+ x% d5 K! h. u! t+ O* m) L
class_destroy(mcbsp_class);+ A: C, Y b2 \. k
}$ b/ N8 E) ]2 ]% L7 L) C3 S
module_init(MCBSP_init);
$ z3 ]- F: n- [ B8 e* a$ ]$ L* amodule_exit(MCBSP_exit);1 r- l4 J! z6 x% c) k+ B/ E
( A* V" X: F7 q. D* p; b! L U, qMODULE_LICENSE("GPL");
- v4 b& P: {) I" Q+ u1 d: S5 F; n% \' K6 [0 \4 p3 m% C4 W
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。- k* j: {# j% b9 ?! A
我的应用层的测试程序如下9 I Z& p% r+ D+ v! S
#include <stdio.h>: U8 x! j* l& [9 g* [+ T y
#include <string.h>% _. s7 n) X# A& V/ z
#include <fcntl.h>
0 z U7 @, [4 O, X6 r$ i$ e#include <unistd.h> i1 r# W5 Z; {3 Q) a
#include <signal.h>5 h0 L/ y! v8 `
#include <pthread.h> //线程/ Q5 B4 ]+ z; u; U6 ?% f
#include <stdlib.h>
3 k3 ?. T+ A- s- m1 m; A. j& o#include <pcap.h> //捕获网口数据
3 W! q; ` m" C4 T7 F- }) [8 N1 H#include <semaphore.h> //信号" m: ?" ~/ J' C( O) |4 C
#include <sys/types.h> //消息对列' s" N$ Y/ c" m, i
#include <sys/ipc.h> //消息队列
3 z' j6 ?' f* a& E#include <sys/msg.h> //消息队列3 ~: P4 j$ x& Z( j& t3 F% P% `
#include <sys/select.h>: ^! V7 W( Y0 y7 i3 `9 t8 @# f5 o# P
#include <sys/syscall.h>& Q0 e3 V# n9 L. m- `
#include <sys/stat.h>
. B9 ?0 C# y$ T4 [: p. s8 A#include <sys/mman.h>
& f R8 e' D# Q* ~$ l#define msleep(x) usleep(1000*x)
7 z0 |5 ?7 s, x2 B9 k7 ~& h: v1 m' V$ c. P
int main()
3 \0 W4 j, X. x" e& P{ , R4 t& j* Q r }
//MCBSP,ARM与AMBE2000交互设备4 _/ s9 @ D2 j( k
int fd;& l& k2 M& k0 q8 a8 v" Z
unsigned short data_write = 0x5555;( O, y1 b4 ?- R3 D9 O
unsigned short data_read = 0x00;; D+ a ?, x0 x: z; V1 H% q2 ]. f
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; Q- v1 l* ^2 |6 V; g
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC); R; h0 x( ]% b0 C4 f
/ J9 ?" }- S7 H/ f if(fd < 0) t5 k5 M j9 C
{! M+ j$ F3 o8 G% ]' t
perror("open failed\n");
. Q* C8 v. {" e2 a- I5 @9 v return -1;- F5 K" w3 Q" t1 x9 |) ^ c8 x/ y
}
* j* d3 Q; y# l: O) U
. h% c$ {# L C& k% c% i while(1)+ b4 [: b! E( z! m2 k* b8 E8 X
{
0 `" }% W8 o0 u% a; h$ _ " ^# K ?; |4 h
//AMBE2000每次读写是24个字为一帧# P' l" S0 X0 h w" z
//写数据时将数据在底层存储起来,等到中断的时候再发送
0 B: j: j" b' b9 F2 j //AMBE2000输入数据是以0x13EC开头的
2 R5 b0 W& |! k5 Z- T& g write(fd,&data_write,sizeof(unsigned short));: o+ q9 q6 Q4 R) p7 ~
9 E1 N2 v/ L# e& G# u //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 : m. Y5 r3 @' ^$ g" W
read(fd,&data_read,sizeof(unsigned short));
) F' l+ x d Y2 O n$ \ ' {5 `& T9 c( X6 ]$ [; O& ^2 U9 m
if(data_read == 0x13Ec)9 \' C( g6 J" Y, D2 z3 f& T4 [
{
7 ] y( k7 L+ [. k' M1 C & p4 y3 R* X2 N1 y `7 F2 E1 P
printf("data_read = %x\n",data_read);
- Y7 O( G8 _' d3 v# p }5 N V9 G$ B1 Q. X/ t
# b! V' e2 V: U& p4 k
msleep(10);( K6 C) N7 m9 w2 {3 |% F& R
8 L9 h& x- t* ^. g /*0 k% {" q; _9 I( S7 r: b
ioctl(fd,1); * u2 t, S: ^# m" n% t2 K; J
sleep(1);
% M& o. c- L. x7 n% N S# C0 { ioctl(fd,0);2 Y' v, x8 S' Z% f [
sleep(1);8 Q+ E4 ?5 {8 k* I3 N
*/ # V4 f ]; P/ b
} 1 a& ]. g# V8 k) d4 ]4 J: b6 ?
return 0;! \) n9 l- S4 f
) G- g: \4 {/ Y/ P}
- \4 s4 w m+ ?% Q0 R, K( C* L
% s$ x; W. a a/ E' k多谢各位指教,谢谢! 急
% E; E* D( D2 ]& y( q, u3 G9 o+ e0 a$ _' j9 l' X$ R: i+ a% U
9 w: ^: `4 `% t, ]: {0 d1 @& }. d; Y$ P8 y; b! a* v
5 q9 d" m& w3 Y+ e! [7 u% J- W
; b# y" e. O+ S
|
|