|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: + R& w. y) Y# k2 ]( N1 M3 S
/*
" p, s; u" ~9 a9 U) M9 `8 L9 ~ * Copyright (C) 2009 Texas Instruments Inc0 P$ J5 y* g: Z- K$ U# i7 t" X, W6 S* C
*4 |) n% q! ^, h+ T0 o/ e! k
* This program is free software; you can redistribute it and/or modify
2 `+ w5 J d Z: w * it under the terms of the GNU General Public License as published by
% l5 ?, A( |3 u6 f3 l C i. D9 @ * the Free Software Foundation; either version 2 of the License, or
2 L& r; | p% V) K" {, u6 T8 Z * (at your option)any later version.( K! M P4 ]% F1 R1 t `6 A4 l
*) r. I, ~2 _4 q7 D) M
* This program is distributed in the hope that it will be useful,: c: P# R8 f9 s- w8 q6 }+ e
* but WITHOUT ANY WARRANTY; without even the implied warranty of1 c, p ]1 T2 r0 V
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the: L8 j2 j, O/ S, s% R' X i( F8 i
* GNU General Public License for more details.
8 f* L; Q% q2 n *" L' b a+ K- Y' D Y/ D" O
* You should have received a copy of the GNU General Public License
, g" M0 g. g. ^- i& ~9 E, A * along with this program; if not, write to the Free Software7 U) S! r0 q2 `/ y Q
* Foundati
7 f9 @7 D ?6 q*/ b; y- C0 ^* h' e" V
#include <linux/module.h>
: l+ D+ f9 _# Q0 O* X. h2 L* d9 {#include <linux/init.h>' G2 o: k/ N: ~" _3 N2 i
#include <linux/errno.h># s9 `* U4 P6 i" T0 \5 A8 a
#include <linux/types.h>" w ^' _# B+ ?: G# J, u
#include <linux/interrupt.h>
7 A0 d6 t- Z; R) f8 x#include <linux/io.h>
- K6 B& U0 v5 w#include <linux/sysctl.h>! Z+ p- {! T; y; }5 s2 |
#include <linux/mm.h>) M! ~7 k* }& c1 n/ r
#include <linux/delay.h>
: @2 k# D0 f* L8 P `' o. u9 w# P#include<linux/kernel.h>* a, Y' m- C3 x/ M/ v
#include<linux/fs.h>
; o4 M0 n. _& b5 N1 U& P+ S7 }#include<linux/ioctl.h>4 T0 j( ~( S9 ~0 M) O
#include<linux/cdev.h>( I1 d8 U/ ^! ~1 }, [' y
#include<linux/kdev_t.h>
& v! p3 A6 e5 a' L- e9 J#include<linux/gpio.h>+ d2 \9 | C# Y. o+ i* U
#include <mach/hardware.h>+ X' f) k( f3 W6 U: A& {
#include <mach/irqs.h>
5 V1 G0 v- P# a" r! m" e4 A) Q3 Y8 }3 f2 e
#include <asm/mach-types.h>
; N! l* {2 K9 q4 X#include <asm/mach/arch.h>
, S+ i) t) F' i2 n, D$ q$ B#include <mach/da8xx.h>
X3 ^* F `8 Z6 J* `& }#define SYSCFG_BASE 0x01c140001 A8 i4 ~9 A. a+ X' v. B
#define PINMUX1_OFFSET 0x124
: k* }9 p$ b2 C$ x+ ]4 p#define PINMUX18_OFFSET 0x168
! w( U" y( k5 ]; w9 j2 U3 ^" s#define PINMUX19_OFFSET 0x16c
+ A& F5 y% e# s1 `#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
% ^5 F! \* t( L+ q% Z#define RCR_ADDR 0x01D1100C //MCBSP1_RCR# \ }/ e C+ \' @0 F
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR& V5 B8 b# U* ~
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR2 l5 p* s* O! v, C- a
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR7 T$ {% a/ k8 ?, ?9 E. ~
1 F& c. C% X5 `' j' j7 k( I& |#define DXR_ADDR 0x01D11004 //MCBSP1_DXR, M; }9 |% y: O
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
' C, o6 P3 _, E2 p8 {5 A, U$ r//PSC' D$ v( W& ?. O9 ]
#define PTCMD_ADDR 0x01E27120
& Z, ]7 G% a5 U: V# R2 S! ~: I" l#define MDCTL15_ADDR 0x01E27A3C
' l. T4 r4 w1 I8 c3 v* N#define PDCTL1_ADDR 0x01E27304, t* Q. j9 ^5 U8 D1 t+ e( ^
//GPIO8 direction8 N) t0 F/ I2 c3 @
#define GPIO8_DIRECT 0x01E260B0
) @" i: V/ T E: h. w. Y#define GPIO8_OUT 0x01E260B4' S- i, l/ e+ L6 v) Q, Z
#define GPIO8_IN 0x01E260C04 e0 O" ~' @" Y1 B& J, @
6 @+ o3 o s+ t7 G* j
//#define MCBSP1_RINT 99
. g" d6 X% ?6 q' X l8 C//#define MCBSP1_XINT 100 % b! N* h' v6 S4 _) p$ O
static int MCBSP_MAJOR=239;
2 v! @9 H% V7 estatic int MCBSP_MINOR=0; F8 N% V7 {& S
static int count =1;
2 R" P$ ^( C% i7 C1 h+ R; J. M
) a7 G7 C6 m8 H0 U' C% A, i#define MCBSP_NAME "MCBSP-device"2 ~! Q- D! w' D" d8 G
9 T/ C, Y% B! R1 X! a
static struct cdev *mcbsp_cdev;1 y/ u- F7 u( V; e2 _2 Z
static struct class *mcbsp_class;
' @0 c" x. ?8 n" {2 e: Estatic dev_t mcbsp_dev; L! z2 P+ w. ?+ ?7 {1 C t0 h8 {
unsigned int DRR_data;3 M1 s% r; k* u* L
unsigned int DXR_data;2 F. E: K# P% c! ?& K+ k% d
static int mcbsp_open(struct inode *inode,struct file *file)
6 {# \! ]& O( O{8 W! E- c z, d; [, H
- K* {4 q1 E: g
//interrupt enable,initialized
3 t& J& K( f( j/ I0 X+ R unsigned int temp;7 X, a- p, _# F5 W6 ?
//SLEEP_EN(GPIO8[10])---0
/ S0 Z" j, w; }" ^$ p temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));9 }$ Z2 O/ n5 a6 M/ r: _0 e, l
temp=temp&(~0x00000400);/ e9 X s( h. ^+ f# O1 L
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]; A! L7 M: I7 n% P$ r! T# h
//RESETn(GPIO8[8])----0----1
% T$ b' k9 v6 U, M% F1 Q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! b6 c7 k5 U9 F2 @8 t4 |: \
temp=temp&(~0x00000100);
# |$ P& }( ~, @3 ?/ v }% P( Y! _3 x __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---03 ~, |& S; n! z* }
udelay(100);
E+ B4 p. t) c' j5 v4 i temp=temp| 0x00000100;" J4 h5 n) z% L5 a* ?
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 {0 J& o. c: {( ?
udelay(100);
% u" Y- E" M5 }- Y$ I printk("open success!\n");
4 L$ L1 R. T+ @1 @' G return 0;. U8 E9 Y* i% t+ l( Y9 _0 Y
}$ X, [6 I7 B; m: Z
9 p; \( `% b7 r3 ^) zstatic int mcbsp_release(struct inode *inode,struct file *file); z. e) ?1 n A" P; y0 ~1 B& t- G
{
& `6 L3 u& }" g printk("release success!\n");
0 Y+ [$ u7 L }# ?3 ^2 l, k. \+ X return 0;" k% G2 b* [ ~4 T
}$ M. i6 m' Y. s" x% M' O
2 V2 h2 K6 Y3 I* B
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( h8 e3 Z8 e3 J{ m' \1 g% R! U# ?6 }" ?
copy_from_user(&DXR_data,buf,len);: X' j6 b8 |3 D y; Q2 A, a3 P: H
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 4 Q/ a* u7 O4 J# q6 O! D% V" ?. P
return 0;; e, e: D+ \& z
8 z6 {& e* W( a5 e
}
! ]9 P7 `' t' m7 L5 o n
6 t+ \. H5 q7 g8 W$ ^$ W8 Sstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' S6 u) K; [( ]: h9 V5 z! w# g{
8 t6 T8 _! r) y6 R DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
2 D" J: f/ M u l1 {0 l' X$ j copy_to_user(buf,&DRR_data,len); ' ^1 R( S8 E. j @, @
return 0;7 A6 [! Y: r4 R3 b
}& b8 G9 Q" ^, h5 n) i
) B! ~' w: k: X2 o" s. I
! U7 s" ^% M% N0 l# Ystatic struct file_operations mcbsp_fops=
; M; W" S- G* ~; i4 b$ t{2 [3 E' i9 k- \
.owner=THIS_MODULE,) l4 l7 X. X# Q; U* I% u9 B) Y
.open=mcbsp_open,
2 }0 ~. O: x7 b: j% i: U+ A/ ^ .release=mcbsp_release,
2 m" l$ ^/ @: H# T! ]8 E; t/ F .write=mcbsp_write,4 S* U% T; W" K& [3 v; A
.read=mcbsp_read,: e" ^: |; c; W: h1 D
};
& }& T0 H7 p8 v4 ystatic int __init MCBSP_init(void)7 n8 G# Q3 z, I" O4 m
{
9 R5 t( o! i; Z2 W int ret; f7 G6 \- d( Z Z c p2 ?
unsigned int PINMUX1_REG_old;4 E' k0 m: f; i. H6 C8 A
unsigned int PINMUX18_REG_old;
4 g+ Z$ A: ^" J2 c unsigned int PINMUX19_REG_old;
/ R) I2 a8 ]1 \8 b unsigned int temp;
2 h! C% ?! `% I+ O \ if(MCBSP_MAJOR)5 f7 L$ I2 L( }0 N7 A. S2 S# f% |) l
{
# _: n/ p# z4 E2 n mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
% }( y8 [+ W/ b: x2 V ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);5 y& C( J4 u0 f2 _1 G0 Y- z
}2 `2 N" k @0 l# `, c4 u2 G) @0 \
else5 V; w+ A' e5 R% g$ q
{+ x h r- b, I7 c! v. d
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);# N) O; U3 M9 Z3 y1 j
MCBSP_MAJOR=MAJOR(mcbsp_dev);
( W5 b( Q8 U; }0 }, m }1 h! q* M1 F7 v* h. q
' y6 B5 ~7 ?% K6 L; A: ? if(ret<0)
- a9 N s8 V! k! [ {
+ D: X! T5 D, P6 b: Q: n# ^ printk(KERN_ERR "register chrdev fail!");1 }% Q. V$ T! L" c1 J/ I
return -1;% ?) c% w) h0 Z( G3 J
}
9 t" U; f! \' k3 g& ^4 o: K 2 D5 t: Q: e, A
mcbsp_cdev=cdev_alloc();
_5 S y R+ ? / J4 b' U9 q8 U
if(mcbsp_cdev!=NULL)
# q* { b7 m5 t, X3 W/ b {
6 x7 d: c7 q" r _ cdev_init(mcbsp_cdev,&mcbsp_fops);
% k* V; z9 G: ~ mcbsp_cdev->ops=&mcbsp_fops;4 Y0 w y' s f" U7 F
mcbsp_cdev->owner=THIS_MODULE;+ w. l9 W! c$ o) S
) D* u' \# T0 ^& d: Y
if(cdev_add(mcbsp_cdev,mcbsp_dev,count)). Z- L9 m& z) Q) E2 a
printk(KERN_ERR "register cdev fail!");
2 c" S0 L+ u1 ? else6 K( V0 C1 l; q
printk(KERN_ERR "register success!\n");; h+ K% i& D0 ~ t, t( K6 k
}5 T% i/ \7 p9 a" x0 E
else
" Y+ E: V& c- Q! ]2 e% i! y& [ {
3 p4 t4 e& a8 L3 A/ ~ printk(KERN_ERR "register cdev err!");- N& ?* d3 w0 e8 d/ j) x
return -1;3 o" y L+ X3 H. x4 J
}
9 j* X W4 J- C; W4 [. x% x ~
( K4 C+ w7 r( d( J- m mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);) |( n! C4 v2 | [ |, F2 \
if(IS_ERR(mcbsp_class))
7 Z, v; O/ \7 E1 G- W7 P( I* Y+ H {% Z# u* b* E. a# g2 o
printk(KERN_ERR "register class err!");
; q6 x' G1 n k! ]$ | return -1;
2 p. j- z$ O' f; S7 L3 J. R }
0 L$ d) V& u; |) I0 v device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
& X# T( M. L* x8 k& V8 x j& ?( f- f3 j+ a
//PSC
$ [0 g' _" t- I5 e8 D# J- t2 ?) F //add Enable MCBSP5 l F7 j1 V# X
//test
2 f2 O& o8 i U. s1 g) U temp = 0x80000003;
, M7 Z9 L5 w' [! Z writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 L* e- G' E/ @, f temp = 0x00000003;' Y& K; A6 k) P' |2 l
writel(temp, IO_ADDRESS(PTCMD_ADDR));$ b& n9 }" r- \8 P" I% j# k/ r
3 D; D( V7 }, r2 a; u! @4 Y temp = 0x001FF201;0 i' @% p+ c$ V7 c
writel(temp, IO_ADDRESS(PDCTL1_ADDR));' u& b* n4 H$ B& R9 d% ]
& X5 m/ i/ F; f3 r5 i8 m
//PINMUX
( `5 D% ~, {% L% q ^" Y //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
: |% W- m3 r% b) Y0 @2 U, D. t# ^ PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 0 Z9 y; H) K& ]/ l: O8 @
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; : Q' |3 ]9 k, w, F3 W3 w
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
7 K3 F Q2 X8 ?' Z: Z* C 4 {2 P2 r! ~7 b+ A$ v7 Q
//SLEEP_EN,EPR,L138_SHK1,L138_RC. x- a% R3 V2 m0 u \# K
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
# {# b. j" @: w PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; & e; [1 g8 K5 g* \# p7 K8 q7 b
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 \) D9 n; l$ k8 q0 _, h
. r6 Y3 K( }$ i6 {$ Q4 T //RESETn,L138_SHK2
9 o* [& \" }0 b0 e+ a- y& C' n PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
, d0 ?$ F! K5 R4 ` PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; , ~. b% L4 u) ^& _
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
& N6 }: k& G& k) X2 d* V" t7 z
L2 z4 ?6 `) [" @
8 ^* E+ k# o6 P //SPCR Register7 r+ s& ^' i+ M" c, c, x! q: w7 [+ f
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
9 J3 n) Y; M4 x [7 U4 w% s2 O temp = 0x03000000;//(DLB=0)8 G% J& g' C, C+ p" k" P' f- Z8 T% I
// temp = 0x03008000;//(DLB=1)
4 C3 e/ @* N- n9 V" W writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
Z% [ e& P# k* ]+ S2 n2 K, {7 e: s temp = readl(IO_ADDRESS(SPCR_ADDR));
8 U u* c ? d/ ]6 R6 T, v printk("temp=%x\n",temp);
( Q0 I# Y) j5 j9 `* z/ j7 X/ i, E( A 9 t) \0 S2 y& |$ J: |
//PCR Register1 D8 B2 R- R9 A2 g; U% t# ]
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-08 e) V3 \9 z. o7 e2 }
// temp = 0x00000F0F;
( o) \: g9 m9 `! r7 {! ]. c temp = 0x00000B0F;
1 a Y* | u4 x- d3 j. Z, D/ a8 C2 l writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 1 G# P U% M0 K/ Y/ S2 b8 u- S
temp = readl(IO_ADDRESS(PCR_ADDR));- o. f2 S2 I) ]/ y
printk("temp=%x\n",temp); & b8 p2 U# n$ J* R* i& Q
//SRGR Register
8 Z \, _# \$ Y. o; a0 F //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
0 i2 X0 x5 e1 ^' g! Y, O7 D5 q //temp = 0x301F000B;
% |6 V Z* Z% S7 v( A writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 6 R1 g0 }2 _ E+ E
temp = readl(IO_ADDRESS(SRGR_ADDR));
: _9 b! [* x! ~ printk("temp=%x\n",temp);
% q' s" N: w6 T1 w //RCR J+ w w- C+ B. z0 D
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
: Q* A) b' V2 A //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0% ]- b/ R9 l! |4 d+ L' y$ d
temp = 0x00440040;# P5 W" P( Q9 ]/ P- m6 z7 b
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
7 ~- K6 T; y8 t5 `; E temp = readl(IO_ADDRESS(RCR_ADDR));# d, ]+ u! N" @5 B; V( P2 z
printk("temp=%x\n",temp);; Q: W; j% r8 k9 _
//XCR* i# {; J# J0 L5 I; p& T5 a
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
' k6 g) k5 Q5 |8 J# o6 e1 B //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
9 ~5 x- d7 q/ u/ X! c; { temp = 0x00440040;. `$ |6 g, c, ~% q
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
& M9 }3 \/ \; _2 J. s# K1 n temp = readl(IO_ADDRESS(XCR_ADDR));+ O) }4 l% \& r! d S) V9 [4 C& t- a
printk("temp=%x\n",temp); ? a. t% [' T! t4 ?/ s4 K/ b }
udelay(100);
. ~ I% e( s' j% f: L0 Q7 P1 Q //SPCR Register
9 @7 N# E* @% f. o //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 x$ B" ]/ Z, T t$ i5 S2 G temp = 0x03C10001; //DLB = 0 VS DLB = 1
! S* Q6 }/ S8 { writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled" ^$ ~% D" P5 F4 x6 O
temp = readl(IO_ADDRESS(SPCR_ADDR));" B! F9 [9 ?2 z* T$ u0 t
printk("temp=%x\n",temp);
5 }8 u& T% T- p8 w1 h d udelay(100);
& s R; u: X( ~; m$ _* {2 W) f0 g) T( t) u5 E8 l6 v
//set GPIO direction
1 f* R4 ~# m/ X$ d temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));' [' Y u: x! A7 O
temp = temp | 0x00000100;//EPR----input# W$ ]. y/ F$ v; u7 j4 @" H) @, \
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
- G+ L" j$ {0 ?( ?1 h' y! t% ? __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); s, i( f' u( O' q5 C
/ P3 m+ n4 t. \5 m4 m return 0;/ U$ j# B& i, [% m2 d( H; u9 s
}$ m% D2 c `2 V1 e3 Q! B& g
static void __exit MCBSP_exit(void)
- f7 x' w7 p% x{/ a3 ^- T! z" b5 {! J
printk("mcbsp chrdev exit!\n");
4 i z+ j: P# C1 O/ k/ I( H cdev_del(mcbsp_cdev);
8 } U6 }# F2 S1 L0 ` unregister_chrdev_region(mcbsp_dev,count);- h3 k4 L5 x, [& J: P1 [; G# B
device_destroy(mcbsp_class,mcbsp_dev);
3 A# L6 F( B1 V; x2 _; ~: \7 K class_destroy(mcbsp_class);, v1 }* ?; v5 k4 k: ~
}
( H: f1 S; Q4 Imodule_init(MCBSP_init);5 R( \ I: v4 A
module_exit(MCBSP_exit);
5 G- T _6 H9 \) k7 r3 B! ^ I9 m- T p
MODULE_LICENSE("GPL");. _) @0 z A: Z) U H6 B
7 D. h4 g0 I* p0 y+ y9 J
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。+ W p; }% ]+ t+ { U) @
我的应用层的测试程序如下) P6 _, q$ Q, L2 C. {" r9 d
#include <stdio.h>
8 M& f2 y; ^9 g0 t#include <string.h>
' f w& {/ y6 Y4 _#include <fcntl.h>7 g9 I' U7 Q+ G4 `) }
#include <unistd.h>
, O5 s% ^! y7 M8 h#include <signal.h>
9 {( e6 Q6 W9 p5 F#include <pthread.h> //线程9 ~2 F, Q# h: O; A8 j
#include <stdlib.h>6 K0 q7 S. b& j4 {! e7 Z: j( D1 n
#include <pcap.h> //捕获网口数据
& M6 v2 f" O1 x* h& w+ f) y4 I#include <semaphore.h> //信号
# D! \" U* W9 t( s7 C9 B#include <sys/types.h> //消息对列, r8 S# F2 V1 Z- D
#include <sys/ipc.h> //消息队列! G& [! ~& o* |2 Q9 Z, O( L4 n
#include <sys/msg.h> //消息队列
& v4 Q4 D9 O; d, F7 @#include <sys/select.h>% @& g5 b! o0 Z" m% u9 X
#include <sys/syscall.h>6 N3 L! j+ i4 R0 s; f% ?" v7 R
#include <sys/stat.h>
4 k0 l( N I7 _: v5 s& A* Y+ [7 k3 B9 G#include <sys/mman.h>$ X4 o. s" z! L9 J* L5 k. K0 N
#define msleep(x) usleep(1000*x)
( J8 q2 }* r8 ^8 L
q, }) ^: j- Q' K" e4 rint main()
" x: L+ m( O6 Q9 S' w5 ?5 E! r{
- j( N# B5 N3 r4 u7 N //MCBSP,ARM与AMBE2000交互设备6 O3 s3 d; \& y/ ?) G
int fd;
! c. |: n( Q# Q+ Y unsigned short data_write = 0x5555;6 G( K) \, d( ]
unsigned short data_read = 0x00;" ^4 _' G# o; v
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
: c0 C Y# L" T2 X( q // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
6 p0 \5 X' H, e/ L
: P0 Q- Q/ X/ ? if(fd < 0)4 _$ F* c. w0 E2 f q4 ]. r
{
& }! s3 ^* \, Y$ s perror("open failed\n");9 t6 K2 ^9 h p- ]! x3 d$ W
return -1;
/ J9 @' z# ^. w% C) ] }% d$ C7 V: b5 `6 R$ k" N
; x2 L' h7 a6 @5 `8 x( ~* d
while(1)
8 G3 \+ L u& {6 o2 m! m {
/ B; S1 c- N! W" k9 V9 n - B; I1 M* r$ J) b0 g3 {8 k
//AMBE2000每次读写是24个字为一帧
$ ^& C% G6 F G/ @6 }# u' H" B B- K //写数据时将数据在底层存储起来,等到中断的时候再发送) K: c( f: J* j% P0 u/ i
//AMBE2000输入数据是以0x13EC开头的
- e3 Z) W' {' O8 B0 y5 p# ^ write(fd,&data_write,sizeof(unsigned short));7 |! O& R& x) X! x: a
& @* ~9 a/ c6 A5 U; _: @# O1 G- ~( z
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
* S) s) ^$ J8 ^5 Y i. {1 n read(fd,&data_read,sizeof(unsigned short));2 I5 q" E$ B+ s5 z- e& L/ K, O
9 U4 v* n3 l- U! j$ q- p2 m if(data_read == 0x13Ec)
6 H$ t2 S- N; k* I {+ n0 j# j4 m2 H7 q- j
" o1 G; [) Z1 d1 ?9 R" T' d) m printf("data_read = %x\n",data_read);
2 i4 R& d& `% h" G# c L& P6 [% n% { }% d# d2 T( Q/ Q8 l* q
& y6 x: K& T2 r3 X
msleep(10);3 B0 q( x) i/ K8 k2 }; F7 p9 a
- g8 I8 Q1 S+ {! V% }5 M4 b
/*5 r* Q/ `( S1 q6 Q5 b
ioctl(fd,1); 1 s T- g$ Z+ y2 B2 s
sleep(1);* a0 w8 d' W4 N1 l3 H8 D
ioctl(fd,0);( g; B1 l% J6 U; y) g5 ^! `
sleep(1);8 @3 W0 p) Y5 y3 f7 F
*/ 9 W% X! F. i5 V; S4 N* I1 ?
}
: e8 J( H9 y0 Q. ]+ p/ {6 } return 0;- ]6 E4 ^. }8 }1 |* V& T+ C3 w: T
7 O0 _4 D7 k1 k) f}6 ~1 E5 M& Z" C4 s6 w6 X( ]3 ?! |& V
" V2 p- s( q. l: A5 q+ P多谢各位指教,谢谢! 急* N! Z+ G' J7 y
; v- c) H! a/ C5 `) j' |
& @1 `0 g+ L# N) P, E" a3 V, N
6 Q. {- Y. v5 p) @4 B$ n, b! N- [, c: K; d/ G" n
3 a0 l2 b" _1 ]: L5 F7 w3 K7 \ |
|