|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
0 i7 j% J: ~7 H5 b/*
5 |2 e" I- r+ x$ `0 K0 L * Copyright (C) 2009 Texas Instruments Inc" }8 S" L, N8 O: P' [" s
*
+ q9 z+ D0 q [& t% ?! U * This program is free software; you can redistribute it and/or modify+ f& Q& V4 ]2 m% n3 k/ [
* it under the terms of the GNU General Public License as published by
1 \" i% G- b I1 ]- S6 U * the Free Software Foundation; either version 2 of the License, or5 [, X! h2 ?3 u
* (at your option)any later version.
6 r8 D1 r& ~" q. ^- @& @/ P *
6 B# F; b4 {# P9 B7 Z3 p& g. m * This program is distributed in the hope that it will be useful,
' h( a6 `6 \5 d. S0 |: o* ^; ]- @ * but WITHOUT ANY WARRANTY; without even the implied warranty of
5 Y) O$ T/ ^* s5 X9 C5 @( Q * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 ^8 k, e( Y: {) a0 a8 Y * GNU General Public License for more details.; n/ n- X* |9 d+ R/ @3 W" Q1 P
*
5 o, @2 e/ {1 z% ]: O8 ^2 Z' Y * You should have received a copy of the GNU General Public License
}& _) o5 v1 ~4 C% {: y * along with this program; if not, write to the Free Software
/ C: {4 |1 |4 \9 Q5 k/ ~! @7 ^ * Foundati
3 B" t$ e$ c9 s8 j# h5 n*/
) ?/ n) T+ _9 k' S s#include <linux/module.h>. {- Y/ {8 {: m. |# W6 k* b
#include <linux/init.h>
/ t' h# n% L7 z: u5 |% ~3 i9 k, U#include <linux/errno.h>6 v3 }9 X! h% c3 L/ r
#include <linux/types.h>
Q$ R) [3 Q) j {7 F#include <linux/interrupt.h>
' f7 [2 `, S {: a. F. [. @6 _8 z#include <linux/io.h>
`) n& I) ^1 u, H#include <linux/sysctl.h>: @9 }) Q1 r% _: J: M1 [) ^0 Z
#include <linux/mm.h>
5 m3 c3 e4 b, Q+ q# H% ~! i$ ?#include <linux/delay.h>
$ k. K. Y1 c) v+ S#include<linux/kernel.h>: y/ B7 }/ X" L
#include<linux/fs.h>
/ a$ \' a) t! e#include<linux/ioctl.h>. l) k6 B2 E+ x5 z) }
#include<linux/cdev.h> ]1 O, @- E& f' w; s& u
#include<linux/kdev_t.h>, d. m8 z. i" F
#include<linux/gpio.h>
% Z9 g1 I7 R" ?#include <mach/hardware.h>7 C/ n0 n2 p" z# N5 ]
#include <mach/irqs.h>; i0 N& \' f9 O- w; G7 ^
: g. U4 B/ x+ h" T2 e#include <asm/mach-types.h>0 v9 Y$ [6 j& f: m9 O$ B
#include <asm/mach/arch.h>
# p# ?8 Y, E0 @' A( s& J0 U: k$ o#include <mach/da8xx.h>+ I( m3 d9 e: H" u0 t3 O6 y7 A
#define SYSCFG_BASE 0x01c14000# M2 q: D9 b& A) l' q i7 B
#define PINMUX1_OFFSET 0x124 : V+ u: \: I8 }: b
#define PINMUX18_OFFSET 0x168 4 M8 g' w( [2 z( T* ?
#define PINMUX19_OFFSET 0x16c
6 `4 `( y( ^' d2 Q( z#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
& W0 g _/ r) p E7 k#define RCR_ADDR 0x01D1100C //MCBSP1_RCR- c% t; p9 a5 P% c: V4 |
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
% o. Y! I4 `7 e* c$ ^#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR7 `% [7 c7 m) x/ i& }& ]" _' A
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR1 n2 T' c- w1 ?# s8 t; k3 S+ v4 i5 A( l3 L
( M- u2 |5 I0 @9 S" C& W6 E
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR, ~' ?9 y$ C% d
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR8 C- ?! _5 t2 p# C
//PSC
8 M" @# J6 u3 W# x0 m) M8 J* a' ?#define PTCMD_ADDR 0x01E27120 * N/ x* E# i" Y
#define MDCTL15_ADDR 0x01E27A3C( [7 |" y6 s) ~
#define PDCTL1_ADDR 0x01E27304
" E$ O O" m5 i) a; M) w//GPIO8 direction
9 Y; _. l# K/ R- W/ G. e0 I#define GPIO8_DIRECT 0x01E260B0
5 o% Q# I& M7 o#define GPIO8_OUT 0x01E260B41 T1 _, d B8 J* M
#define GPIO8_IN 0x01E260C0
# U" \8 N- E; J1 a3 R0 r( T* c. q" e5 ^; P5 Y, n: ~) h
//#define MCBSP1_RINT 99 . @# p# n1 m9 p9 z- F
//#define MCBSP1_XINT 100 4 s& c& }- _) n' }! x9 w# }) ~$ P
static int MCBSP_MAJOR=239;& w3 ?+ J: Q* J
static int MCBSP_MINOR=0;, J+ b$ l7 Y+ B
static int count =1;
+ m! X, g* q$ t z$ R
: l5 \( w! I' `& F#define MCBSP_NAME "MCBSP-device"1 |, T. ~$ S+ W! E, V
2 |2 t' c0 n) J4 K2 P9 ?
static struct cdev *mcbsp_cdev;6 b5 u7 x( Y' J' B' N4 W
static struct class *mcbsp_class;5 d S3 j- R& y/ C; A1 y
static dev_t mcbsp_dev; |; c( ~% b7 J+ X4 |( J
unsigned int DRR_data;
2 R9 i" `5 {/ O. e5 n8 _unsigned int DXR_data;# h1 Q, J/ M- w: V$ p5 H
static int mcbsp_open(struct inode *inode,struct file *file)
" ~. Y+ }8 f# I& J Z. Q" x{! Z) b9 Q" r2 o8 {+ [0 ]
* P$ Q' p. v# G, K
//interrupt enable,initialized
+ }2 c8 ~/ Z1 `( m9 g! ~ unsigned int temp;
- x# y' U+ {: K) u, o! ~; {* D //SLEEP_EN(GPIO8[10])---0
* \+ C+ n, S+ r* a B! c1 Q temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ l* X4 a e% k. E$ q5 R
temp=temp&(~0x00000400);
, @' m0 V- i0 z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
3 l5 p, [- y, v //RESETn(GPIO8[8])----0----1
" p! y! G/ Q6 B8 _ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
- i3 w1 c' P5 G$ Y/ m temp=temp&(~0x00000100);3 _+ V/ x6 v+ \5 S- r: U5 V
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0+ W' [# {/ `5 A2 C, ]: s# k, A
udelay(100);* X( ^ b/ C: ~; ]/ C
temp=temp| 0x00000100;# R8 j! x" e; i
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
6 \2 k: P. h6 j! ^3 k4 t* n udelay(100);3 n6 t4 `8 |9 A4 R" {. h( z) x8 W
printk("open success!\n");
1 e6 d* p% d% O) | return 0;8 J9 s; r p+ Z7 @( u+ s
}$ S6 u6 y- u s% n) @, P7 R4 W
( ]: Z7 L9 x; a1 Ustatic int mcbsp_release(struct inode *inode,struct file *file)' |9 F' u2 B6 l5 h3 J
{
: a) q* u$ x% B) P printk("release success!\n");- |+ M0 Y! N8 d
return 0;
( e5 c3 E9 J# |1 i6 s}; i$ Y4 e$ E! i ~
, D+ Q& O$ w* O) m% D# l" G) N# wstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
0 J* ^# [" m& r{3 J: o. [/ V/ J* T
copy_from_user(&DXR_data,buf,len);
" L9 O8 g; y5 F: F, o1 ] iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
. ~3 T+ \ b# R7 c return 0;
' D+ C8 L6 G3 [0 r
6 N6 ?, w6 C( y% z8 v$ f( ]}; n5 L9 n; r4 [. F. }$ x
: [7 [+ b0 E( J; D3 l, R' z
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off): R4 y$ }6 L* l7 G3 g4 F
{
3 @# n1 _7 L0 W: [# i( N DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
: V3 A y0 L: | copy_to_user(buf,&DRR_data,len);
$ R6 c% q' S+ H- I return 0;5 c5 X4 L; r& w
}2 j* V1 B6 A2 g: e3 p/ }- a
3 j/ v7 |2 z2 C5 r9 @& s
! t1 \. g1 h. S# r0 q) u
static struct file_operations mcbsp_fops=0 Z& R b" q) [3 C9 i a( V# Y% M
{, v! A6 Y* T2 I) t. K) ?) g
.owner=THIS_MODULE,7 F1 D; w" l+ M) w8 W4 v; |
.open=mcbsp_open,
9 T, b3 j2 R6 u4 A. {" p# z .release=mcbsp_release,! K# U( y6 s) E0 z" b; N
.write=mcbsp_write,' u0 i% T& }/ O: B# e- Q
.read=mcbsp_read,
f/ p2 m, C& |7 Y: q3 \};; O6 E4 Z! a8 m7 i% x2 O% T. N
static int __init MCBSP_init(void)
( m/ Y6 I8 {+ _) ~- q; K( l{
' g# S- W0 B/ H) ? int ret;
! E3 Q% t- c) @! |$ U* g& |# H& n unsigned int PINMUX1_REG_old;7 |& j( f: s. c& P! C* r
unsigned int PINMUX18_REG_old;) i5 a* f5 o9 P3 [% o
unsigned int PINMUX19_REG_old;1 Z: F( x# |0 n7 j
unsigned int temp; : Q' `% T# S, q2 j% ^; F' X
if(MCBSP_MAJOR)$ p! @' M5 {3 A6 q( ?
{
2 S- e+ M) F5 ~: p mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- d. ]9 N" x! C
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);* z6 v# T+ t. L& v7 ^9 w
}
3 v' ~8 r, D W# Z7 F else
) e G$ [9 {8 P" a: J5 w3 | {* a, D$ s: I2 _4 P
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);8 h+ U# A# W2 l
MCBSP_MAJOR=MAJOR(mcbsp_dev);$ t" {( O! E! n* x
}
& \( X8 [5 o- T. L/ R
7 x, f" y+ @1 r [; ` if(ret<0)/ P' R+ H0 S9 R, {: Q( n5 k
{
6 ?: t% F8 U& ~5 V% p printk(KERN_ERR "register chrdev fail!");
. M* {( ?4 l) ^& u) D. R return -1;9 l$ [: s+ e* G' `
}' R+ S( E. L: g& w7 ?- Z4 a$ h5 D6 |
?7 x) n. u8 f6 m( O7 } T; L% X mcbsp_cdev=cdev_alloc();
( t; W. _- W. F* q/ c% r0 @7 K/ G+ ]
0 b" U/ O V# |8 Z& v' Y if(mcbsp_cdev!=NULL)
2 S! U% b. Q6 [/ ^ {
- r! D" e |( S2 u- b+ a: B cdev_init(mcbsp_cdev,&mcbsp_fops);
" G% d4 q h3 v: O mcbsp_cdev->ops=&mcbsp_fops;
0 l$ Z) O W7 U) K/ j6 g* }- S mcbsp_cdev->owner=THIS_MODULE;
" B2 w5 _9 a B' c, G* j+ M
. \9 D) R3 k$ R, k if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), w& p2 \& F" O* \
printk(KERN_ERR "register cdev fail!");
& A5 Q! e% u! V8 ?- V ^ else* @2 V. t1 S: p
printk(KERN_ERR "register success!\n");
- R6 b8 k/ r: ]/ W }
0 K) N! r! N4 T else: f, B: Y+ x t- n" ]% H
{
/ {1 N2 y* N) L2 i) s9 { printk(KERN_ERR "register cdev err!");
: }+ F5 ?( S' N1 }4 g return -1;5 u0 U! f( [' I" ^; W! C/ D
}$ D# U$ F& U( I9 x* Y# s2 K* b
/ @! C1 N0 X7 e7 Z0 o mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
# t8 c9 m& \2 L' A3 F: h6 e, E if(IS_ERR(mcbsp_class))
& c- Q2 K8 C: k% x {
; u$ u" M; ?5 Y: _! i/ j2 [( U printk(KERN_ERR "register class err!");
0 q7 ?( c8 r9 @ l/ r; W return -1;
$ }. o( j3 y4 u# s5 v$ }8 s( N: y }
8 X# b/ u, {- V* n: S' Q. h+ L0 b device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);. K+ j, J. o- s/ g9 v7 l
% m8 o- s2 s1 }/ x
//PSC7 Y4 A- h0 o" J5 K5 t# L! M
//add Enable MCBSP
2 o. b8 X$ W3 v" P. V //test
- ^8 `& u% q0 ?! A2 d( j. B/ l temp = 0x80000003;
1 U* R' H. O# r# K2 L2 }4 V. O7 m writel(temp, IO_ADDRESS(MDCTL15_ADDR));$ r% B% T: h3 R3 K7 ]5 A# T
temp = 0x00000003;
e, ?: G( m: K writel(temp, IO_ADDRESS(PTCMD_ADDR));
3 k9 K7 D: I8 x% h- i9 Y 8 F3 B3 t7 O+ b# K
temp = 0x001FF201;7 v/ t' ?1 L, @7 x
writel(temp, IO_ADDRESS(PDCTL1_ADDR));' \% P2 r, @1 b. Q& \+ N
3 c. @. i& n2 @+ \; t2 l //PINMUX * y: }" J1 [$ s0 ^3 V/ I r
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,0 D. K2 J& Q# K; Y. R
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); * d8 a9 F+ Y1 p: K. x, f% O
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
, K, ]! ~6 H w8 W writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);) l& p) u1 n: n, v5 y: k; ]
2 b8 X7 h- b( R9 a! F //SLEEP_EN,EPR,L138_SHK1,L138_RC
+ A1 q. A/ Z" ]( H PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); % w: K# D, r( F. W
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; $ Y; R0 o* A% o
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);3 v N* v: E$ D" ]$ a& v
$ z3 G% \3 \/ x: V- A' ?
//RESETn,L138_SHK2
' \1 f z2 ]6 {+ d N PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); : _# j1 i8 ~( D* N7 i4 K
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
4 L1 I- v0 y9 M4 g* l4 C writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);$ f1 a5 m1 p4 x% H# ^
# q: K; U1 P- F# ]
* j# R. Y1 o) M9 K5 u) Q //SPCR Register
" |0 j ?+ y/ m6 q //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 R- y; b* A2 k0 @: ?) H7 I. S* h5 o( a temp = 0x03000000;//(DLB=0)- A& |- y, C/ T0 L/ N8 ~
// temp = 0x03008000;//(DLB=1)
# z* e2 v% `* t1 D! u' t writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset0 E& @3 O4 U/ H- w4 N, K0 @
temp = readl(IO_ADDRESS(SPCR_ADDR));! S4 v5 i5 A9 M' ]3 J: a& P5 X. K
printk("temp=%x\n",temp);" G. h5 A$ G9 T2 f5 B
0 d9 Q* `5 Y& y* [7 M //PCR Register
* C* g0 g) ^' D& I: P" E4 f //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) L) s7 N% ~6 t; ~3 J // temp = 0x00000F0F;
" N% X* O1 _/ q! f9 c temp = 0x00000B0F;
! b ?6 X. H2 z3 L2 C writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
+ H s3 O t6 D4 S1 {" ?* @ temp = readl(IO_ADDRESS(PCR_ADDR));
' A$ I* J% l; \* ] printk("temp=%x\n",temp);
) f+ r" V5 d/ a; w9 e //SRGR Register) D5 Q9 d d# k7 f5 j
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==112 R" n! K5 N6 f/ w5 Y
//temp = 0x301F000B;
; c' u' D. R/ s writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
7 ^5 \% B: O1 _( @4 h temp = readl(IO_ADDRESS(SRGR_ADDR));
* ^: k8 k+ Z) O, O) V8 s printk("temp=%x\n",temp);, N" x( R6 l# C% n& N+ |% j0 m, ~
//RCR
S& x3 `- Z/ R0 n //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( v$ S, M3 [# n0 D0 m4 f
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 s0 E1 @4 ~/ M1 V: i: ?
temp = 0x00440040;6 m0 b, n# Q8 W9 K4 ]3 O# t! Z* N5 i
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
* _6 F. G; Z* l$ E temp = readl(IO_ADDRESS(RCR_ADDR));
4 Q2 f* l! p! y& _6 r' F printk("temp=%x\n",temp); y- @" E) u# K/ p w7 Z/ y$ v
//XCR
( }. ]! f/ Y" [, T5 J3 F //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1+ b/ F& W4 D( @) f3 A* t
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
, |" p# v! t1 i g$ v f temp = 0x00440040;
8 ]# z2 R# Y) Y/ s- c- e writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 2 I |" F; `/ o6 m0 d# i* M' `
temp = readl(IO_ADDRESS(XCR_ADDR));3 A2 T- v+ B$ u, P8 q
printk("temp=%x\n",temp);
& `# { B# T; j) }' w+ { udelay(100);
# [( ?0 x" b6 _; A4 q1 g& P //SPCR Register7 z4 `3 g: i% M5 |- _6 v
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
5 O( G, [5 z" Z* _- z' C) Z temp = 0x03C10001; //DLB = 0 VS DLB = 1+ Z7 e$ e+ q$ K+ N
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled8 c0 S1 s* h" W, U4 ~' Z
temp = readl(IO_ADDRESS(SPCR_ADDR));
) C2 @4 F7 ]1 D8 L6 U" d printk("temp=%x\n",temp);
1 C' s: s! e/ k* f udelay(100);0 m5 l' V6 l* a k& p
9 L9 |& \3 L1 ^3 d. \# C
//set GPIO direction" r! n) a, H% F6 S3 Y
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
3 }# o7 g8 | N temp = temp | 0x00000100;//EPR----input
) q; x2 E$ E; Z% N* u5 m temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
$ |, [0 p3 F) F __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
3 v# I. e. g4 e5 P* H # i! n6 H( a9 b# s+ _4 U
return 0;
/ A% L. c) A* q% x2 \}! |. @4 `/ k9 m x
static void __exit MCBSP_exit(void). X. E' o7 G( E/ S* C
{
l- |; ?7 y4 c printk("mcbsp chrdev exit!\n");
( q$ J: W K) @, E8 d9 j cdev_del(mcbsp_cdev);
' k$ O1 w; Z( v2 H unregister_chrdev_region(mcbsp_dev,count);7 a. M& f8 u; K$ w8 h
device_destroy(mcbsp_class,mcbsp_dev);
! E# s- O4 Y3 u3 n0 \7 f$ T class_destroy(mcbsp_class);" S+ u9 r9 d' H1 L/ `; P, Y
}
9 [, O5 w: {: ]7 _- S, z9 xmodule_init(MCBSP_init);
7 M/ U" B5 j& o9 d8 U# S4 o! cmodule_exit(MCBSP_exit);
0 ~+ ?5 D9 J! x- C s+ p
7 w" C8 f/ t/ S4 w0 q, P3 i6 {MODULE_LICENSE("GPL");
$ O5 n! n9 Z+ I( O# ]
8 \7 p! @! n) z! l6 [我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
1 T' t) ^2 V. S5 d0 Y0 {1 S我的应用层的测试程序如下2 ?! r: T4 i1 H6 {
#include <stdio.h>
2 u' E* b6 O( h6 k9 _$ |5 f; p#include <string.h>
( ?# l3 B, G# ^% z) k6 c: J#include <fcntl.h>% s# x( z2 h/ w; |
#include <unistd.h>- g' A! y$ S+ m* |
#include <signal.h>8 {9 s' Q9 C* r% I
#include <pthread.h> //线程% L* z' \" T. m' B/ h
#include <stdlib.h>2 t# K% Y9 w% g$ n; Z! L
#include <pcap.h> //捕获网口数据4 m* v! {: Z1 {0 G
#include <semaphore.h> //信号
/ ]' @/ E2 }9 E, r#include <sys/types.h> //消息对列
6 }0 e+ m4 x1 w* s! `#include <sys/ipc.h> //消息队列
4 P- \# i0 S% Q5 W3 A" u#include <sys/msg.h> //消息队列/ j% N F7 x6 k
#include <sys/select.h>: }% a- `( N% }. G/ R( W5 \# _
#include <sys/syscall.h>5 H4 O. |) ] {( H: F& O
#include <sys/stat.h>
5 E. W r. L4 ]" l" p0 A#include <sys/mman.h>
. D; q O( I- G2 l2 e#define msleep(x) usleep(1000*x)$ `( S% U y. S- C- @- f$ f
. d8 T% ?1 V' {: _8 H7 U; rint main()
$ N6 V. t* d4 f) }) G{
1 G( R$ ?( m4 I/ p$ a b" v //MCBSP,ARM与AMBE2000交互设备
$ k- _% [" l+ y7 ]0 i$ @. Y$ \ int fd;) g+ x2 @( q7 e6 w) E
unsigned short data_write = 0x5555;) W% J& ~1 o0 W8 w# X4 K) L
unsigned short data_read = 0x00;
$ m$ `" `% u* ~, g- n8 T) `. w fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
9 O7 ~ M/ _6 O // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
, {" r9 u' G4 i* d" {6 v , K# M2 q1 L6 B! f: A
if(fd < 0)
4 \) v2 Q4 Y4 r" Y: p4 | {3 N; v8 z0 D0 ]+ j: A
perror("open failed\n");
- J; J$ _1 H7 g return -1;
# t& v9 N/ I& t$ |* \9 J }
/ @: T8 E b, ]1 c
2 A/ P. _2 \$ I ] while(1)- k$ z% V: \% H1 [ W
{6 r' @0 }" g/ d t; P& m
/ m* k3 P$ ~+ `# V& L
//AMBE2000每次读写是24个字为一帧0 g3 Y7 [/ z' G4 N4 T* `
//写数据时将数据在底层存储起来,等到中断的时候再发送7 w+ O& ~4 B0 D# B
//AMBE2000输入数据是以0x13EC开头的& O+ t/ `) l7 P6 u9 r+ U! ]
write(fd,&data_write,sizeof(unsigned short));* L! _! v6 F3 [0 _
6 y( T9 k2 {' n: ^5 B //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 0 B+ s; H6 z: c; e: A4 _
read(fd,&data_read,sizeof(unsigned short));- {% P. K7 q- h- T. i
& p: U" X( f, O0 P if(data_read == 0x13Ec)) u9 s( R3 D! P& t" O
{
* T5 k( Z9 [# X$ ?$ Y& C; N- \+ f; q
, T8 S; P) W- O* D% L+ w0 \- _1 ` printf("data_read = %x\n",data_read);
% |# N+ e9 G6 w5 j7 s! l* y }
9 g5 W; O) t0 [$ P* u! w% ~ ; d8 }6 Z' k9 _0 @9 r5 _
msleep(10);; E7 p0 R0 q1 [5 y
2 N0 O: N0 \" | _6 x' |2 Z' U8 |* P0 e
/*7 |; f3 N! @, \' w3 p
ioctl(fd,1); 7 y9 s+ W" U5 C; @6 e6 }. K
sleep(1);: F) A5 Z: S; c# W
ioctl(fd,0);6 i: M8 R* N. {+ N4 p
sleep(1);
$ ]8 G, C( J! A: F */
- T4 l. O9 s0 G$ y } " w- A2 f7 _- r) M, \! K
return 0;
; z6 s1 i: q7 ?. t$ S/ ~ ) f0 h8 |; s* O9 B- `1 w
}
+ z" m/ H, s+ S% f- X$ i9 D
$ a- n' P: o7 X$ D l$ Y2 R多谢各位指教,谢谢! 急0 u J& E/ y4 h$ g0 `
# V! N' Q$ _ w' [
$ D# U' p4 l0 c8 l2 r, d" H, B
$ s8 V# P$ k: M$ {+ l, `
* _% p; R" w4 S; ]8 f/ L
- B+ c, Y) s4 O( M; B# @ U |
|