|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: 1 v. d3 m4 e% v: {2 P: E
/*
& @. @; l- L B/ z1 P* F5 m * Copyright (C) 2009 Texas Instruments Inc8 \* M1 ^6 |! x( l7 k
*
1 s: E0 | G+ I, x * This program is free software; you can redistribute it and/or modify
) v* e2 e4 h0 L6 K * it under the terms of the GNU General Public License as published by% {7 h8 ]0 X! s% V% l3 e4 H& f
* the Free Software Foundation; either version 2 of the License, or
" S. c; D; h. H3 { * (at your option)any later version.
% O2 X* c2 N. ]' D O2 {. I0 ? *0 @* ]& L) B0 }$ z7 m" g
* This program is distributed in the hope that it will be useful,
7 r, C: J# }- s * but WITHOUT ANY WARRANTY; without even the implied warranty of% ]: m( Z1 V/ U9 G: X" c3 h
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the. \* C. K! R9 O3 T
* GNU General Public License for more details.. v, M/ }( i$ G) f
*$ h' X( i0 g' y& z. B8 s6 B' t* D
* You should have received a copy of the GNU General Public License( z# f8 J- G1 v. ]/ D+ S9 l# X
* along with this program; if not, write to the Free Software
6 J+ b0 a8 Y. }6 a, c * Foundati
4 A) \1 y8 o% j1 Y: ~! N6 b*/' {, I. U, R! d6 [* G. Q5 k2 u
#include <linux/module.h>$ E) n. M' ]* P6 L
#include <linux/init.h>
* W# @$ x5 P) a#include <linux/errno.h>
6 o$ V! X- A& o9 {8 G#include <linux/types.h>
/ J9 |; k3 l$ \3 @+ t, y( y" Z#include <linux/interrupt.h>
- P3 ]: b: Q3 V# l9 y" x, a. {#include <linux/io.h>
5 [" r' W7 }; B. b! g& [#include <linux/sysctl.h>
( h6 L" \4 Y) e6 l# U) r5 v6 |#include <linux/mm.h>
. B9 W$ O$ t2 J4 O0 w#include <linux/delay.h>
/ p5 f/ s$ S% a( [#include<linux/kernel.h>
9 g2 l0 Q1 I7 _6 n) u" Y ^#include<linux/fs.h>
* E( ^) A* o+ L3 t#include<linux/ioctl.h>
8 X# ?1 D) Q4 w' v#include<linux/cdev.h>8 s0 L( G/ T8 @: S
#include<linux/kdev_t.h>
& d* |- ^( u. T. b) u0 t) v; O#include<linux/gpio.h>
# t% c' ]3 i* L#include <mach/hardware.h>0 k- N' K: ~& j, K8 h) X' _1 G
#include <mach/irqs.h>% G2 {6 e3 E" Y/ p6 f5 h
7 d, n: w; P H( j" x3 ~
#include <asm/mach-types.h>* O; k8 v3 g. T! P2 ~$ r
#include <asm/mach/arch.h>
: d2 ]2 M/ z# y; o" x#include <mach/da8xx.h>1 V/ q. N4 h! \ [% k
#define SYSCFG_BASE 0x01c14000$ ^# n( Q9 C* U) v
#define PINMUX1_OFFSET 0x124
. a! B1 \9 {5 U) F#define PINMUX18_OFFSET 0x168
% u* t& \ w, \! F9 d#define PINMUX19_OFFSET 0x16c
9 o9 h; U5 D' D5 I#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
& \( ], k; q; [#define RCR_ADDR 0x01D1100C //MCBSP1_RCR0 g. h( ]* u9 D9 I
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR; w$ ]- D2 b8 W! f: j: F
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR+ c/ k# _$ k5 m$ R3 ^
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR* d$ X6 E! L9 h% X- n G2 b- [" r+ a& z$ \
' F; W$ p7 {# j. _* ~+ V, [#define DXR_ADDR 0x01D11004 //MCBSP1_DXR7 o/ p- e W2 \& V3 j- u n; w
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
+ W) [9 U+ U* J: x//PSC
- C2 q& F. i+ [5 b#define PTCMD_ADDR 0x01E27120
0 @$ z5 v; b! n0 F3 y x7 P#define MDCTL15_ADDR 0x01E27A3C" _& l% k/ T: a8 u
#define PDCTL1_ADDR 0x01E27304
8 a& a* h, W3 b8 a2 Q' Q//GPIO8 direction* x+ l) F/ K1 I Z9 u
#define GPIO8_DIRECT 0x01E260B0
, R, ?4 G. [( W7 [* l#define GPIO8_OUT 0x01E260B4; J/ j" Q; n; A+ H& C( K
#define GPIO8_IN 0x01E260C0
/ c) B0 L" Y( ^& q0 |
% R( d" M0 S" i//#define MCBSP1_RINT 99
$ p7 o- h" t) ?6 O//#define MCBSP1_XINT 100 ; w8 Q* n# q N/ l7 O, H
static int MCBSP_MAJOR=239;, L- l2 y# n' B% G: K4 V1 E) a
static int MCBSP_MINOR=0;- h0 K: F3 m; {# i8 V y
static int count =1;
& h, o: ^; C" `
7 v# S c+ I; R#define MCBSP_NAME "MCBSP-device"+ t5 s$ X9 r* O2 [% F; ?
- [+ |* J2 R9 J' C# [: Y2 m0 l, Y5 }/ X
static struct cdev *mcbsp_cdev;: w7 c/ n& M9 T+ O
static struct class *mcbsp_class;# D0 b" H7 L7 I+ _/ V
static dev_t mcbsp_dev;3 s9 C, T! M% w1 U% z! p
unsigned int DRR_data;" C6 F" ~# Z+ p/ J( H; ]. c
unsigned int DXR_data;
, R3 j% |8 ^7 a: O; P; z- P, }static int mcbsp_open(struct inode *inode,struct file *file)1 E) H8 w, e4 ^
{+ T7 K, ], X P& r
: ~8 U4 j8 q4 ]. ^: Z( P
//interrupt enable,initialized
- k0 I( t' c0 Z$ d unsigned int temp;
) m3 g" K: R# e8 ?8 a //SLEEP_EN(GPIO8[10])---0
4 j# X. t$ C P1 ^" I( B, _5 T2 x temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
8 ?+ |7 p3 c. }! L$ l @0 k temp=temp&(~0x00000400);' z2 M1 d9 T& {7 p8 I" M F) {
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
: W" e+ J6 F9 Q# r //RESETn(GPIO8[8])----0----1
3 V( M3 @6 \. {, C- s% \/ W2 J9 M temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
: S7 o) V8 C0 ] temp=temp&(~0x00000100);
, b6 b$ S" Z; Q8 d; D E9 O9 i __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 |# m, R3 @) Y y- X udelay(100);
+ B* A7 N1 t6 S1 L- R- r, ] temp=temp| 0x00000100;
6 I( I; S) X3 G4 ^ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1! }/ G) _5 w. s- Z) A
udelay(100);9 q* W: u" I9 D& o8 S
printk("open success!\n");/ F* S6 A- I! V0 ?. {
return 0;
3 C) B3 T+ N6 d1 [& w}
: _4 E- `6 d, t7 m0 R" r7 h- R
w1 m% O4 B$ W7 @static int mcbsp_release(struct inode *inode,struct file *file)
! v. b3 v9 O* T: n$ e{
& Z4 i8 k; M0 k" t; I printk("release success!\n");
4 Z' {5 I ?7 V# \2 H- ~ return 0;
' n- a# J4 F/ ]}* b4 _7 S% E- q* V/ M( I
& t. }3 L$ ]2 w1 i+ T* f9 L
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
% y, Q; b5 F, G{
) _# ?8 M: d: }: H2 d- E0 S, ~ copy_from_user(&DXR_data,buf,len);
1 d+ t4 |/ X3 Z0 Y$ e iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 5 U+ V3 c, n4 b ]) _" }0 w
return 0;
% ?' l w5 O1 |8 H0 @% E# `! f# T
5 L2 i6 @" Q9 O2 A) w/ e, ~0 H* B}6 J, E# c8 ]2 J6 z# \5 ^
2 }1 ]) `4 t* ^3 V5 M6 ?
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
- p, ?4 G L* }! ]3 ~3 C{ , z# Y* Y* s. R3 y$ \9 h# t
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
+ Q* D; n7 n1 e# F copy_to_user(buf,&DRR_data,len); ' K5 _, o% _4 W, `& Z9 I
return 0;
/ @# E* G" W8 E/ L x( U. O}
9 e, Y8 n& J, H' P0 f3 ]8 m( X
6 _; N w3 }6 e) F" }
/ A" E% ]. v; ~# {! Pstatic struct file_operations mcbsp_fops=3 Y7 i; D b5 H% {1 F/ {
{+ F2 K4 r8 w* s3 C6 d
.owner=THIS_MODULE,, T% q/ r2 @7 a# \: M2 P6 z& V R
.open=mcbsp_open,8 V+ u. o& F, p' ]9 @! g
.release=mcbsp_release, C) \7 S5 s% T) B
.write=mcbsp_write,
; @& { f# \* H: @4 L, ]5 u .read=mcbsp_read,! c. W" M1 H. O- c, c. m0 J" E
};
% C5 V1 D i3 F' C% ostatic int __init MCBSP_init(void)) l, C/ w& e& ?- g
{
- c' R1 ]7 Q3 E; @# ^1 ^ int ret;
! d! {- d Q3 d7 J* S9 V( J1 c- H unsigned int PINMUX1_REG_old;
& P, _" h6 s; o+ S2 c unsigned int PINMUX18_REG_old;
* U# T0 L' F" y; P$ E% s* H2 ] unsigned int PINMUX19_REG_old;# O* }* \6 }% [. x- b! [' w
unsigned int temp; 4 _9 p6 }( V3 o4 |1 {
if(MCBSP_MAJOR)! C- |5 ]- c7 `6 q- B
{& T; l; \1 Z2 c7 p% l% s: _$ n1 O
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);5 R$ k$ R/ n9 L, a
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);1 B" N# W* ]# u; Z; k
}
; v: B, R: |! |) K else* ^. Q- A/ Z% W. z
{
0 E. c w: h2 X9 K$ s$ @* m ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);& ~: x% e- o" h, q7 N1 [
MCBSP_MAJOR=MAJOR(mcbsp_dev);0 u; v! V5 o2 s$ n/ D6 d
}5 O z; ]; {& Z4 L
0 R- U* y) J( z% L6 g* s& ?
if(ret<0)! @: N. p3 h5 B0 h$ S. K
{# i* A) V% U n O
printk(KERN_ERR "register chrdev fail!");) y& y7 o9 Q, S C) ^8 A; a
return -1;
+ W" y4 q5 @. D' U7 }: [ }+ @! v' Z7 U a8 i; m6 X
5 e. c: o% r6 S6 `
mcbsp_cdev=cdev_alloc();
( h2 E8 D1 q7 Q! a/ T% G# p' Z2 I ! l% q& f% b& n
if(mcbsp_cdev!=NULL)$ G# i( q' U: L; Z# R$ b s
{7 F+ y J9 V% w' W& ~
cdev_init(mcbsp_cdev,&mcbsp_fops);
& k1 j. M' L& U( D' }0 x mcbsp_cdev->ops=&mcbsp_fops;
! A5 Q/ \' R3 S* S mcbsp_cdev->owner=THIS_MODULE;
. @- U/ p' m' i" {8 q9 g
& b0 M& d/ A* t% [: c3 d if(cdev_add(mcbsp_cdev,mcbsp_dev,count))0 L! G* K! h8 T4 }4 \* F
printk(KERN_ERR "register cdev fail!");1 b; S: P5 K6 _" ?3 f- o4 q) F
else
4 \& p1 |+ f: j, t2 g printk(KERN_ERR "register success!\n");
, k8 f" c* h$ d+ `2 J" i }
! o7 h' c7 i) ?$ _& [ else: _7 O8 x- s. Y# G. Q
{
" m; ]# w. S% t, m |, b printk(KERN_ERR "register cdev err!");# }7 i2 w, n; ~$ q- |
return -1;1 b; H" M$ L! d5 w
}* z1 u$ J4 \9 E
; P1 w' S' P" H0 v6 W' |
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);/ n+ [: j( g& C! ~9 h* p
if(IS_ERR(mcbsp_class))
% I# Q& @0 G4 _: V { h( U* f- U2 u& k) m. v
printk(KERN_ERR "register class err!");8 o: A4 a- }- X4 u; Z( J. W
return -1;1 I, N) @3 _; ?8 F4 @
}5 U5 k V# s2 k/ `
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);* I& _9 X) R9 D* t5 m3 g# w
( }" o3 l3 G) J3 E/ ]
//PSC+ q+ b. Q. e! A% p& U
//add Enable MCBSP7 R" c" d; |# w+ C' F2 j
//test
: `) W$ `3 G, M! G. C5 a temp = 0x80000003;" }5 Y* b3 b) [
writel(temp, IO_ADDRESS(MDCTL15_ADDR));& w5 t) g% S# q4 v: Y) V$ R
temp = 0x00000003;
1 q6 r! X5 b7 a: h) m. s! O$ p" { writel(temp, IO_ADDRESS(PTCMD_ADDR));
4 F z; q4 l1 ^* h/ g* n . S9 m! ]1 G9 E9 N7 l# i2 R' Z
temp = 0x001FF201;
$ @" z5 U* y$ ?5 b, o( W ]/ K writel(temp, IO_ADDRESS(PDCTL1_ADDR));
* G' c I$ P) E( v. I
6 o* {& S$ y( k* V //PINMUX
; V4 X% |% o3 k$ ~: L# Y //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,: Y& o) A1 i. Q7 p: ~: D W2 q
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 3 _9 s4 u4 Y& y" H- `0 y% x% l
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; % m4 w0 B0 ] i$ v, C- i$ n4 p
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);# ^: I: E2 z U& p, J" |
0 S- O. T* f+ E! S- q6 b' h
//SLEEP_EN,EPR,L138_SHK1,L138_RC
|* \# }& i% e1 W( C4 g' q1 s PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 6 p( c: f5 x& Q5 ?- `" c
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
" p& q3 o U: N writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 n7 f% M8 Q! s
^& A! l. ?! ?) h% K //RESETn,L138_SHK2$ P, S5 M" R5 ?" D7 _
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 7 g# T. K. W- i9 c( p7 @: [
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 8 w+ V3 G7 Y1 [6 F5 P0 T: D
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ w0 s/ N0 b/ H. [8 ?* q6 M 9 [( G& T8 q6 R7 ~. F
5 q9 ]: x3 x2 J2 M //SPCR Register
5 N' }- N0 p4 |( s$ [7 N3 Y8 @. \ //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
( ?% O# G. Q* O; [6 O8 F: \ temp = 0x03000000;//(DLB=0)6 a6 O+ [1 T# L2 b# G3 ]
// temp = 0x03008000;//(DLB=1)
" k5 a- \, o& C$ G* H' B2 |- L writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
, ]5 r9 d! w) Q5 y) f+ G7 X temp = readl(IO_ADDRESS(SPCR_ADDR));1 }) i$ C. T& B7 H
printk("temp=%x\n",temp);/ R, J* E' f/ u% D3 J) {! V/ D0 r
' l7 i2 `3 A+ N2 j //PCR Register7 g' K7 Y1 U( X0 `" X4 B; E
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
9 a, y2 K/ [( N // temp = 0x00000F0F;
' d- m% t1 b$ N( V2 H4 \ temp = 0x00000B0F;
% ^/ i" L& X$ l! { writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
8 I7 R% V% H5 r5 B4 [' o temp = readl(IO_ADDRESS(PCR_ADDR));. N- Y2 V+ i2 t8 E
printk("temp=%x\n",temp); 5 t. z, i& Q: f5 W
//SRGR Register, A+ D# R; I8 P6 ?$ p8 c& R
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
2 K% D8 J! y- g% k //temp = 0x301F000B;
8 ~7 e9 L( h1 G* f writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
3 ]$ m7 p" U% @' d, _0 w temp = readl(IO_ADDRESS(SRGR_ADDR));5 J- K5 r. D( D" ], u
printk("temp=%x\n",temp);
5 X" }5 B, D2 D //RCR4 i) a: g# W+ d8 l( `! v8 Y5 ]
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
5 l/ X' n# A8 G, B/ {9 { //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 Q" i4 T5 z- y% Z
temp = 0x00440040;' u9 R# p7 B# a5 u/ J2 S
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
" G; L2 b! g2 N8 e temp = readl(IO_ADDRESS(RCR_ADDR));. ^- l4 Y. D; V( d2 k) h# P) D% ^/ f& Q: Q
printk("temp=%x\n",temp);
9 ~- R& v; f; U" s4 s6 G; p //XCR
7 j2 \. B! z8 C. c //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
, E9 X. W: v9 I' b; H. R' h- z //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-07 S% v; O B6 E* @8 |* N$ r
temp = 0x00440040;1 P/ C8 r* y: G0 X
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
. c$ c' ]# U: M5 o% P temp = readl(IO_ADDRESS(XCR_ADDR));5 B6 C6 @6 O4 W9 M: s2 u
printk("temp=%x\n",temp);) C% M& D1 V9 ~! n/ v3 t
udelay(100);
7 ^1 ?' b# Z( R/ Q //SPCR Register, x5 z% p3 T) T
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-19 t* p4 C( C- i
temp = 0x03C10001; //DLB = 0 VS DLB = 1
9 ]4 |) ~' c$ q7 B1 b writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
: L& u( ~( x- p5 V+ n! g temp = readl(IO_ADDRESS(SPCR_ADDR));& p3 T3 Y! P6 J) d
printk("temp=%x\n",temp);
9 t! b8 M* C1 p& d udelay(100);
6 E: e" v) c- x: d/ O3 o2 {
6 p! k, n! U* @1 m( v" `: r //set GPIO direction
' Q A0 t0 b) |$ o- u! R temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
5 z8 R' V! ~4 t" s temp = temp | 0x00000100;//EPR----input) Z! T1 t; J9 z. k
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output3 ?7 L8 C; D B! t
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
/ g3 }% i% n) P! {* W$ W 9 j1 K/ d/ k& k
return 0;! k" T* y+ S# {' i
}
0 ]8 ^) z5 A. Z! q. Astatic void __exit MCBSP_exit(void)7 o! h# K' K7 w; W$ J
{
( t) v4 B( S4 \1 b8 Q q printk("mcbsp chrdev exit!\n");
, `6 H$ n; Z7 O! U* B, Z cdev_del(mcbsp_cdev);, G* I# S- s: X
unregister_chrdev_region(mcbsp_dev,count);
4 t [$ H6 S0 j device_destroy(mcbsp_class,mcbsp_dev);
: k% o# B. s4 i& Z. w class_destroy(mcbsp_class); d- L2 W) W7 h# L+ Z0 x& i4 M1 n' V
} \$ ~' X5 J7 O4 j$ o x' x
module_init(MCBSP_init);
& C H9 l& B% Z* Q) ^module_exit(MCBSP_exit);
! S1 ~4 R, x2 u3 o9 b7 @; n" D8 o# K. r6 k" N Q9 |
MODULE_LICENSE("GPL");# W3 V$ U' E1 u; t3 r; M" v
+ g s- q' C( P
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。) N# P b3 }$ O% f, H( E
我的应用层的测试程序如下! v$ \% |# e4 a; f- h
#include <stdio.h># y% N' E4 w% d4 T/ G
#include <string.h>6 Q+ X4 D/ D K. J. u9 ] L+ ~) |
#include <fcntl.h>
4 }) a( z: @# u" z1 z1 b' C/ ^7 j#include <unistd.h>2 P& T( r; c5 S7 H' M, e
#include <signal.h>. `, M) m( h8 n7 {: C
#include <pthread.h> //线程' _+ t" W) S7 E( c7 i
#include <stdlib.h>8 x6 U8 v; f: D% I% k
#include <pcap.h> //捕获网口数据* {4 p- y/ [, W. Y! E
#include <semaphore.h> //信号5 Q F7 d6 B" J7 {% L* F/ K! Z; u+ y; c
#include <sys/types.h> //消息对列5 P! J1 k) s9 p1 N6 w* p9 Y# l
#include <sys/ipc.h> //消息队列! q, A2 V5 u; V, W8 s6 ^
#include <sys/msg.h> //消息队列
9 L* T" y0 `" I$ b#include <sys/select.h>1 J6 V" a. G \' w( G/ }1 d
#include <sys/syscall.h>
7 A; a2 _. |3 m8 N#include <sys/stat.h>8 w2 I ~6 q7 u+ q% A8 n& K
#include <sys/mman.h>0 t- K5 \) U) Z/ X9 G4 R1 K
#define msleep(x) usleep(1000*x)" V4 Z7 H9 [/ y3 L0 D
9 G1 c/ h# H, W$ B9 N
int main()! k- |9 M: q3 @2 }& d4 x( F
{ - P. m0 _5 A$ {* K8 F0 y
//MCBSP,ARM与AMBE2000交互设备
6 h4 ?" w3 {$ s7 S4 v3 O) i int fd;* a* f) G/ p/ F) S L4 {
unsigned short data_write = 0x5555;1 X( l. P0 {5 A d& B, z
unsigned short data_read = 0x00;/ v5 R4 s$ n% b" ]& L" m) n
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
* P1 z# |/ `6 m/ ` // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);: v1 u# T o* n D' _
: O9 t+ `; J, g3 L7 @1 Q: ?( M
if(fd < 0)1 E! h! \9 X- Q4 l: h) f) {2 c8 ^
{, u7 _; v& I/ G2 h% g9 p" }" [
perror("open failed\n");
6 z* w& g- N' D return -1;
4 _; d' O3 p% t4 J } j8 W: `; t# _0 m# I. \& k
$ j9 H; o# {) X* S% J# g
while(1)3 A' |5 P, P: F: |
{1 D$ _0 L6 a; z% _* H; g
n/ ?3 {, c' Y6 c* U# R
//AMBE2000每次读写是24个字为一帧* X A0 O( ]9 q7 _7 r
//写数据时将数据在底层存储起来,等到中断的时候再发送
. j4 t5 R9 }% |. T9 D //AMBE2000输入数据是以0x13EC开头的% y+ E* ]! F" J: m
write(fd,&data_write,sizeof(unsigned short));
& X* X9 D0 a! H9 o8 s4 S
" ^( v, l/ n4 T t //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
8 l, q7 @/ u( `# B# I read(fd,&data_read,sizeof(unsigned short));4 A4 C% p% G3 j' n
" ?8 l" [# t5 s( c* L( T if(data_read == 0x13Ec)1 `; G# d$ ^) E' K( E3 d- ]
{6 z( J+ K3 H5 a' ~# `7 {) }4 M
f7 E6 e% R0 l* @
printf("data_read = %x\n",data_read);) X6 y4 S1 O$ b2 I. u% x4 ]+ U
}' t9 Z. v/ @/ ~1 G! q
& B: E4 N+ c2 t7 ?0 K* h
msleep(10);
* B. ~+ D! f& a1 T" O5 Z! j7 b # @+ P; l( N; |9 A
/*
: b& i6 T" P. J ioctl(fd,1);
( V4 V$ C/ C6 [$ r sleep(1);4 a+ m/ d& x, a$ }
ioctl(fd,0);
- [* r1 i$ P4 Y sleep(1);
+ ?7 A+ {2 g. ]3 ]; s% E/ [& U/ ~) l */ 9 J) \/ g: U. Z! |# \! w7 H
}
$ O2 u/ ^. x$ @6 v7 o/ f# H2 W return 0;9 W+ k# u) h; H2 V& N
' @# L8 W+ I5 h! y}
+ t1 S" B0 h- @% p* u. S0 K# p; d0 ~* S. g- K
多谢各位指教,谢谢! 急9 q7 x/ P* P7 h
- s: _6 x) O; e9 G: w2 k) T- U0 Z
! k2 z) I) ?3 ]% c/ C: y" W8 R7 H% {. i
+ m# J& i' T" v; ]$ z" g
, w' g4 K( R7 l |
|