|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
; S6 u5 D3 b0 G0 V/*
8 K. L' a( m+ O/ a8 e( G3 e k * Copyright (C) 2009 Texas Instruments Inc6 `/ g0 l1 @4 B- C, ?
*6 ^! j" B% {( G. f# r
* This program is free software; you can redistribute it and/or modify
9 k5 T' n0 m( G9 f * it under the terms of the GNU General Public License as published by
; S( H; l4 Y6 E8 \8 [9 ^" ] * the Free Software Foundation; either version 2 of the License, or& I5 O9 s5 e# g5 P6 T
* (at your option)any later version.
* {. W; R n% b0 X8 M4 e */ K! Y* Q0 l& ?6 k
* This program is distributed in the hope that it will be useful,
% m+ [- W& S$ H( r# u * but WITHOUT ANY WARRANTY; without even the implied warranty of. y/ I1 S# ]; z3 f- t
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
A: c+ z( Q% T, o * GNU General Public License for more details., Z9 a* C I& @8 v% L/ `5 |7 R, V
*7 I& F0 G8 k+ r: M, R0 q1 {; `
* You should have received a copy of the GNU General Public License
# c* s3 }% F% ` X! M * along with this program; if not, write to the Free Software
/ e& C3 s O# B- { * Foundati0 o2 M8 G2 t. |1 t2 e
*/: x7 z$ x# g- V
#include <linux/module.h>( Y% G) e7 S- q/ V/ x& _# F3 q+ T. `
#include <linux/init.h>8 v! P3 K8 q, r6 B0 w- K9 m
#include <linux/errno.h>( N2 i9 i3 a4 G8 ]/ `% }, i. ^
#include <linux/types.h>
8 I0 S1 ]2 W; m. F \#include <linux/interrupt.h>2 J# g9 {; Y3 N, u8 O0 e: N
#include <linux/io.h>
% Y' [2 G- z" _* s9 I7 L#include <linux/sysctl.h>9 w+ T! y a! N d' k
#include <linux/mm.h>
9 C$ B1 Y5 `. q) `8 A0 h4 w#include <linux/delay.h>
; n6 H! Q. f k#include<linux/kernel.h>
( P# W! e1 O4 {1 T* R#include<linux/fs.h>6 w* ]4 q! q, {# {
#include<linux/ioctl.h>
* t& O- ~+ }7 H7 P' R! D#include<linux/cdev.h>3 C9 D, T* G3 P `% i3 a
#include<linux/kdev_t.h>3 y8 j8 d4 d# y
#include<linux/gpio.h># @ K& V" J# e0 N
#include <mach/hardware.h>: Y+ d# J% M3 @) o' }
#include <mach/irqs.h>' i4 O! A/ K5 @8 x0 p6 J
7 D& f) I: c1 F$ Z/ G' m2 z, W#include <asm/mach-types.h>
% E1 c- {5 v" P( M" K( f+ q#include <asm/mach/arch.h>
2 @; q v8 ^9 O. c#include <mach/da8xx.h>9 C& l' M! H7 Z$ s% q+ f) Q
#define SYSCFG_BASE 0x01c14000! y+ M0 Q9 ]+ s. U J0 N/ O
#define PINMUX1_OFFSET 0x124 6 w3 F* b0 i/ F
#define PINMUX18_OFFSET 0x168
/ y; P* J( ^* R, ^# `( b#define PINMUX19_OFFSET 0x16c
- Q8 {& y/ t0 o- U% P! {6 k; @#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
* l2 m) |& G6 }1 [2 Y% h#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
+ Z% f+ Q% ?6 V; h% i' p! W. s! {#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
$ s2 s: U) ~% F, t% A6 A* M#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR7 D% f. D1 X) o' {6 @, S9 x
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR% V" \4 N0 e# _3 E( a* {# Z0 K
+ z$ s0 q4 E+ S2 `7 c#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
; f- s1 Y2 N1 Y0 L#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
4 u! i5 k& w: n$ j* w//PSC
4 q/ Y0 m1 y. C. [2 C1 X4 g( D#define PTCMD_ADDR 0x01E27120 # H3 C r) n' T3 W7 W7 e
#define MDCTL15_ADDR 0x01E27A3C
/ q2 }0 ^8 Z0 p; [% n#define PDCTL1_ADDR 0x01E273040 P$ @* W; x) `1 i
//GPIO8 direction( f# t3 S' n3 `2 H6 r) X5 S
#define GPIO8_DIRECT 0x01E260B0
9 I W, g' d5 C8 ~0 o* z#define GPIO8_OUT 0x01E260B4/ h' @" p; q/ B3 q; E3 X
#define GPIO8_IN 0x01E260C0 p+ H5 T) v5 G) `) x- a t
- \% @" w7 m. _: l" }# Q& O% s# S//#define MCBSP1_RINT 99
# T q( C5 P+ {: W# a: _5 C) {' j//#define MCBSP1_XINT 100 ) T* L2 I$ Y1 x# P7 q
static int MCBSP_MAJOR=239;
3 Q; h, P) W+ _$ Y) i9 H0 g. xstatic int MCBSP_MINOR=0;
+ h4 w3 ^( `. o" Y+ G& \0 zstatic int count =1;. C0 b1 @* W& {. _1 C' q! F6 x6 {
7 b6 N" G+ I/ @3 G#define MCBSP_NAME "MCBSP-device"
' ?8 y! ~2 X/ j) p, o9 I, K1 n" \4 t& P* b) c+ ^
static struct cdev *mcbsp_cdev;4 L `5 Z" {# l/ l: _+ j. }
static struct class *mcbsp_class;
, ~& j1 d0 C& G( `static dev_t mcbsp_dev;
. K2 E T+ t4 M( ]unsigned int DRR_data;
# X; O, w9 c5 \, }' xunsigned int DXR_data;
1 K9 N w, A- Jstatic int mcbsp_open(struct inode *inode,struct file *file)
+ r+ d+ X9 F4 W+ n{1 m4 Q: L7 ~- [# ?
. R x1 B5 @* j* t4 c* w8 {- V: W //interrupt enable,initialized
1 C7 k/ _2 ]( X, p unsigned int temp;
6 j$ F6 C, Z; s7 F //SLEEP_EN(GPIO8[10])---0
3 R5 H( V1 a6 R+ W4 Q! \" D+ ` temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
0 [( @* N6 L* q temp=temp&(~0x00000400);5 `. w! P) ]. r8 i T
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
6 \) Q" f1 Q. p: t$ o4 A //RESETn(GPIO8[8])----0----13 Z9 A2 C- L4 G5 A. N) D! Z
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));$ r. C7 k) W2 N
temp=temp&(~0x00000100);
& c+ P6 E3 d7 v! }( U; @/ w __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0) ?3 y# _% X4 g) x: C) {+ ]
udelay(100);
2 g; I K- N2 R. O8 x: h! f7 e8 d temp=temp| 0x00000100;6 t5 _9 x, r+ v$ k4 ~0 N
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---16 }# L2 `# O' w
udelay(100);+ _4 |3 `1 q) c# a* G Z: V
printk("open success!\n");
0 f9 I0 Z& _- h# Z return 0;
5 U# z$ U+ x$ E3 b, Z0 C* G}
2 a! p/ q% E! l- }& D2 ^0 ^
! z3 O2 |0 [) l6 {( v; I5 lstatic int mcbsp_release(struct inode *inode,struct file *file)- y: f# S- i* q5 s, s# I* [7 i
{
% L1 \% G. @% P; {: N printk("release success!\n");( N4 g" y$ `4 c; G( G
return 0;
# G5 y8 `$ A0 w}. m: C4 u6 {1 H% N3 a& Z
* j) p1 E& S; T/ d/ V
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' w) p: `# I' o( t& Y
{
; j4 v& f7 x( i2 B+ \# {& C4 N copy_from_user(&DXR_data,buf,len); E! A9 t0 w+ T% z' c
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ; }; T q# W3 G( Q" g) _
return 0;
4 H8 \ ^6 c; b' E , W4 T( D5 v. E) L0 e% T
}
/ z( ~' S( D) U4 K$ v/ d8 I- G. \/ u9 x
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% \# O* e: f$ E( B# }{ , g* ~: T: w" L: s* d
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));5 `5 V' ~: d% P4 b) a
copy_to_user(buf,&DRR_data,len); 7 O: n! f# C5 Z( d& x
return 0;! O- a. j, C: n f
}
& u% b5 u* `) _; h; t( s9 l
' D1 p; a/ ~1 ~9 r5 P' S0 B1 z; _& u2 n8 E; o
static struct file_operations mcbsp_fops=
% ?1 y6 d* k" d; ? [! b1 X% p{
3 }) ?: l/ {2 t .owner=THIS_MODULE,
/ S, V/ X6 x% ]9 t! Z .open=mcbsp_open,
! a0 t7 O* H+ X! E .release=mcbsp_release,4 W3 T. J' J' B5 B: n) ~+ g6 V
.write=mcbsp_write,
9 ^2 ?6 H% q6 L% D- c .read=mcbsp_read,
8 F5 B( R' ^; m. L};
7 C4 T( ^8 e- O6 Astatic int __init MCBSP_init(void) Q9 A% ^" q( P/ g
{1 m8 ~/ p- h. ~+ ?! q
int ret;9 t2 `3 P. P; B6 a
unsigned int PINMUX1_REG_old;
5 s- t6 c1 E+ Z/ w1 i: k( y unsigned int PINMUX18_REG_old;: o/ ?, m3 e% Q; i, R; F
unsigned int PINMUX19_REG_old; f5 {% w( \% }- Z) G! w6 ~# V, l7 O
unsigned int temp; - ?. S o4 w, N
if(MCBSP_MAJOR)
0 v2 u. P9 a3 }- p5 V T {. @/ p" @* `& f6 m8 O
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);) H* f5 X" h7 e2 E: i: A% o
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* L, H- l" ^6 X0 O8 l2 J
}
, M( B8 v S0 L' {, h8 C else
( W* [( E: O1 W& w {
, Y8 u1 k& [$ q$ c" f3 _ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
4 k4 l5 ?. L3 M1 f0 L. ^1 f MCBSP_MAJOR=MAJOR(mcbsp_dev);
" H! d; A% ]3 Y& v0 Y! v } k/ U( ?, C( G3 _
7 M+ L" F8 T, O) [. f+ f2 P
if(ret<0)
% p, c. t6 w" Y! N {' Q) t- m1 z, K+ |
printk(KERN_ERR "register chrdev fail!");
: E- Q$ F: ~4 b7 y! a) J return -1;
6 n# W( k& R8 {0 W; o }
$ Z6 }# E7 [( V; a4 s7 q' X
* E, i7 S8 t# W! L; ~, G mcbsp_cdev=cdev_alloc();
. ^$ a3 a1 p, Y + T( Q3 K7 C2 T* k2 r
if(mcbsp_cdev!=NULL)( d# W: h1 j7 w, Z: ]
{. b0 n8 M; m7 U
cdev_init(mcbsp_cdev,&mcbsp_fops);9 e6 U. ?4 A Q
mcbsp_cdev->ops=&mcbsp_fops;; a1 y! i. v% ], B0 a
mcbsp_cdev->owner=THIS_MODULE;# R+ k) b4 H( i; `( Y: x; ~
: P* d. `$ T* S! z$ X. L if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
2 k8 T$ K4 W6 h: }; H printk(KERN_ERR "register cdev fail!");
* o7 R; ~+ U+ W else
, [ p3 m5 I1 f' W* }% g printk(KERN_ERR "register success!\n");
7 e- i$ [5 B& {, ~5 d) J3 b }
3 ?; y: ?( u0 v% |+ K! K else: M! @% z# T5 m' B
{. _4 S- M5 d' |5 y
printk(KERN_ERR "register cdev err!"); ?. T# s1 {6 @. ^
return -1;* W: ^( a6 {9 M
}
' L; x$ D& N, r/ h( j* j+ ]# R + E; n) P: N6 N6 `7 Y
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
3 s, @# m+ n' }6 g if(IS_ERR(mcbsp_class))$ r8 K# F" H; g. B
{
8 ~+ v9 N1 g4 A. Q printk(KERN_ERR "register class err!");% n8 Q1 `3 L; H6 C% e. _" I) W( \
return -1;4 {. p5 _% e: U- P3 l' |$ W( t" |0 ?; a
}
# H% Z$ d( Q# [) I- g device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);- w/ I8 p6 h$ t- t& {5 C
8 X' v" A5 S/ ]. U- m/ l3 G* u4 K
//PSC
' X I7 T3 j. N //add Enable MCBSP
9 T" p3 p' o/ H# k) d //test
. y% D, T7 ~6 Z- y# j- x6 b temp = 0x80000003;
& ], l( i3 U2 h0 u writel(temp, IO_ADDRESS(MDCTL15_ADDR));# J* z ]1 v# C2 r" _, U# z
temp = 0x00000003;
! k) }1 v5 \; d! P! q; W% x; X writel(temp, IO_ADDRESS(PTCMD_ADDR));8 E4 y' r' `( P2 a! k; Q6 I
1 l: t' R h$ N* H$ q5 S/ q temp = 0x001FF201;8 g# w7 w% }* K9 A- o
writel(temp, IO_ADDRESS(PDCTL1_ADDR));& E3 Z6 \% ~( U. ]5 n5 }7 X
' E! q9 o7 |7 a9 |
//PINMUX
& B; {' e( Q! n N- ^ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,; u' o1 `+ p4 k
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 2 {+ z! Y2 t2 @; x
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 5 e! t2 Z4 [8 ?, ]+ q
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 H# U% Z( c# U2 j. U! y / I1 W0 X5 X" u/ L
//SLEEP_EN,EPR,L138_SHK1,L138_RC
5 m* l7 a' T8 `# x {9 z9 l( E2 S PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 5 o9 T( b5 _* I' G. t4 ~0 n' \
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; % o8 }' v4 V; V4 D0 B" t
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);' {# Z2 a4 N8 Q/ x- B+ c9 g
! ^, f* D, \( h$ K% g
//RESETn,L138_SHK2
/ c" _3 d' a+ M5 H4 ?: A. m1 n PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
$ t9 V# x: c. f1 c- P PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
2 L% V$ S; c' f( I# p writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
1 A! q# o7 R! S8 V( [/ |7 O
- U, A# P5 w9 L" Q8 n 8 |3 m4 W8 G! G- m* q* O5 h
//SPCR Register
" R M* L' {9 |4 u //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset, A( P0 ]5 c N9 C/ x$ ~ }
temp = 0x03000000;//(DLB=0)' ]: J) G9 `& B( P8 c$ G9 y+ y$ Z
// temp = 0x03008000;//(DLB=1)) j5 W- S2 _1 o! b
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset4 q( f/ B& d* S: X' d
temp = readl(IO_ADDRESS(SPCR_ADDR));6 S1 }$ h! ^& T# z
printk("temp=%x\n",temp);" t, E& D/ R* }9 S' T
# ]) R& c, U% m0 O
//PCR Register- t$ K4 u$ w% z( ^, k
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 ~4 y& b: j9 C, [2 g // temp = 0x00000F0F;
0 E% X$ r' V& y, l# \$ j) E temp = 0x00000B0F;/ A; T3 L8 e& {! g0 u$ P" a) Q
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized " f/ Z% z) w8 I0 P% s9 O/ R
temp = readl(IO_ADDRESS(PCR_ADDR));
- E* m+ C$ M6 X% } printk("temp=%x\n",temp); k6 ?8 T; Y/ N6 k+ \+ N
//SRGR Register, ]3 P# l5 P! q/ p
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
( k" @# K, U9 s/ Z& e- g* h" l //temp = 0x301F000B;) y0 p1 y1 x, O6 z! i
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized $ f6 e. H' c2 G/ n4 H( c4 ^0 c
temp = readl(IO_ADDRESS(SRGR_ADDR));
% X: X5 U: @& y" I8 y; ] printk("temp=%x\n",temp);
0 ~ k; @/ f. \ F3 O @ //RCR
& h3 [6 V5 A$ r" s! H; c+ e //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
2 O* W9 \6 @& V2 r* X) d( c8 m //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ i& N) R! Q! t, f2 K M temp = 0x00440040;; E$ X; d9 D. a7 T2 P# x" l V
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized ) n! p( ~+ \1 p
temp = readl(IO_ADDRESS(RCR_ADDR));: ]: H; A/ D$ y* X q
printk("temp=%x\n",temp);
, F" u/ f2 o; I //XCR7 R6 U% s( y9 T, T3 ~: K
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
& P4 e' T* ^& p% M" |- r8 l6 ] //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0; ^+ Z/ \( L4 P& b \% x
temp = 0x00440040;8 e7 l& j$ \( L( Z# a
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
; D/ H6 e3 S6 e, [- O% o temp = readl(IO_ADDRESS(XCR_ADDR));
+ V, t% Z" o7 K printk("temp=%x\n",temp);
0 y# s+ G! @1 p udelay(100);3 Z, v: v3 d2 V% j, O
//SPCR Register
* k: u ?2 u$ J2 Y //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-11 Q1 j4 a1 A; G) u" c
temp = 0x03C10001; //DLB = 0 VS DLB = 11 I" T" n$ j; {
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
, [ J7 N. z8 M4 b" O2 s/ Q temp = readl(IO_ADDRESS(SPCR_ADDR));6 m, z2 {: P! R) t1 Z' |3 c
printk("temp=%x\n",temp);; X5 E/ [+ g0 }
udelay(100);3 m8 j% g, \- Q/ T; H# o
/ R7 {$ a& D1 Z& Q //set GPIO direction
! S4 A- @+ v7 `6 h) h temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
* U$ ~2 q b0 k: Z/ Z* Z) g temp = temp | 0x00000100;//EPR----input' T* W6 r9 Q# r& M
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output- U! O5 Q: W1 Z$ L5 ? T5 {" m
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
0 \, _# U& \5 C: [
) h! j5 _! o6 `0 I; _ return 0;& ~* S! y! j+ x& H5 R. X
}- J+ M B6 C6 P9 n; ?: e4 H. B( h
static void __exit MCBSP_exit(void)- ]9 P# }+ G5 H* Z& O# G
{
* @5 y3 B( q/ @. c/ C; X printk("mcbsp chrdev exit!\n");
( S+ D3 M3 P0 P+ c* r# s0 k# V0 m& L cdev_del(mcbsp_cdev);
) C: ?7 _, p; g, w/ y- p8 S: X unregister_chrdev_region(mcbsp_dev,count);
; ?; A" z `5 N4 E( E; ` device_destroy(mcbsp_class,mcbsp_dev);
: G1 B$ ~) ]: }7 a class_destroy(mcbsp_class);
, e+ r: ?) C; h) p}! Q9 n1 L+ s; D2 o# L1 C
module_init(MCBSP_init);
* f6 e- c0 Y H9 ~- Fmodule_exit(MCBSP_exit);
* S5 N+ v! ]( z& Y" v- n* K3 J i3 _" ^, x
MODULE_LICENSE("GPL");
9 {& F. N$ b% G0 e
" l7 ~, u$ x8 \9 M; V0 @+ b9 [我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
- a3 Z* \/ }2 L# N+ m我的应用层的测试程序如下
$ z: Y+ i% \8 [/ A: H#include <stdio.h>4 o9 N. O! [0 p, Y. {1 L9 q
#include <string.h>& r( ~; Q' o% a2 |0 G* Y
#include <fcntl.h>) o- M+ i" v* s$ N" g
#include <unistd.h>
) K% Q' r4 ?; u8 s; K- g5 q' C- C3 D" q#include <signal.h>
- v3 ?, K7 Q. D2 q; F4 e' h- g#include <pthread.h> //线程
. D1 ?. O! {+ V& T#include <stdlib.h>( j u E0 }& t' a7 q
#include <pcap.h> //捕获网口数据, I- b B' p: w5 b+ P
#include <semaphore.h> //信号) q; [8 S; y- b: c
#include <sys/types.h> //消息对列! h; \, E: W1 ?: l& g, R& r
#include <sys/ipc.h> //消息队列
+ @1 \% `" ~7 \" e#include <sys/msg.h> //消息队列
5 U+ Y; }) z* z$ {$ a, i#include <sys/select.h>: i9 i9 ]& X4 x+ E1 Y" A7 U* V
#include <sys/syscall.h>7 Q" V' m S: a6 x1 O* k1 f
#include <sys/stat.h>; x6 B4 `) d' O5 p0 I, W$ v+ l
#include <sys/mman.h>
8 q! H8 x; Y1 t/ a#define msleep(x) usleep(1000*x)
- v% O8 ` i7 G. ~8 C
2 ]2 x+ k/ V4 k) L+ y( X: D6 [4 tint main()
) P; x6 J2 V) S6 I7 Y" M{
, j4 V1 v$ Y" y" `/ ` //MCBSP,ARM与AMBE2000交互设备% ]6 N/ n/ u* o" I" M4 W5 i4 R4 o; H
int fd;' j3 u# r7 B1 X+ w$ p
unsigned short data_write = 0x5555;$ ]+ x' a5 b. v) }- r
unsigned short data_read = 0x00;
" h" h3 V7 A' T' `# A( s8 j! O fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 z% b' O& ^4 r% d; K9 A4 T# E // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);& z7 R: @. m% x
5 M, l I) f, R& ?
if(fd < 0)
2 p( e/ k) y. I- o4 q, r {
# k9 E! J+ n4 z( D: \) u/ N2 P perror("open failed\n");+ @# d$ p7 j% N, h3 l* j
return -1;5 m5 W$ D# M0 M+ E) G/ L
}
8 t1 r# @$ x" w; M P; a
- {6 n& t# c: c) N5 Z2 W( j while(1)0 f8 p0 u) f' ~$ }* v" m
{% B4 c8 u# T/ q- a) U e
; _8 D4 z% m! |, U$ @
//AMBE2000每次读写是24个字为一帧1 c3 F. d% l d8 b8 M% n! D) b
//写数据时将数据在底层存储起来,等到中断的时候再发送1 m' a7 I( n6 d
//AMBE2000输入数据是以0x13EC开头的6 J& F, J/ J2 D$ \0 d. R: F
write(fd,&data_write,sizeof(unsigned short));
& g& a9 `3 K2 O
5 P! q3 ^: |& p( r* V //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 1 S) i. v9 C6 j
read(fd,&data_read,sizeof(unsigned short));
3 P$ ?5 f5 E \ R+ f
/ T3 w* P$ O/ e6 _ if(data_read == 0x13Ec)# a7 K0 y8 D: \6 P5 N7 X g
{, p0 |7 D- U) x) n$ W Q
4 O H# b6 ~9 l* [' T3 P
printf("data_read = %x\n",data_read);& K" V8 f% ?9 z% G" Y& J- z% C& J% [: `
}( a: Z3 T5 q7 x* y
. {: n& i) s R% i* J' I5 N
msleep(10);4 \* t. z. F8 ~9 s
) T, ?' f/ e! v* x /*; _, r0 s. }5 @6 f# ~+ A. }. c
ioctl(fd,1); 0 ~: i6 P l8 a) L3 t6 |
sleep(1);* H" Y/ D' Q- T
ioctl(fd,0);
) q5 Q1 A) ]0 w5 j sleep(1);2 @2 Z7 k4 d; ?7 J
*/ ! S/ p: L& v6 ?+ ~
} & [7 [' E( Y. r Q/ C9 [
return 0; P3 Q) t! F5 x5 U1 P8 V8 c
1 a! `: M* m/ J' O}' _3 u/ i0 W5 h: ?% R$ x! |
3 P; Q* x9 ]- A# _- e. N
多谢各位指教,谢谢! 急* s- S- f, Y) I/ W0 w, w; a) t
3 V7 i* j, }. Q! G, I# }
/ }# E5 I2 G# I/ F- \* {8 g* K
" c. e! P# l! k& z3 {# i. W' Z' |; z; h5 R- A% @' D
' [1 `6 O- t% r
|
|