|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
% l* ?) _3 }7 ~5 h; k5 _5 D/*
0 E- {# w3 N$ s: X' f * Copyright (C) 2009 Texas Instruments Inc' A( U c5 \% v7 v
*. p: C$ b" A; O" l
* This program is free software; you can redistribute it and/or modify
# K p# \$ ^9 a# r K. I7 t! R C * it under the terms of the GNU General Public License as published by
* C) l# z7 y# f% i; T * the Free Software Foundation; either version 2 of the License, or
) Q- o4 T- A, s * (at your option)any later version.4 b4 u7 |2 K( }! N% i
*; U( R) x# t" o5 a) L/ L
* This program is distributed in the hope that it will be useful,' ?! G. H& Z( n+ j* ~+ ]
* but WITHOUT ANY WARRANTY; without even the implied warranty of
3 m u4 ?# B* o% O4 B8 P# b; } * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the) M$ O6 `5 S- o1 }1 n' E8 ~
* GNU General Public License for more details.3 S* ^1 D* a- M8 N. ?% _
*- h W- z4 q! U
* You should have received a copy of the GNU General Public License
7 v- d+ w6 A6 X$ n& U6 T * along with this program; if not, write to the Free Software# p: X" N% \2 e9 w+ `1 W. [
* Foundati1 j! H. t F# a$ z$ [9 }+ `2 d
*/7 k G `) _- [3 Z9 f& y+ z
#include <linux/module.h>" \& |. y5 C. V; b% s9 F
#include <linux/init.h>5 f& ?5 o: a. O9 _- Q: E
#include <linux/errno.h>
& r, k' `0 ~2 y/ o* D#include <linux/types.h>0 m# z8 s3 a) t y% |6 R/ l3 e
#include <linux/interrupt.h>3 u5 I, t5 N% p, l! \/ K! b! M
#include <linux/io.h>; k: F- L5 j- a8 t5 n
#include <linux/sysctl.h>' F e/ i! M6 @' t) j
#include <linux/mm.h>
5 m* p$ ` f4 N. z% ?#include <linux/delay.h>$ `2 B+ n# h! X: U( I
#include<linux/kernel.h>
$ P: x9 d5 E# e/ ~9 S#include<linux/fs.h>
+ L% X& |- q; [8 q0 B# n1 O#include<linux/ioctl.h>; k6 u; \- a6 ~8 B+ w
#include<linux/cdev.h>
8 Q. N7 Z0 W8 @ J5 v#include<linux/kdev_t.h>, r# m/ ^7 L. F: B w1 ]& l: [
#include<linux/gpio.h>6 P# R$ |' x/ r& d
#include <mach/hardware.h>8 ^) l" z" t) g. A: O) Q
#include <mach/irqs.h>$ m* R% I% _, Y, O6 V
9 n W p9 j+ H, M9 O C
#include <asm/mach-types.h>
1 v" [% l* V3 \0 o5 e! ^#include <asm/mach/arch.h>6 Q4 s9 q$ O0 c5 s0 {/ ]
#include <mach/da8xx.h>
6 r$ A" S; v% C! }4 w* f; ?) ]#define SYSCFG_BASE 0x01c14000
) Q4 S2 z- l0 _# v3 ~, u#define PINMUX1_OFFSET 0x124
! F- k* g- z1 [0 O4 W; b% G' p#define PINMUX18_OFFSET 0x168
' G' @- A8 L9 g6 M+ L7 V6 j#define PINMUX19_OFFSET 0x16c
# }1 v b3 d% X( I: l, o#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR- x/ B8 x; b. {7 H! q- f: ~
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
N8 V( E. o! K; d& M% K% I#define XCR_ADDR 0x01D11010 //MCBSP1_XCR& [) y; k. Q3 }) ~# m
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
A6 ]! [* t* h5 x( D; J8 h( s. p. b#define PCR_ADDR 0x01D11024 //MCBSP1_PCR6 ?0 J4 @0 \! Y% [& h* B
1 G" s+ S" P) ?+ ?. Y#define DXR_ADDR 0x01D11004 //MCBSP1_DXR( J: q9 H( T: N+ X$ W) @/ a9 H
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR- W- a0 v! e6 w* Z6 ?, r& |: b
//PSC
) @1 [) Z' V- Z& p4 q% T4 e#define PTCMD_ADDR 0x01E27120 ; `; a( L R; I" K. Z
#define MDCTL15_ADDR 0x01E27A3C* T- V4 Y2 R$ u
#define PDCTL1_ADDR 0x01E27304
- K5 h$ O+ ~- x [ Z//GPIO8 direction) c. K5 r1 Q7 b: K' r C
#define GPIO8_DIRECT 0x01E260B0
{1 p2 E1 I: ^& s% S, P#define GPIO8_OUT 0x01E260B4
9 D* O# M8 l0 e) E- I. O#define GPIO8_IN 0x01E260C0
- D" V u' m/ @2 q w* u a& Y) S+ z4 f
//#define MCBSP1_RINT 99
k6 t! q" l% [//#define MCBSP1_XINT 100 ' Q& s/ e4 D! x4 J$ ?
static int MCBSP_MAJOR=239;
/ k( y( J( T0 g3 F6 q' Qstatic int MCBSP_MINOR=0;
$ f/ N5 O3 @% a* fstatic int count =1;
& ]5 v+ {/ ?" _( v; ^4 j* R- {6 R" ?: S, s
#define MCBSP_NAME "MCBSP-device"
0 m7 }, s+ \% G$ `
8 ~. l4 s# F2 d: e3 F+ f0 Istatic struct cdev *mcbsp_cdev;
8 N( [' L2 [2 Ostatic struct class *mcbsp_class;
* T4 G8 h( G6 @' m% O+ |; j/ s. xstatic dev_t mcbsp_dev;% a5 A' A+ O/ i1 K6 d- s- j
unsigned int DRR_data;
5 N* d& P* r: Z2 c; uunsigned int DXR_data;3 e3 I, V9 g2 A4 d
static int mcbsp_open(struct inode *inode,struct file *file)' E5 q6 Q+ o, o! p& I$ [- |
{1 f3 Q# m7 }8 m: F4 u; `( r9 m
3 {; I' B# j8 `
//interrupt enable,initialized
8 A# m- ?( ]3 Q+ p: o0 i unsigned int temp;
: I+ z( m* M" j3 z. L6 V9 t2 O# ] //SLEEP_EN(GPIO8[10])---0
- y: s4 B+ b; U6 z8 i5 |+ a8 ] temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. G4 u# R* x: D. s n
temp=temp&(~0x00000400);
4 @$ }% s& a) I1 q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
" d( X, ?" K& `& J //RESETn(GPIO8[8])----0----1
, B" [" u9 s# ^+ y& | temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* r3 Q" g. k4 |( T9 @
temp=temp&(~0x00000100);
6 v4 g: k' c, O+ J& ^9 ]* L: B __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 @6 Q$ J/ n* v, A3 [" l- B udelay(100);
3 o6 }- |5 |# i- P4 \0 r4 m temp=temp| 0x00000100;
6 N+ }5 y; H) _ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
3 u; J. a+ l/ f7 q udelay(100);& y$ m! y9 z$ P/ j: r. \
printk("open success!\n");
, _ H* y+ s. p) B% R# I; r return 0;
* x: q3 I) ^! R1 T" c: m$ U4 F4 s7 s}
|+ R/ ]* N0 B4 c% H8 e8 t% G3 @
; R' H2 f4 j! T" Ostatic int mcbsp_release(struct inode *inode,struct file *file), U. d$ G! }' ^8 i
{( o( c2 Z* \- S0 w
printk("release success!\n");- t9 U* u8 T8 B
return 0;
$ b: F- Z9 i- \/ Y. c3 F) @. a}
0 C" G$ ~ U4 W
& t0 }2 `" _5 u5 N0 Sstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( b: _5 J5 ~0 w) v* K* ^, E{3 u$ T6 W2 z# N+ X6 p
copy_from_user(&DXR_data,buf,len);
% c" _' Y6 u" L- |; ]" s' x iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
" E( x/ `3 R$ a, t return 0;
+ T% i `9 [7 p5 c
* }# s K* a4 Z$ V! d}) N% s* V, D$ a( V& L4 Z/ v
7 ^5 @& V2 ?# u4 O1 ~3 q
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)4 |: q6 M9 t- z d/ S
{ 5 L- Y2 N5 j- {9 p% J
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));' ~9 q2 E( X- h2 X: k
copy_to_user(buf,&DRR_data,len);
; W/ v3 M; A; |: @. |; k/ t$ F return 0;" k }! Z& H$ Y. g
}
7 g" L7 o4 E5 b" K* `* N8 o$ Y% K( K+ C. G5 F( K2 }) H" ?
9 k8 ^1 S- P1 L) V+ Ostatic struct file_operations mcbsp_fops=
. K9 q) r1 Z0 }. k9 j" b$ T; V# W0 F: b{
; V0 U3 i. t$ _2 Q" ^$ P* R/ s) I' X .owner=THIS_MODULE,
# ]' a- g* V) u4 x .open=mcbsp_open,
' U) w7 |( {/ a6 g% c' K .release=mcbsp_release,
, o$ p9 t6 o6 Z4 l @ .write=mcbsp_write,0 H4 }% m4 y, d% T
.read=mcbsp_read,
+ ]2 Z" o' \" q5 q}; X$ k1 j+ S6 {! R
static int __init MCBSP_init(void)
! T. e+ I2 B6 T" U{) w; n/ k( R- y& R+ D1 V- d
int ret;
' x: M* Q' S/ B: z1 Y unsigned int PINMUX1_REG_old;) I, G# t4 C* h
unsigned int PINMUX18_REG_old;
' e* o2 {7 q0 K unsigned int PINMUX19_REG_old;
1 ]( h8 L+ @8 f2 ~( }/ J, C unsigned int temp; - S9 {3 b. {8 Y5 X
if(MCBSP_MAJOR)9 N+ m8 ]* s0 v9 F. @8 ]8 k
{
' Y: v* N* Z; P# k3 B mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
1 D' p+ L& f( H# ]& g: g- ?4 U# ~ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);7 Q: e0 @; u+ f+ h! b
}. B$ \7 |, | `1 u; A+ }
else0 R5 |* u0 L2 l8 u0 g& B, k* G! m
{
6 h1 A) n- ?8 G; \1 L$ \ ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
6 Y' [! M% g% n& |) G, l MCBSP_MAJOR=MAJOR(mcbsp_dev);; L8 P$ c+ J3 {3 l1 A$ C) f
}
7 [2 a6 u6 d9 l' e* Q$ k 2 r+ J4 C" \6 h* E6 @ T5 U# `
if(ret<0)1 H7 P! q: U8 B8 c5 T9 R
{! ^4 ]# ]) v1 a0 p) _+ W
printk(KERN_ERR "register chrdev fail!");; r; m, V, w/ L: M
return -1;, X, O9 e- r6 ?+ W# f8 R8 h3 F9 [
}
: [9 B: w7 O& ~+ U5 M# O + v, p: H& x6 F, y. x5 ?8 ~
mcbsp_cdev=cdev_alloc();
* x$ o" `3 A) _, ~2 ^5 x# D
* T9 W% n+ U5 r% I( f if(mcbsp_cdev!=NULL)
# W/ P+ F5 r5 F" Q {
6 O) H4 c* `: [- _9 e4 b& x9 g cdev_init(mcbsp_cdev,&mcbsp_fops);) V* s7 r! T1 s/ z4 }
mcbsp_cdev->ops=&mcbsp_fops;. p* m* x& q" a! Q& M3 J
mcbsp_cdev->owner=THIS_MODULE;
7 v( D/ l; \7 K3 A+ Q# c
* D- U( k- y. J8 J if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
' G+ c0 K* V+ [* G2 o) [# R printk(KERN_ERR "register cdev fail!");( l" U2 \8 ?& D i6 f5 f: M: V/ e
else
/ Z- h7 y0 G/ p printk(KERN_ERR "register success!\n");
, T) R& j, X4 ]* f- X) d2 f }
8 B$ v- i9 i! V. _6 v else
/ {, G( G8 y: g7 k7 K1 h {
1 g1 }2 e" @7 d/ F8 u( N9 e printk(KERN_ERR "register cdev err!");
2 h" `5 m8 Q- m0 k3 F return -1;
( o1 C! z* |1 v$ q5 } }9 D0 N: e! e X2 y/ }
5 d( e* b) V2 j2 w+ [
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);2 P7 \% H2 o* x3 G
if(IS_ERR(mcbsp_class))- D- |& k3 d8 A% R
{ u. g5 A `3 ~9 k" e
printk(KERN_ERR "register class err!");3 r$ u8 B# Q5 R4 C: e+ ^+ e
return -1;, }+ v: Q7 q( }% s n
}
7 h A4 p! x6 D5 V; D device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);! S: d6 C0 L7 L$ t
8 E% o9 i% R% y) G# A1 G //PSC
7 b4 @ ^ }% O( v //add Enable MCBSP
: Z; b0 [% |. w& a3 P7 \7 n' K! ?* K$ j //test
: m% ^( [) ^* `& a3 l temp = 0x80000003;
* u" U9 Z& d7 o: `1 }4 p7 E9 F writel(temp, IO_ADDRESS(MDCTL15_ADDR));0 M, s" d+ h7 ?# ?. u
temp = 0x00000003;& }) n- h, C; f6 V- G5 j. c
writel(temp, IO_ADDRESS(PTCMD_ADDR)); j' j( f1 h- T3 e, A, ]
5 Z3 b6 L, p \0 [; ?# U
temp = 0x001FF201;
: @' {) V* y+ f& R1 r. k8 f& ?" u writel(temp, IO_ADDRESS(PDCTL1_ADDR));
- j3 R: B7 u/ h9 w$ M. c' v1 D: D8 n
) c; u8 t3 T$ O, F4 g% {4 g //PINMUX , ]. `) S; F; R2 m$ J
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,4 E; b& d- X+ c) ]( B( y# h7 [
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
# s9 u0 E; x. l PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ' r2 f- ~; D# G3 j# S: y0 k
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);3 V8 ]/ R# E, U L# ]
7 {7 r. S! p7 `+ Z, b/ D //SLEEP_EN,EPR,L138_SHK1,L138_RC
% |! c0 r7 | k PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
8 h2 e7 q1 U5 e' @1 X4 k+ W3 V/ u6 M PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 8 i- g0 E P v+ q. P. B/ v- ~* l
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);7 `' b" U* M% \1 V8 q, d# ?# T& r
! t$ v, Z9 \ s //RESETn,L138_SHK2% Q" w: \) o) p% b% j/ N
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); : [9 Q" v9 B; x9 r$ n
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 7 \9 W" {4 F! E3 P9 t
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
/ r; l; e# B% A n# R : M( {" a6 B+ z) q% X8 ]( n, g
" {/ W" {" J$ ?' E //SPCR Register! p$ J5 w) @$ H# s
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset1 t7 b& r% S/ U& ~3 ]; r0 q& L' ^
temp = 0x03000000;//(DLB=0)
. r, d% i8 {" S ? // temp = 0x03008000;//(DLB=1); m2 V" X: ?1 F. L) b
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
+ ? i6 g; ?( h" u% b0 ~7 a temp = readl(IO_ADDRESS(SPCR_ADDR));
/ N; W( y! U& H, g2 m printk("temp=%x\n",temp);
* l$ B5 U. S9 g2 `# T5 j
3 K" e7 p/ v+ v* Y //PCR Register
1 f7 g5 a) o! ], J5 h //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
3 z' k! Z7 F1 K( c: o3 u" c // temp = 0x00000F0F;
. I, Y& c& w [! x }0 K temp = 0x00000B0F;5 ]: a @. h$ H% H
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized $ d4 l, e5 @9 Z' Q# v( E4 z+ c+ t5 M
temp = readl(IO_ADDRESS(PCR_ADDR));
8 h! A8 s6 n t% U2 v4 m9 ^ printk("temp=%x\n",temp); 2 e+ V4 ~. M% Y$ x6 u% M; }
//SRGR Register* Y7 q- k7 }( D, {. p( V0 e
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
, Y1 z& N7 [: ]. J( _! D( k //temp = 0x301F000B;
- W3 O# E( u+ q writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
8 {' G+ I. z# j temp = readl(IO_ADDRESS(SRGR_ADDR));% |' P( I1 s7 u- a7 _$ g6 V! l2 G+ p
printk("temp=%x\n",temp);/ E6 {- H4 ^8 i: E& g
//RCR
3 m+ l5 X) [* n t //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,! A8 C: s* M' Z
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 S$ e/ X9 j' H temp = 0x00440040;
3 _2 C& d& z5 V, e writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
% l1 X* K! `' ~# M |- S) @ temp = readl(IO_ADDRESS(RCR_ADDR));
% P, O( Q" U( O) w0 s printk("temp=%x\n",temp);
# t1 B2 x+ Q1 Y( o" r //XCR( y$ g% }! h+ p2 ~1 H5 V! _
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1$ S$ }7 A @1 x) ]: a2 O
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0: l! m( j8 e9 W2 g; J
temp = 0x00440040;5 z- V% E* B" w& Y. a9 T' x' T0 L
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized ; D$ `$ D; m q4 |# Q! x: p
temp = readl(IO_ADDRESS(XCR_ADDR));
: H' y1 c" R0 u5 g) Y printk("temp=%x\n",temp);( E7 `/ z, N/ t. e
udelay(100);& ]) N9 r) U. K- T9 v
//SPCR Register0 p7 N# ^$ I7 K/ k3 W, o
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
* j. C& E w6 k temp = 0x03C10001; //DLB = 0 VS DLB = 16 x; i6 U( Y3 Z) R) q0 n+ @
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled) w# l# J* g, N: M
temp = readl(IO_ADDRESS(SPCR_ADDR));
" ~! b! `4 T5 q+ Z; c v/ h' v printk("temp=%x\n",temp);& f! I3 W7 A2 b0 j9 }3 n
udelay(100);
4 T$ X; q% o& I- t# G1 B/ R g3 A+ k9 ]3 P8 j7 S' _ i
//set GPIO direction$ }* F0 Z6 e, D2 s& J, M- [
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
; {5 D5 V0 E4 O0 Z: f4 a temp = temp | 0x00000100;//EPR----input7 o I7 } T8 n9 E7 u, O, E
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output$ o' u: Q' V) _8 x* P$ y
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); : d Y V% s4 t: k
/ q6 h- O; z) K: L
return 0;. o2 }% B: G) k
}
+ N4 {+ I4 W5 f7 A( Z7 R2 Bstatic void __exit MCBSP_exit(void)
1 w N5 p) V7 f8 w% g{
2 ~7 Y4 F: s+ a7 N2 i6 D5 W printk("mcbsp chrdev exit!\n");
0 z+ }7 \2 J$ G0 D, V cdev_del(mcbsp_cdev);" v8 Y$ F. a2 n: i6 B! r
unregister_chrdev_region(mcbsp_dev,count);
6 m5 V- q; m* H K! V/ o device_destroy(mcbsp_class,mcbsp_dev);
6 u9 c' H! ^- q( M+ n class_destroy(mcbsp_class);2 I; ]- I) H' }. v2 b) I# A
}
$ c0 d+ `9 b! a3 ^, ^0 _module_init(MCBSP_init);6 e6 c+ V* {0 \' D. q6 \& D
module_exit(MCBSP_exit);
; Y+ W' w/ r9 I3 z* d! ^0 v2 a: J5 @
MODULE_LICENSE("GPL");+ u$ E9 a' \8 L; g7 |3 s: ]
4 S8 B+ W4 ]3 o! b! t& X我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
9 u- H+ t: k8 \我的应用层的测试程序如下7 l6 u$ \1 e: S
#include <stdio.h>
0 R1 B- B; s" b3 l Y6 J#include <string.h>
7 j5 \8 `# K7 F N1 Q#include <fcntl.h>
; j% f) O9 X0 @0 @#include <unistd.h>
/ C7 \8 w& i& v0 P) m# o# z Z#include <signal.h>- Z- l8 E5 F) A. W6 g: a
#include <pthread.h> //线程
& a1 J' O5 }* l7 m* O, _#include <stdlib.h>- d; |; ?6 K) r( E$ I
#include <pcap.h> //捕获网口数据
( ^6 y7 {) A3 ?9 N2 `5 s& D, A. s9 G#include <semaphore.h> //信号' V6 N' v7 \* D1 A" w7 c* s
#include <sys/types.h> //消息对列
9 Y3 Y! W* N8 y% b0 n# w#include <sys/ipc.h> //消息队列
% y- K& N% h! D K8 t7 m#include <sys/msg.h> //消息队列
5 E, r& w( y% t7 Q#include <sys/select.h>
- d5 v2 `& y }#include <sys/syscall.h>+ ?5 t) ]0 t& H9 J, ~
#include <sys/stat.h>
- q/ P6 {: D# K" D1 X#include <sys/mman.h>6 Q& f( U8 N0 I1 ]' N# z0 S2 g I7 P0 b
#define msleep(x) usleep(1000*x)
; Z/ n% b% `; u% ]' b1 S; J: c4 X& i$ F) z" F: m" ?) n) b
int main()
( \; f+ G8 @" R! M2 o, M{
. I1 o. U u, n. @4 B3 J0 V! n //MCBSP,ARM与AMBE2000交互设备( u A, D4 I% F+ z3 d0 [4 t1 _
int fd;
% Y- K/ g. y9 o. @2 W( l# V unsigned short data_write = 0x5555;
5 T; @$ R' D9 \0 W unsigned short data_read = 0x00;. ^. [* B0 j$ t# W% o/ t2 \7 J8 c
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);: o k6 q" R! ^, _1 L& C
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);6 [+ h4 b0 c! I2 s
3 [* M, k; G* B* m# m5 [' t if(fd < 0)* R. T' o& D6 M2 _& U
{+ t$ n+ z4 Q! r x/ W' D) {# D
perror("open failed\n");
( Z6 C+ b q% J6 }: K return -1;: f0 G9 m; B: \$ x6 G
}
^' J4 n `0 O9 Q" ? % e9 Y2 _7 z9 T5 c( ^1 v. ~
while(1)
6 C; A2 q/ t. e. ?" U9 l' H' J2 d3 o {
+ V6 t( o. a" A7 D0 x2 ^ 2 V& y2 V& A8 @
//AMBE2000每次读写是24个字为一帧 c. _ @% p7 X* x
//写数据时将数据在底层存储起来,等到中断的时候再发送" i1 @5 b9 f8 s, D# l, V! R
//AMBE2000输入数据是以0x13EC开头的
1 n, |" \) j( q1 ]1 b4 g) z6 U, g8 k write(fd,&data_write,sizeof(unsigned short));
3 w/ x, k( Y, @$ a. p ! Q8 f1 z- m2 Q3 _5 p7 x. f
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
- P& I* Q ^1 f* _. f2 l3 J) j read(fd,&data_read,sizeof(unsigned short));
$ H! K. m$ a2 G, k( b3 i 4 m" Q- K) I* n5 f- [9 T$ a: y
if(data_read == 0x13Ec)& ?* i$ a" l8 ] V; v7 ?& Y
{
' d9 o# V1 ]* S ?) R
6 ^4 D2 o2 R+ z1 s C$ }! e printf("data_read = %x\n",data_read);
$ x- A# N! d. ]7 q* k }
) Z" j( p1 a0 I( M: ~ - ^2 w* K4 U/ _) J! o( p
msleep(10);
( o$ a7 B! Y) E. x2 x; _
) L, _# L& O: d5 f+ r+ i# X4 g# R /*1 R# Y* ?+ K4 n! U/ \& e
ioctl(fd,1);
2 y! P6 i; p- o) q6 \ sleep(1);4 T- q, o5 [' X* g
ioctl(fd,0);
3 m- t; e" a5 E7 y sleep(1);. Q1 ^ P ^7 E, N0 r$ n" l
*/ 2 t3 b# ?, T3 f- U1 M
}
% v2 [0 y' T6 |, ^8 [* Y/ \ return 0;$ u! D: ?& `0 @$ N# f
5 O" x" j @, z% Y1 F$ Z, m
}) z/ L" a) {4 ^! v0 L
/ ~: L# ?/ ^( }" v* W" R% S
多谢各位指教,谢谢! 急6 ^$ G. N' o; M/ K" @ W
$ s$ p v) W7 C5 B) S5 x
/ m% h/ V, c% V! b! N; e# S6 }6 Y& A/ w9 r: O
8 E, w5 }) ]% p' `0 ], m. Y7 M) u7 \$ [7 n: e
|
|