|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
* R$ w) l9 `6 K b x. `/*
# M. l+ G( p2 U. V0 F+ J * Copyright (C) 2009 Texas Instruments Inc
7 l, b( @. S1 [7 k *
& V8 S* J3 q3 `! T& I9 B* r; x/ g * This program is free software; you can redistribute it and/or modify6 j) {' Y' z9 T' f
* it under the terms of the GNU General Public License as published by
# O4 M1 f3 Y7 Z7 q" T U * the Free Software Foundation; either version 2 of the License, or" @. ^) M" N9 {) r8 R, k
* (at your option)any later version.( X* ?: }6 M* t8 G
*
% L3 M s7 }, G4 F$ c1 a: g; d * This program is distributed in the hope that it will be useful,0 V6 l& D6 K. P& [; M* H
* but WITHOUT ANY WARRANTY; without even the implied warranty of
6 f4 w) _: }6 [0 q/ y. Y F * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% L0 [8 z. w {0 O * GNU General Public License for more details.
5 {2 J9 X" V" X" k$ x *& q5 U3 \; J y9 @& o
* You should have received a copy of the GNU General Public License
/ q% H9 T6 x" m f$ b * along with this program; if not, write to the Free Software
2 y# G/ U6 L; w( @4 c* U * Foundati
1 D. y% X0 g+ |% g8 U*/
2 ]* K# Q$ H/ u. L#include <linux/module.h>
% v1 Z9 H2 T8 n1 N; Q) ^#include <linux/init.h>& J" w C" H. v! r3 o
#include <linux/errno.h>
; k( |/ _$ j$ O2 Y#include <linux/types.h>
" h; j4 V1 d# t+ K' N0 q#include <linux/interrupt.h>" l$ G: \8 k4 h" j
#include <linux/io.h>
! x4 U; z+ e1 v#include <linux/sysctl.h>! O {; E& p5 f1 K; f
#include <linux/mm.h>0 e; {# F. T' L, C+ P8 [
#include <linux/delay.h>
0 z i) X# l2 x#include<linux/kernel.h>
4 ]$ J6 i; w6 F#include<linux/fs.h>' Z0 P/ m& m9 c) ]2 B2 W/ @
#include<linux/ioctl.h>$ ]8 @) L, y1 j b s' n
#include<linux/cdev.h>) ]' \9 I5 ]9 V' @* U3 e
#include<linux/kdev_t.h>$ x4 s! l9 y0 q/ c6 F
#include<linux/gpio.h>7 A ^2 C. s: x) b. n" |" O. `
#include <mach/hardware.h>
5 y, C8 m( V9 x M1 Q; t#include <mach/irqs.h>
! h% S1 C& K! j5 q* T9 j- w7 T* z7 P5 Z* d
#include <asm/mach-types.h>
R+ Z d& o8 P5 ]/ i. z9 l#include <asm/mach/arch.h>
5 H1 a+ R' \. c1 G7 W' X/ V#include <mach/da8xx.h>
+ j8 @% e. d; }: i' v" D" _#define SYSCFG_BASE 0x01c14000& o' T# U) |, H) _3 C4 ~
#define PINMUX1_OFFSET 0x124 ( f/ `: l# f1 S7 v$ V+ Z
#define PINMUX18_OFFSET 0x168
5 t6 X* {7 a8 F: B: R- Z#define PINMUX19_OFFSET 0x16c
4 {; M% U* p# D8 x) z) X#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR7 i' S( G% w2 a9 a" ?: i
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
5 g k2 s% ]5 k( q- ^#define XCR_ADDR 0x01D11010 //MCBSP1_XCR8 y' X0 J+ {+ [' Q
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
! u, H, ]3 E9 D8 g3 q( \#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
- h" b& R. W( \; f4 c$ z5 r; r # V6 Y5 ~0 O5 z) X* ^9 |
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR+ h( a9 z3 z: B5 t1 j
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR# C/ T( q) J7 L, J+ K
//PSC
' X* Z1 X1 i1 K" E2 f2 n% u#define PTCMD_ADDR 0x01E27120
6 f. x8 y4 S! z& D5 F#define MDCTL15_ADDR 0x01E27A3C8 n& p4 V8 d6 y
#define PDCTL1_ADDR 0x01E27304/ O2 B; m; u) }. D0 g) b8 J: s
//GPIO8 direction
, h g8 K* a- k8 q#define GPIO8_DIRECT 0x01E260B06 i$ k2 _6 ^8 @+ ^& O8 N1 t
#define GPIO8_OUT 0x01E260B4" g( k+ w. Y- q
#define GPIO8_IN 0x01E260C0
. y8 l6 e# S U- \; G0 I t) {. f0 U+ ]4 ~5 [
//#define MCBSP1_RINT 99 ) s! Y' {. F3 j" I
//#define MCBSP1_XINT 100
# n9 W3 p5 d' _static int MCBSP_MAJOR=239;
8 H N. L0 h& N1 V: T. K) Cstatic int MCBSP_MINOR=0;
7 d5 y0 O. J# |7 \- o9 Y5 O# Dstatic int count =1;
3 c: z) m' \- P8 V9 n+ D1 L
' v- f+ h e2 ?! w, K#define MCBSP_NAME "MCBSP-device"
$ [ E. Z: _3 L! i$ ~
# M" w5 q" f$ F- p, ustatic struct cdev *mcbsp_cdev;
6 M6 @9 l. _0 Estatic struct class *mcbsp_class;
! s; t, ~" f) M: Bstatic dev_t mcbsp_dev;% [6 Z E; ~ W( l% ^ K
unsigned int DRR_data;
/ H# n! c& i Bunsigned int DXR_data;3 q. D; ]! J; n; `: n+ x. {
static int mcbsp_open(struct inode *inode,struct file *file)2 u5 J( y- m" W) z+ A: A0 z. F' X
{
: N- S9 f4 ?/ K9 J+ W
% i( c: S, {; q1 v6 T% s0 i //interrupt enable,initialized
( w O$ [9 p4 T7 c7 h unsigned int temp;
$ e$ S1 K1 W" _+ l //SLEEP_EN(GPIO8[10])---0( t& ~' K1 F3 y
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));- g6 i. \. H- s0 ^
temp=temp&(~0x00000400);
. \1 l5 ?/ _1 Q N- O8 e __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
Y) s- t% M6 n2 u, m9 f //RESETn(GPIO8[8])----0----1
: H4 z+ D. p6 W$ ^0 f temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' O3 E! g [/ j8 U' A temp=temp&(~0x00000100);. {, \3 c- U3 y+ O$ |
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
. O# d4 _$ l4 }) P udelay(100);8 z3 I/ N4 s5 N1 }! x5 c, [: [
temp=temp| 0x00000100;
5 e4 N8 J- H: Z3 |5 F __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---17 K9 F" N3 w1 S
udelay(100);- K, n' f4 [" I% ]# u% z
printk("open success!\n");3 B) l- v8 [; x
return 0;0 D1 s( h* b k* b! }1 Z7 ?
}/ \; A6 p6 {3 x" J; O) u( _
5 C' N) e' l7 o
static int mcbsp_release(struct inode *inode,struct file *file)
9 Z- s# [- X2 F4 H/ [{& O; |6 R$ G5 O8 l `; G& P
printk("release success!\n");
" Q! l C; D6 O9 T: {6 G0 \# n return 0;
- e: ]" D2 T, g r}) L& \+ }4 f, i5 S# Q
6 a' q. H1 ?- ^/ i
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
- e8 c6 a" p6 M" |, F. w* e{
0 ~: L2 g; G. ~, N% R" o copy_from_user(&DXR_data,buf,len);
# o' U ]# O; l$ F: U! Y iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
" R2 g7 r3 D% b& {# T return 0;
8 h* W8 \( r+ F2 W! w& Y
) y, [/ w' T( l5 y; Y4 e$ g; |}3 F5 O. @" y1 |. q- U# n6 P. g: @
2 R$ k% S: G& \static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
( g0 J& s1 `1 ~- D* A0 a( j" r) x1 `{
, }4 p1 s$ F1 o. n% p DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, Z$ a! b$ E5 Q" e, G% N copy_to_user(buf,&DRR_data,len); 7 z# g- a6 Z" Q3 h
return 0;
$ D9 x' x, f( h) s7 _}2 W) w5 `" P' J8 D5 B+ I
; o' J+ g! X. T' ^+ O
! a/ o8 Q9 w. v+ `( _0 ^+ H3 n- K
static struct file_operations mcbsp_fops=) x. A: m. q4 g; w+ N+ C7 I
{& n4 t3 f B" H: C
.owner=THIS_MODULE,
6 F% |, e* q8 B0 b0 R( d .open=mcbsp_open,
( N8 l! X7 M. o2 V( r5 ?) p6 j6 r .release=mcbsp_release,
9 N0 p* U* w2 V; h! r, q .write=mcbsp_write,% H* [4 u7 h' f
.read=mcbsp_read,
- I' x8 Y' u2 q j6 J4 _: L. R- t};
6 N( p) n$ N4 z6 q9 istatic int __init MCBSP_init(void)1 S! r& ] X, w# R
{$ o/ O: h2 ?( l% R- M6 O
int ret;' Q0 u. C3 t, ]$ q# L; z v- K
unsigned int PINMUX1_REG_old;+ t1 \% D/ s( F$ ]3 d
unsigned int PINMUX18_REG_old;
' T a# m0 n3 p: @; h9 v/ G unsigned int PINMUX19_REG_old;; {8 h- o$ p+ k9 `
unsigned int temp; ! w5 L* f0 w1 a& s8 d
if(MCBSP_MAJOR); r! H0 M, G1 n4 w2 h6 ^& f, e7 V
{
* m, f4 N0 J) U2 r, R mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);( K# K7 o$ s( ] a# A
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
; \ E% _" N/ i3 Q$ b" I }+ M! y+ }1 t! g1 C2 m; S; j/ g
else! z4 _( R3 d8 O$ F! B0 Y$ `
{
, b7 @' q5 f5 Q3 h6 y ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);- w s. A; K" _; B1 C
MCBSP_MAJOR=MAJOR(mcbsp_dev);) ~; N; S8 U! E. }* g* s
}, g; Y% I) I4 b' E4 M: l
. B% j$ B+ s4 a4 L X! I if(ret<0)
2 l4 X; p7 v2 L( g: Z8 K4 f {
* ]0 ]; b: W! ~$ T7 ~: r printk(KERN_ERR "register chrdev fail!");# Y; c [* P4 V, F
return -1;6 S) z T) b5 u B" o8 D
}
7 A" f5 R% x. I4 [* y+ ] - b3 T: P( y1 }0 }8 u
mcbsp_cdev=cdev_alloc();) {' o) v( V: {, _
. {+ R. F3 F' |0 n* }
if(mcbsp_cdev!=NULL)2 G) A. r: m2 v( F) p1 f
{
: ~1 T, F. `" z9 k6 K( V* o# x cdev_init(mcbsp_cdev,&mcbsp_fops);
& V: ]- X- L; J& d& e& B" g mcbsp_cdev->ops=&mcbsp_fops;( t( v% _# m# Z( y: Y/ ?+ ^) n
mcbsp_cdev->owner=THIS_MODULE;+ I8 x! o; f1 K
9 c/ ^6 t+ \( M, g/ l+ R if(cdev_add(mcbsp_cdev,mcbsp_dev,count)): Z) m S2 C7 H' p* P
printk(KERN_ERR "register cdev fail!");
( N5 F, u3 ?" T/ r# R7 O! U1 e else9 I2 B5 V% [4 M
printk(KERN_ERR "register success!\n");
7 x; A/ @+ p. n( P }" x" H( I) J, e; G2 p, ?3 i
else
8 t: N' s' N+ Q H% T- r' {; D {
) v; M# Z# P$ e/ Q& k# _ printk(KERN_ERR "register cdev err!");" ^- H( R6 O2 b5 Y# ~; l2 S% y
return -1;2 Y9 P5 [0 g$ H, e# M2 X- B& I- v
}( r# [4 k- T1 n7 k; [ w: g" k
4 }2 h! U* b2 |" n! Z* [5 `
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
; [+ W# B6 i3 b* l4 M if(IS_ERR(mcbsp_class))
" q& H& H p+ l {
9 k6 |; }+ z% I d7 b! P printk(KERN_ERR "register class err!");
% g w: j- g, Z _9 f: l, x- Y return -1;( K& D" j+ ^) ^6 `
}
7 i' a5 D. w+ t/ I! |, q) y device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
- `2 k- w1 w- z: n6 _, D# G9 i0 W
/ N5 B0 p: M* ^! [- n //PSC
$ Y2 ^+ ]& q& m( }3 n$ Z* y //add Enable MCBSP1 w2 }6 @' g& k# u
//test, Z: y: o' x, h( {; O
temp = 0x80000003;
8 f3 b% a. R/ c& o writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 t M2 Q. e# P6 V5 n( |+ @ temp = 0x00000003;
& @' A8 n% I( l: A5 J5 _: K writel(temp, IO_ADDRESS(PTCMD_ADDR));, f8 M: W y' X2 x4 r1 d. H
) s! f; d" e: Q [# n/ C6 }
temp = 0x001FF201;( I8 x# n7 O: z; Z* A
writel(temp, IO_ADDRESS(PDCTL1_ADDR));5 d+ X! H7 @* P7 n7 {
8 D0 s: b E7 q6 R; |1 n& ? N; v
//PINMUX
2 R$ `* h- ]8 x( y0 a! ? //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
) h" R/ f% }" | PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 2 |5 Q7 R7 Z: N6 w) q' c V
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 7 j: p6 T- [- \$ q
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 C+ c# x6 S0 W/ E9 V( y* w8 v
( O6 C) g9 F1 ?$ h# ^ //SLEEP_EN,EPR,L138_SHK1,L138_RC
( y& f+ O- A2 L7 | PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 1 v: ~% f! n3 h" P# {
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; % @# T, C4 A7 I: R
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
! G2 o. p+ E. @" C! |- b P
7 r7 h ~ X( O, s! t: z' E //RESETn,L138_SHK28 Q& _" {4 }6 N4 `
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
* H) v3 J' o; P4 H! t PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
1 R/ {- `6 ^5 X* `$ T: S writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" z5 b5 D, c3 q: b7 K. l% v: \
3 F* q, ]$ c2 B \ q9 |; k % C" M& y; `7 m
//SPCR Register# c5 m! N8 l; D1 Y2 o/ Y" E- v( L
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
! P9 b4 C8 j( b* n4 L temp = 0x03000000;//(DLB=0)2 a( n2 a4 u# @. ` s# O/ F
// temp = 0x03008000;//(DLB=1)
0 p+ W, M/ N- b$ ^0 E1 ` L7 s writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
! j6 A& f+ Z+ [, w( v( x temp = readl(IO_ADDRESS(SPCR_ADDR));7 o1 F: M/ v, Z0 b* r! H+ s
printk("temp=%x\n",temp);
$ i H# Y7 z' J1 F0 Q& D
P) ` K) q( n# @ //PCR Register; ~$ U3 x$ q! `! ?& T5 T
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0/ V. U- M! Z/ I& N7 s9 y8 K" a
// temp = 0x00000F0F;/ F8 E+ E2 I3 Y
temp = 0x00000B0F;
8 ~* L% O! F) @1 s9 c# n. ^. D writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 9 }7 L5 K$ y9 R9 l" D4 E( u
temp = readl(IO_ADDRESS(PCR_ADDR));
; ?( T+ m; G5 N' c& }( m5 P printk("temp=%x\n",temp);
" n0 e+ y% p' Q+ }4 k5 \ //SRGR Register
; }: }! x, }: R" p //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11- e: w" w6 l% g% c2 v& b
//temp = 0x301F000B; h; d' r- U- T" s- m! V
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
7 c E8 g' T6 `2 N/ t+ z temp = readl(IO_ADDRESS(SRGR_ADDR));0 ]8 {$ ?4 A j& R$ d. o+ p
printk("temp=%x\n",temp);
% I7 e- ?7 m! m' H5 k //RCR
2 l' }7 l5 `/ u! i) u* [+ N p //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
' m+ V* B: a1 W5 V! d) M( v //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0. ]4 y& C& S. X1 n/ E
temp = 0x00440040;6 P/ i2 i* v1 _6 B
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized / _4 g7 {4 N5 E$ ~
temp = readl(IO_ADDRESS(RCR_ADDR));) O) ^6 g2 j' S! X; H3 ]
printk("temp=%x\n",temp); @4 h5 v% ^8 [' K% H/ E2 e! j
//XCR7 S+ _/ K9 j& K' c6 i* {; @, o
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
/ b# _' m" G0 P% v* G( P //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0% z1 K$ G5 Y# |* \/ D8 W1 I8 H
temp = 0x00440040;
/ w* ^7 }) t! S writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
- o; c' y u/ W) ?; C$ {$ e: a5 y& V- v# I temp = readl(IO_ADDRESS(XCR_ADDR));2 f h9 e/ x9 c1 J2 s' X: K
printk("temp=%x\n",temp);4 y2 n' y' O" ^: w/ G9 q
udelay(100);; V- k: S. M Y+ q
//SPCR Register
, B" z1 r0 J; Z$ U" M# W. S! Z' F1 Y //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( T' `8 Z% v; p0 O u9 N6 u temp = 0x03C10001; //DLB = 0 VS DLB = 1
6 s" E, K: r! Q" A N writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
X5 s; }# C8 d3 f temp = readl(IO_ADDRESS(SPCR_ADDR));
9 M, k* f6 d% R8 K1 w printk("temp=%x\n",temp);
$ f" D a2 j# [* | udelay(100);1 t8 c) ?9 U$ A/ c
. W, ?% [% d9 D7 l6 L7 g- ` //set GPIO direction; A7 \* d2 e2 p5 ?# V
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
+ N7 [0 i7 J8 @5 H+ P& ` temp = temp | 0x00000100;//EPR----input1 {6 M4 V. n9 \' h+ o' K
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
5 [0 U5 M/ R7 D. I! o4 u __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
9 t* |: E) _* c" z% _% @
8 R8 z: Z2 W8 i, H" z, X$ y p! S return 0;
! |% D, B8 C" W# \8 ~- A" B}$ C6 o4 }& m: A, E
static void __exit MCBSP_exit(void); A. G$ U1 o. m
{( S6 p9 Z8 I5 q$ r# C& h9 o) y) H) i
printk("mcbsp chrdev exit!\n"); I: b7 J2 `" V3 h" B* ^( v
cdev_del(mcbsp_cdev);( X8 X) F2 O& u \) |' `
unregister_chrdev_region(mcbsp_dev,count);0 Z1 u% o" r$ g- I1 d- H% d; s
device_destroy(mcbsp_class,mcbsp_dev);
, T: z3 |2 {1 u0 }6 Y class_destroy(mcbsp_class);
y( v/ l0 s* z: V1 ~}
# u+ ]3 [8 ^7 x- N3 l8 H7 Dmodule_init(MCBSP_init);% U& i# k G0 E5 E* B1 f+ X
module_exit(MCBSP_exit);$ y- ^8 h* k7 s- C6 H
; x/ R5 ?& }5 T" S* Z7 F" `
MODULE_LICENSE("GPL");9 F& T6 @. z a- K
Y% }. o0 v( k8 s( _
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
# N4 T9 r3 I! Y0 m我的应用层的测试程序如下
* |! P6 O) P7 G' V: k9 u# p. C7 N#include <stdio.h>! C6 o: g/ p) o6 ^, m5 o! _& j
#include <string.h>4 j# _& x) `" [. ~' R
#include <fcntl.h>
5 c( G7 B' |- S0 ~% _#include <unistd.h>
" ~3 F$ p) G$ B& `9 b#include <signal.h>: o N7 p* I6 E1 }% O
#include <pthread.h> //线程, K& V4 D* e' |7 f5 {8 q# E1 Q3 g
#include <stdlib.h>: T4 H! R& X& d& q* Q# I& A' @2 ]
#include <pcap.h> //捕获网口数据
0 v/ |1 V/ Q) H* O#include <semaphore.h> //信号$ s# V I0 T- U$ ?
#include <sys/types.h> //消息对列
" E% w$ F( t0 v3 T& C& e( I% u#include <sys/ipc.h> //消息队列' u5 j! L; M4 }( H. z% x' v+ g- g4 ?
#include <sys/msg.h> //消息队列1 U* L- C z5 i) [3 o+ V' i
#include <sys/select.h>
: K5 _) P5 Y9 O- @( P- k#include <sys/syscall.h>
/ _6 a. c, M1 }! S; w#include <sys/stat.h>
A t( d3 z4 e2 ~0 H5 B) r#include <sys/mman.h>. z# h o# T) {3 U
#define msleep(x) usleep(1000*x)
' L' I Z6 J0 Y6 k( N
; R3 y0 a" Y6 f5 lint main()
3 O+ J; ]5 |; I+ r{
# d! }; e7 R6 q% O j3 u //MCBSP,ARM与AMBE2000交互设备
5 _! L: b$ |! Z" o9 L# h int fd;
* }$ X. J3 u/ c% U) \+ l unsigned short data_write = 0x5555;
: e. S3 A7 u1 X' p" V6 m1 `# n unsigned short data_read = 0x00;
% T$ S0 f8 l& h' a: j$ c+ s fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
8 \' d$ K0 n+ I. d# R7 e5 c E* U$ A // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);( v' M1 _2 W, F6 R5 J
( _- W1 [. x+ Z2 S" ]+ c: p* _
if(fd < 0)! J4 x" s+ {! O4 m
{
1 u% V8 k) D5 O9 s$ g perror("open failed\n");
! S$ j$ {3 k% F: W% x* a/ P return -1;2 I* G: P \3 X
}+ G0 A9 n }1 V* _
, l! t- s2 B2 t/ ^2 \ while(1)
/ k K% u& f; D0 ]2 @4 q {2 J9 F; m. h, o5 t( ?
! T* E! q/ A6 k2 U% P. a$ b1 { k
//AMBE2000每次读写是24个字为一帧' {$ H3 x7 ~* _+ f
//写数据时将数据在底层存储起来,等到中断的时候再发送8 t0 e/ L% t0 w; ^$ A) d) W2 }
//AMBE2000输入数据是以0x13EC开头的2 ^5 v/ Q' F7 E- Y
write(fd,&data_write,sizeof(unsigned short));
3 K2 O& v/ _: ?7 {# D; Y: x& N" r
( ]4 Q' T7 S* |5 R //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
5 U& o9 Z; H5 N* X2 O read(fd,&data_read,sizeof(unsigned short));
& K8 J0 G0 }" @$ V& \$ z* d2 t - X1 P' d# P5 ?* t3 V2 E* b& ]3 g
if(data_read == 0x13Ec)- C0 u' H! U7 ?, Q- Y9 e
{
. o# W: h+ d7 x$ R# z- H. o " V" Q. A1 e, W1 Q
printf("data_read = %x\n",data_read);
$ `9 ~9 G& E( {& w8 O# `, I% z }
+ \/ {+ a$ }* O+ g Y
, D% I! |& m5 ]: }) r msleep(10);5 P3 x- F! E. r
% y% {# {9 o: A; y5 a v, H2 H6 i /*
# N" z9 X2 e* q! f ioctl(fd,1);
4 c% L m6 J3 y! ?. ~ sleep(1);
- s2 U4 B6 }! ~- o! X8 Q! ] ioctl(fd,0);
% Q9 n0 v$ O, {$ e4 j sleep(1);
& B, x. w% H7 }4 i( Y) Q' `7 w* y1 G */
+ e1 r! _. z; d u2 n3 w6 | } % N% r0 x' C* w
return 0;
& d2 u+ t: t" W4 I" n9 y& G8 i 0 J+ k# A4 D. B
}7 T. ~0 d& p/ D8 {
$ V& p! ]+ p; `! Y
多谢各位指教,谢谢! 急; q: x. J1 b! {
/ M" t m2 Y6 R3 [3 U2 |
1 X) L; |$ N9 i: s0 Q7 _' Q; C2 _' _( p) @* r$ y& }+ s
5 A" \5 S/ ^% v- t' s6 Q: j9 S9 P
+ \# v9 w% l5 X. h: Y3 X& V |
|