|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ' {2 f: L, T9 J
/*
9 X: E) k \+ _. @- g * Copyright (C) 2009 Texas Instruments Inc4 ]+ F( P- `( _4 [
*
: p% o( s2 e1 H& w- h1 X * This program is free software; you can redistribute it and/or modify+ g; g: X2 k# E4 B) @$ M3 Y
* it under the terms of the GNU General Public License as published by
L* M2 Q3 {! [+ e# L" o$ ^ * the Free Software Foundation; either version 2 of the License, or/ \$ |/ \' U3 I& p! E
* (at your option)any later version.+ c) w" @% q \- g! Z
*
- X( l# L2 \; j. R * This program is distributed in the hope that it will be useful,$ M/ j$ ^) }: Z: F
* but WITHOUT ANY WARRANTY; without even the implied warranty of% S" T: k7 v7 h
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the- g0 a* [/ ]3 z( R1 d* v5 j7 \7 W* ]
* GNU General Public License for more details.
, V+ b" R- |: h2 ~( s2 T4 \ *' {4 s/ F8 m/ b2 h' `6 S
* You should have received a copy of the GNU General Public License! u) ^- J& P) O0 x# y$ c1 l
* along with this program; if not, write to the Free Software% {6 F3 G/ J+ ?' j* ~- R, A
* Foundati
0 i9 ~! F6 V9 y! d*/' d: \: P6 p7 d0 \
#include <linux/module.h>9 O) ?! b$ V. m2 e2 w% J
#include <linux/init.h>. U& R$ |% ^* I @$ P
#include <linux/errno.h>( ?- j5 T# w; g* E" b& f
#include <linux/types.h>* y* ]! H9 d, o' {' s) k6 e
#include <linux/interrupt.h># M; h$ L" L0 w1 q# @" |6 |3 Q7 s
#include <linux/io.h>
2 ]/ Y% s. ?' a! w1 k& h#include <linux/sysctl.h> ~/ h% M# }/ H3 @. c
#include <linux/mm.h>
6 P; Z( ~; Q5 O, ?- n! X6 {2 x4 w, ?#include <linux/delay.h>1 w: U2 c$ B1 \) x8 r
#include<linux/kernel.h>/ ?4 h/ {- ?* S6 y1 l7 @) Y
#include<linux/fs.h>( V- N% |. `: U) ]. J7 U
#include<linux/ioctl.h>
6 E. p! ?5 A: \3 Q#include<linux/cdev.h>
, C1 Z- p. n8 u- c7 R8 T' M#include<linux/kdev_t.h>0 k' I: h/ x" H- `; t
#include<linux/gpio.h>( f0 n( w; q3 n
#include <mach/hardware.h>
8 l+ e! [* O: ~( g5 d0 h#include <mach/irqs.h>
; f8 ?4 X+ F, }! }2 \' d+ p+ u, [ E G
#include <asm/mach-types.h>
( N+ S" |. S1 A) k0 z. _0 Y! M, O#include <asm/mach/arch.h>
+ a# S; k$ d0 L5 A, E#include <mach/da8xx.h>
. }: [% y, C, R( X#define SYSCFG_BASE 0x01c14000
& a, ^. M" G9 C2 r0 D3 h#define PINMUX1_OFFSET 0x124
: V9 ]+ A" P6 W3 d" g4 K4 `: ]8 W! Q#define PINMUX18_OFFSET 0x168 " [. ^& j; _7 ~# a
#define PINMUX19_OFFSET 0x16c
3 u3 T8 u' }$ C% @1 D3 ~7 i" ]#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR" o/ \' K! I: X5 J
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
0 d. Z+ |$ D% h#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
' y$ x1 X m3 S8 L#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR. u: a3 B# Z8 _2 ?1 w0 v
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
. s& v/ K* x4 |
, e# \: [( v9 _8 l2 e4 s: E" w#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
. D7 Z4 J. }' U6 D. W#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
! j, N' P5 g1 |" f# d! n//PSC
5 E2 N- [) U5 z% [#define PTCMD_ADDR 0x01E27120 : n, ?9 k- y( ~9 Y
#define MDCTL15_ADDR 0x01E27A3C$ h7 c& y7 ~- q
#define PDCTL1_ADDR 0x01E27304. H6 B' i$ t: d) j; t$ C- B
//GPIO8 direction1 M% R1 d& r: h6 o
#define GPIO8_DIRECT 0x01E260B0
) C, S! x* r8 B: K7 @#define GPIO8_OUT 0x01E260B4' h8 A' g. ^" w; h" _! K
#define GPIO8_IN 0x01E260C0
! M( _% D# i+ K& v' \
& c* v e. F! E/ J$ ?; s4 D, o//#define MCBSP1_RINT 99 ; N; c h3 F/ p4 h- U8 g* s& Y
//#define MCBSP1_XINT 100
# {& W. j$ H! `" C; V& kstatic int MCBSP_MAJOR=239;
! p n" A7 }1 D) a4 mstatic int MCBSP_MINOR=0;
6 p$ }! N9 P+ j. vstatic int count =1;# _& Z& c4 L2 C9 v: F. L" p( d( M/ Y/ s% e
% }. m: {8 C$ I+ |# m ~. `#define MCBSP_NAME "MCBSP-device". d1 T( T4 Q# x t
& D0 G) x, ^, m5 l: Jstatic struct cdev *mcbsp_cdev;* E* c* {, ~' G$ H
static struct class *mcbsp_class;
4 u- ^ y9 `6 A8 l/ e9 ^static dev_t mcbsp_dev;
% U, c; M y C% G" Z7 ^unsigned int DRR_data;
4 A3 {$ z% }) u! Lunsigned int DXR_data;! c6 ?$ N) y5 e$ E) L1 e7 N3 e1 X
static int mcbsp_open(struct inode *inode,struct file *file)& R s3 q+ r+ \0 Y( z
{7 Q9 i7 A4 R% g0 L
4 @. L/ N3 R3 M. `+ ? //interrupt enable,initialized; _) j( }8 @5 f. ?3 L% t
unsigned int temp;
3 A' j9 c- F# w8 B0 L //SLEEP_EN(GPIO8[10])---0/ G n: D- {7 Z6 t. ~& M( v- `
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));" p' @0 M* O# ~: [& Y$ c
temp=temp&(~0x00000400);
" s% ^ c, q' E$ C: r& J) Z __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10] g1 B r! n3 N& x- P
//RESETn(GPIO8[8])----0----1
8 W# c) U" d3 i M" P) A temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
]: O& ~5 n1 l2 Q8 m) T9 H temp=temp&(~0x00000100);9 c$ g I# g8 m5 k
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
5 |* p; f3 I" {+ ] E/ h udelay(100);- m; ^9 L- y! J" X+ }; \: ]
temp=temp| 0x00000100;( a' V1 _, t, k1 `3 P( L
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
& Y( C9 i' Y+ Y9 `- O4 a; t udelay(100);8 _, n! K4 |( r% S( S6 j
printk("open success!\n");( M( \" d/ Q) d d( Q
return 0;; w6 b' g; r; S3 Z% ^6 M
}
5 R4 n& T! Y$ l& H. m0 G* |% o+ T) W0 s/ r, O. q: K; j m
static int mcbsp_release(struct inode *inode,struct file *file)
- w% Y! g6 }! ? Z/ e0 }{2 P+ C: C( U9 e. _3 _; Q
printk("release success!\n");
6 V9 M% T) z0 q( e" _. i return 0;
' r( ]1 Q* K9 x T# L}7 Y/ `7 ~6 j" e+ f4 R$ ^
+ M# J/ e( O d' y( W8 f
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
; S% b7 ]/ |. L3 \{7 M. ^ p! g0 a# \
copy_from_user(&DXR_data,buf,len);
) s& e0 y/ F3 `6 _0 n iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 5 _- i9 X: O3 R1 s- }
return 0;
' J2 U/ C. f' t) O0 K! p8 N' i8 J" O2 }2 ]
: C J4 z- }* o2 Z& C. n( I3 m}
! k% U* p; p7 Y) {( c8 ]; V _1 {/ r5 i' B; o3 y; ^
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
' K8 M) d% G, F5 O" L6 B$ H$ `{
) l7 c4 C2 l4 G/ l' V# g DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, y8 J5 G( A$ ~' D6 Q, A% I copy_to_user(buf,&DRR_data,len); , |1 u/ `$ G4 d3 s# N% L: ?- U# E, o( s
return 0;
5 }- W9 ~' W8 Y) E}$ z7 V9 \ ^3 v6 g+ ?
! p/ e" B( [6 h3 \6 z
3 N8 J! _9 W0 f m8 D8 X
static struct file_operations mcbsp_fops=1 H' M0 e$ c* G [6 O3 u
{
U: F0 B5 ?) R2 @! N .owner=THIS_MODULE,; b' @' A: M! H5 Q9 o
.open=mcbsp_open,
$ {, C8 G$ V+ H7 n6 s6 E .release=mcbsp_release,
( v, F1 Q9 D. ?- L: z .write=mcbsp_write,) F5 T3 j& o5 g) o3 v! d$ l
.read=mcbsp_read,
, L4 ^: ?$ L6 q; Q: A/ ^ i};7 G( W1 a* T& X/ a2 m
static int __init MCBSP_init(void)
1 d, n" }% B5 |) H: q8 f{ ~0 A, m* \, F" Q, {) D3 L c8 C
int ret;
& q- Q- ?& U9 Q2 @5 Z( B unsigned int PINMUX1_REG_old;2 T/ k# h E/ \ y% {2 n1 t
unsigned int PINMUX18_REG_old;
- G9 c6 y9 M" \$ c5 M- x unsigned int PINMUX19_REG_old;
4 }1 P9 S+ l; Z0 k' m unsigned int temp; ) T! k A* \ z, {8 E1 C3 T
if(MCBSP_MAJOR)' ?4 w: L0 W* K
{
1 }. P% U5 h5 v" v mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);5 o1 Z! K( F# a5 I9 u8 d% ~
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
7 K2 w6 g/ Y- g+ S, q }
$ C6 r: M& S7 R- X9 ` else
" }+ j! O) g- Y8 h: o {' S/ I3 T6 m$ [. G$ H
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);. ?/ ~2 N1 g- n7 v
MCBSP_MAJOR=MAJOR(mcbsp_dev);' e/ O, j; \+ _8 I: l
}% P* \" h* T3 b" Z! c; {
8 G4 `3 O' z4 O; W! B if(ret<0)
- |+ c% Z! B5 y( ~6 |8 q {
4 [6 E5 C2 Q+ {8 T" V: t printk(KERN_ERR "register chrdev fail!");
! i" h8 N8 }# O: I return -1;
( U2 n5 O, k5 T- _3 R) q/ Z" S8 _+ g }
2 ^) U: k$ y6 j; M( L0 r) ~( i t9 U& N+ h+ A; U3 u1 m
mcbsp_cdev=cdev_alloc();
9 t8 G6 w1 F: J ( U/ T G( B0 ]0 K; q( d! E: S7 x" \
if(mcbsp_cdev!=NULL)! l% ~! b4 x+ e
{9 X i5 Z( u- C: H. c: M
cdev_init(mcbsp_cdev,&mcbsp_fops);
- `" L0 d4 d% y" O mcbsp_cdev->ops=&mcbsp_fops;
5 c0 |/ }) I% @: [% l2 k" d mcbsp_cdev->owner=THIS_MODULE;; H8 A% R6 }/ C: V1 O1 f* T. Z; K
* e: E5 _; C% b5 P7 L: v o' h
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
. R" P! P2 i( p5 I: Q; D* t2 n printk(KERN_ERR "register cdev fail!");* T: x9 F) m- M* @) s" C
else
, M \1 E" G- a Z' O2 Y( V printk(KERN_ERR "register success!\n"); Q8 u X& d" I* A+ u1 s
}. V8 w0 C# F8 M# h& s- h: p( k
else
5 f r% }6 A# y4 O: z9 ~ {8 k0 [* A! J' P
printk(KERN_ERR "register cdev err!");# w! |! z/ ]* w I) P
return -1;5 c* L7 B; J# Q7 n, i
} E6 f& U; H' N9 S. B" Q
5 m: ? t4 w2 T3 D mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
7 v6 D' b2 N1 [& e6 _ if(IS_ERR(mcbsp_class))% C V) S1 |" P- i2 t1 g
{. i% q2 R Z! ]3 H, m1 i" V( `
printk(KERN_ERR "register class err!"); y; d( _! X* Q+ h8 d7 }+ K) t. |
return -1;
: Z) B) [( A. }2 ~% ~ }
% R+ ]9 H2 V" H- p) M device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);; @6 C0 X9 P: [, E: W4 A
! d/ ^3 u3 o5 I2 d; q/ E3 e //PSC
, d5 g+ x& k: \& z //add Enable MCBSP1 b0 j/ c# @( [4 c
//test
( ~5 S0 g# y; ^0 a7 { temp = 0x80000003;
* P* c0 W4 u: v/ o5 U% z writel(temp, IO_ADDRESS(MDCTL15_ADDR));6 ?9 {% V; `+ A, P1 P6 U
temp = 0x00000003;
# s0 m' X# `: J& z. k writel(temp, IO_ADDRESS(PTCMD_ADDR));
3 J {0 c' g g( w w& v, z 4 v4 `. p5 N, M5 P, A
temp = 0x001FF201;
4 ]% G6 U \# p, P: p+ f% H9 ]7 A6 W writel(temp, IO_ADDRESS(PDCTL1_ADDR));
- J! w! a% G$ X1 F2 ~0 P# R
6 M& H0 @9 A; P% A E6 r5 Z //PINMUX
5 z. j9 B4 \9 V: b# t //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, q) s& r, q+ x d: V6 r PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); , I- F6 ~# u7 p7 \$ K) a
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ) w* G6 u4 {+ P
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);$ Y& i* d1 E/ y7 |* v" }& Y
( E! U: H* B5 ~ C$ O. s
//SLEEP_EN,EPR,L138_SHK1,L138_RC2 y' G6 X+ [$ L" a: U
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 2 _+ ?0 B, ]: \& o# n
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; ; }* J0 S1 A& q3 t
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 `" j7 C( s" F8 X u3 f3 _ 9 q$ n$ k/ h& j) L" ~8 u
//RESETn,L138_SHK2
9 n0 p9 E* ^7 b: S( q/ a PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); - \. n8 z/ J$ j$ O' \% f0 N4 h* p
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ' g! G' N1 H: x& ?0 N h
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
) g! U7 h% @2 c! u+ I7 F/ z # t! ]! o( @4 w
5 p( L7 |* g; n+ W+ z //SPCR Register
8 p$ r2 A0 J( j( b+ B* t7 h5 N4 c //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset/ C3 j; j* O- W+ S( m
temp = 0x03000000;//(DLB=0)
. Q& R/ }% B0 [/ M V) Q& b/ H+ V: F // temp = 0x03008000;//(DLB=1)
. [. n/ ?# g+ ]3 ]: [3 Q( ^8 F writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
) q# Y! V8 p; {, B" g4 c temp = readl(IO_ADDRESS(SPCR_ADDR));
. @/ u4 T' _, | printk("temp=%x\n",temp);3 U6 l( A( {7 i5 t; `: Q
; p( g p, t5 }6 q //PCR Register1 F' S$ J9 b9 B! u- ]
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
' @+ z7 t6 a$ `$ | // temp = 0x00000F0F;
: _9 U/ i/ S# p- Y8 F! w3 V temp = 0x00000B0F;& H, f( Y8 _/ N! V2 w& M
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
/ n R! s6 e) {4 D$ \( ]2 S temp = readl(IO_ADDRESS(PCR_ADDR));: y; q' }. @$ w7 s7 _+ x- d( P
printk("temp=%x\n",temp);
; r6 `8 O: [; D/ ^2 m$ A/ j# C //SRGR Register% ]% z4 u* ^0 H' ? z* J: @
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
7 S6 |# V7 ?: W- H //temp = 0x301F000B;
, d1 N0 \5 W8 B3 m! { writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
" V( `5 J% y/ l+ g temp = readl(IO_ADDRESS(SRGR_ADDR));0 ?; j7 L0 n8 q4 Q$ z# z% ]
printk("temp=%x\n",temp);9 ^) x3 }# Y% J$ D9 C/ E
//RCR9 |& ?. A7 u: P
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,( L2 B4 f8 l [; Q$ L
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-00 w; K7 X, G+ H5 \8 [+ J: H
temp = 0x00440040;6 Q# O0 u1 p/ p6 T3 ]
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized P; [7 n9 H% K! y9 D
temp = readl(IO_ADDRESS(RCR_ADDR));; `, }6 F9 ?/ i$ `7 v7 p
printk("temp=%x\n",temp);$ i& ~& ?2 ~: j8 o3 H
//XCR
/ p# m7 i" W- n, Z //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1+ _" U1 i" a% u$ ?% E& P2 x9 M# _) K. |
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-05 k2 l1 w W, g" V; T$ z# H: G
temp = 0x00440040;
6 ^; [3 @. o1 C4 w. b* t" Q ^- M writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
; M/ n: m5 y9 g6 H temp = readl(IO_ADDRESS(XCR_ADDR));
; o2 ^9 \! q6 W& c# H+ A printk("temp=%x\n",temp);
, O; @7 n! {' f0 ? udelay(100);: a) M% s; }. B! D
//SPCR Register8 @2 m: V. F$ B) v4 f/ N$ K3 S/ t
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1( O( J0 }8 d+ K2 e
temp = 0x03C10001; //DLB = 0 VS DLB = 1
9 q v) T7 |3 @6 M: N$ O: f writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
) K; E6 }5 E4 L% Y temp = readl(IO_ADDRESS(SPCR_ADDR));
6 k% b4 s2 K2 M printk("temp=%x\n",temp);
: h% e; f: K- L. V udelay(100);
2 E$ p2 [% W* H0 p/ y% X |2 C+ r3 A" e* L$ N( e- h5 M% m
//set GPIO direction
- i( q3 @" X1 A6 s temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));% P" G. E* O7 d- ^
temp = temp | 0x00000100;//EPR----input
0 n: O1 g; k- k2 @0 M temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
7 I+ _8 b$ X4 `# t" q* P __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " |4 s: l- K; D& d3 G* d5 C
! [% |1 p2 O! J) P* d4 O& l return 0;
( ?4 @+ Y- _& [ \8 M+ G}0 r3 ~+ d% C% z1 ?0 ~
static void __exit MCBSP_exit(void)
- l7 v; }' ~0 i* q3 u{/ ?; I' }7 V9 T( ^/ N; N, ~, C# b) j
printk("mcbsp chrdev exit!\n");
& p% t3 ]/ S2 p' J/ @. z cdev_del(mcbsp_cdev);# a# J7 X, r. H5 K# w
unregister_chrdev_region(mcbsp_dev,count);+ M- {) p" w7 F4 R# g: M# w
device_destroy(mcbsp_class,mcbsp_dev);% T) F# E+ `9 ^+ t% l. g) K
class_destroy(mcbsp_class);+ ]' N& T) G0 V4 w$ L
}) ]: ?! q9 s# L0 l* `3 U( h# a1 c
module_init(MCBSP_init);
( ?( K- m' L U+ O# t) omodule_exit(MCBSP_exit);# f( ~2 I( ?1 t1 x# s2 C: y
( S! I8 v8 d& ~, w J0 X- D
MODULE_LICENSE("GPL");
9 i% v. N8 Y( j! f8 v
- G2 s1 ?; O! D0 ^# F# g我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
( e4 M* b/ w1 S6 Y( q8 K% w我的应用层的测试程序如下
6 o: M* t2 @/ |% L#include <stdio.h>) i' E/ e$ o" W$ V& f) [( E
#include <string.h>
/ J) G( b) S1 U4 Y4 `& A#include <fcntl.h>
: c* ]( K& i# ~1 i#include <unistd.h># y" l7 S% b! V6 J
#include <signal.h>
3 F4 R( L. h$ g# G" @: }#include <pthread.h> //线程, C6 u+ I! R6 K. C B
#include <stdlib.h>/ K' U# M1 l- K
#include <pcap.h> //捕获网口数据3 E4 Q! q2 [: G! B# K
#include <semaphore.h> //信号
* M; y) @! u* N6 ?#include <sys/types.h> //消息对列) V, y# P, \1 i/ z* c$ Y, q
#include <sys/ipc.h> //消息队列
) A# `2 B0 \: Q/ \% W#include <sys/msg.h> //消息队列9 z& t# j J" g$ A2 W1 }, o
#include <sys/select.h>! x! ~! {; p9 G: l8 O) l
#include <sys/syscall.h>0 p" z1 \8 \% Q9 ~. U1 z: ^3 Y
#include <sys/stat.h>: q3 ]" W- Q. M2 W/ e# M
#include <sys/mman.h>$ |% u/ y4 }$ {# Z) w. @
#define msleep(x) usleep(1000*x)
3 w$ K4 }" X6 j6 ^ H8 d& L7 ^
+ x3 W8 z. m0 @# Jint main(). g+ ^6 N: I% i( V
{ o+ o9 z! `1 z3 C* o, M7 f/ |3 R. Z
//MCBSP,ARM与AMBE2000交互设备
. h. r8 \, m3 y' O( y" ~2 W int fd;
: R3 b. W, R; K" }% c; g' k% B unsigned short data_write = 0x5555;
% @% x1 R* D& L+ c. S% ^" l) h; B. z unsigned short data_read = 0x00; y( {5 l- L, j' E. w6 G
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);; M2 d/ Y7 |4 i+ w9 \
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);0 s/ N' B4 G6 O8 ^6 M
: | ?: j* s2 p `3 M
if(fd < 0)2 }% o2 q; z5 }
{. m G- b5 A0 p: a+ C/ A# S- j
perror("open failed\n");
3 g) ~: {* ]4 v h return -1;
* m' L! N, b- N1 y3 Y) ~% T1 s }
% }, q* k0 p+ v. I/ L
' C& `; r( K, y4 p, I4 L while(1)
4 {) h" v: G/ Q8 @8 m) H {) R; B3 N/ E( d; B" e. i4 O
) ?* E( X: a7 B0 R* r- {# L //AMBE2000每次读写是24个字为一帧
$ h' O- {; w6 |' B+ i8 z- y8 R //写数据时将数据在底层存储起来,等到中断的时候再发送
( \' T9 F I& d) m7 P% C% @ //AMBE2000输入数据是以0x13EC开头的
" z p6 p6 |) f- W9 K9 V o! g2 ^ write(fd,&data_write,sizeof(unsigned short));
$ n" ?9 O; X9 Z+ Y# i R; T! E/ d& \: G
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 $ ]& K6 g! [' V1 c$ z0 C
read(fd,&data_read,sizeof(unsigned short));8 K$ M9 h" \- j& m$ f+ X* C6 q; d
' Q" h% [* c" X9 s( K
if(data_read == 0x13Ec)* b. i3 G. V1 Z! ]
{6 D9 C% J; |$ n
% E9 n4 C/ A# H$ p# E8 z) Q3 e2 a$ h printf("data_read = %x\n",data_read);
8 J3 R9 O6 u* ^ }
% s2 j$ ]4 Y# G$ Y$ g
' R( U1 p% t9 ~ msleep(10);( L7 Y0 l2 j. }3 `/ k7 Z% ^9 {; H
3 m$ i2 h( r& K4 n8 G
/*
. C" N( I( \9 f% E ioctl(fd,1);
7 k0 K0 g: p2 Y. p9 x! i sleep(1);
( C* m" A4 Z5 q5 G ioctl(fd,0);
! v% F5 J! `) f! X$ h, ` sleep(1);
0 C( h$ [1 e. a# k( F; a1 |/ @# ~ */
) A3 [. @9 \) Q }
- c" y: V% H6 f" M' Y; X" k6 K* n return 0;# ]& @1 r7 ]- c1 ]# s# H/ t
% N9 M1 ]' m! e! r, g}
7 ~" j/ k3 e3 L: ]
5 K7 D1 t3 K, `7 S/ ?$ k7 @! `7 C多谢各位指教,谢谢! 急
5 t7 G. V, T' {6 l$ z6 l/ `; D1 H7 f8 o# w
% U, T* z% ^$ |) B; b
% t" s, V! N5 n/ a3 q
" j: J, ~/ R% A- a7 v+ C' Z- j$ |$ S& E$ i4 }9 j/ I
|
|