|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
4 K6 u! S8 r) A/*
$ a& k: n5 q" ]7 z7 ~0 x * Copyright (C) 2009 Texas Instruments Inc
2 t6 z/ l$ L+ X9 z' m: D *8 v1 P; H5 X( r
* This program is free software; you can redistribute it and/or modify
& r% J0 S. N( }6 k0 r! V * it under the terms of the GNU General Public License as published by. e/ I; e/ x8 C, o9 O' S
* the Free Software Foundation; either version 2 of the License, or$ m. U) R' `- U
* (at your option)any later version.
8 l- z7 S6 T g" k* i; f$ x *
7 @2 h. n( {6 E7 k * This program is distributed in the hope that it will be useful,) U) W# ?1 P* K* o
* but WITHOUT ANY WARRANTY; without even the implied warranty of) ?; b6 k/ U; p" p
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the0 O' i% B5 D; S' @' ~- g/ q! ]- X9 m
* GNU General Public License for more details.
2 |2 r$ J# Y+ d# b, y% t$ v *3 f& h: J, U# @
* You should have received a copy of the GNU General Public License2 R, X& H" z/ K8 ~& X$ `* ]9 |) v
* along with this program; if not, write to the Free Software
+ H5 C0 C/ n! u: @% O/ y/ [6 | * Foundati
' `+ U! ^( m! U! v*/
3 F [) I; R% e5 H7 O& F0 b#include <linux/module.h>( Q, p# D: a/ D# _" J$ ~" `
#include <linux/init.h>
) P2 E4 k3 Z7 v0 y#include <linux/errno.h>
) [& Q3 \; K e" p#include <linux/types.h>3 e0 l( R! f1 P; N$ p/ b+ f' X( H1 I8 W
#include <linux/interrupt.h>
! u( w) P" |8 n6 o" l4 s#include <linux/io.h>1 ~6 E% ]8 J& Q: k1 J/ G* x. E
#include <linux/sysctl.h>% s: _0 X# U3 G# I5 H
#include <linux/mm.h>5 H2 ?: D* T2 E/ |2 i* h
#include <linux/delay.h>. {9 s& `2 P" s! _% I* O
#include<linux/kernel.h>, I0 ^6 g( P0 Q) R# I: j; x
#include<linux/fs.h>7 g1 b. ^" u R
#include<linux/ioctl.h>) s h+ v' w8 r$ ?* _' Z3 A
#include<linux/cdev.h>1 y+ X% `7 Q. o
#include<linux/kdev_t.h>
$ s7 @3 H' Y N" j5 \. v, Q$ p8 i#include<linux/gpio.h>% n# a6 h2 ]# |. ^, H0 G1 i4 q2 F
#include <mach/hardware.h>" ~; J% C# M; U2 g$ ?( g3 a! |
#include <mach/irqs.h>
m5 C: ]) v/ Z1 u/ f4 S9 q/ |
+ Z& m5 m% L, Q8 U6 x#include <asm/mach-types.h>
9 y% N( z, P! r r#include <asm/mach/arch.h>" \; C6 Y7 f$ g$ D6 [9 m
#include <mach/da8xx.h># e8 H, W7 I: L2 c+ a
#define SYSCFG_BASE 0x01c14000
8 h5 F9 g- {8 P2 C! Q#define PINMUX1_OFFSET 0x124 ' X4 g( O/ C! i5 G& s4 s
#define PINMUX18_OFFSET 0x168 ( {" ?% @1 @" L6 u5 }+ j/ @$ }6 B
#define PINMUX19_OFFSET 0x16c0 \% S r4 v" c4 Y& u
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR) t4 D& D# P. E! [ X
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
9 f0 L8 M2 k8 P8 s. ?; [#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
" W4 K2 n' V' y1 W3 w, _, ~#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
) z; j0 l: m1 \5 _2 i0 Y3 A#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
1 X. h! f& P5 O: S+ ~. s5 v" i
" u' @: T3 X7 C" w#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
' x% K$ V7 N e#define DRR_ADDR 0x01D11000 //MCBSP1_DRR* t8 W' E# O) L9 c0 |
//PSC
3 {" M" x7 U; N#define PTCMD_ADDR 0x01E27120
, i; g' N# S8 \; b8 H3 r#define MDCTL15_ADDR 0x01E27A3C
4 P b( v) L8 n' J& J/ e#define PDCTL1_ADDR 0x01E27304
$ D e+ n" Q P0 Z7 I/ J//GPIO8 direction5 R+ U/ k, B+ W! @, D# {6 o
#define GPIO8_DIRECT 0x01E260B0
0 B! z$ ]; ]8 y3 d+ \#define GPIO8_OUT 0x01E260B4: J! u) V) i# t9 d
#define GPIO8_IN 0x01E260C02 L. ^( L: N" R3 q& V' y$ e' p4 `
& _& y4 `* ?7 w6 {3 ~1 M
//#define MCBSP1_RINT 99 2 t7 q# l: t) T
//#define MCBSP1_XINT 100 6 O3 b+ Z+ p( D( d4 P
static int MCBSP_MAJOR=239;: `. s+ F A# x8 H6 r. M
static int MCBSP_MINOR=0;/ s- X2 j+ v8 r, g. S
static int count =1;
: h( k7 G" m- C9 U; M' ?& j* ~
% y" D; q, ?5 g#define MCBSP_NAME "MCBSP-device"
5 A4 M$ q5 N! n8 V5 {) d: b+ w5 l0 {; j. E! g5 z
static struct cdev *mcbsp_cdev;+ z l* A. y5 i: ~
static struct class *mcbsp_class;
. P( ~- P2 u8 H7 J! w- Gstatic dev_t mcbsp_dev;4 ^# L, R; T$ f K( {
unsigned int DRR_data;
h: d% a) G k) @unsigned int DXR_data;
/ e/ G/ C. u6 v# _static int mcbsp_open(struct inode *inode,struct file *file)
" j3 n* l5 [& @1 I{1 [# G& {! r) _& ~
L/ R/ w5 E9 B! \' H% a
//interrupt enable,initialized1 b3 `" x; }* ^# i- }
unsigned int temp;5 H- J1 P5 y1 S/ K" x7 G
//SLEEP_EN(GPIO8[10])---0
. y7 t, H6 G( ~. w7 x! c% d temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));% x3 e) f8 r3 S5 [- d- l
temp=temp&(~0x00000400);
+ f, Z F7 Y( c2 s$ E% v# G __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
, V' D3 J" x# j* g# O/ p& L //RESETn(GPIO8[8])----0----1: A7 |9 c5 [$ O
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 N5 ~1 |) Y6 m5 g- r
temp=temp&(~0x00000100);! W- d) O- `6 b% c) f9 i2 i9 J
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 @. ~# A' X* N+ c+ U. C$ x: f \
udelay(100);
' u1 w( d; S" [( P, d temp=temp| 0x00000100;
6 s+ \: @6 q" r' N7 C0 r, w __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
7 L$ v: k$ i5 \* v: v% ^8 K) g udelay(100);
8 v: w5 I, w" f/ n! o9 P) t. [ printk("open success!\n");
8 _" g8 k! b; K+ l7 ^1 s |+ } return 0;3 Y8 z3 `5 @( Y5 @7 _+ S8 C! l
}
* ]; Y+ \: D" a8 M7 K0 @; s
. ~4 j! N3 I" U! s/ astatic int mcbsp_release(struct inode *inode,struct file *file)' x, \. v3 O- _5 g3 r, s
{, n& |( u1 J. j, V3 O! `& |% I
printk("release success!\n");" M: c3 _( g, s0 D% a
return 0;
: T% Y! c( f) Z: ]3 o3 g- [}
) D% r3 c+ ?; Y9 s8 e$ J
: Z7 H. j0 L" S! b- K" pstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)' l% c: m8 `* Q. R- e
{8 r1 N2 Q& g3 }$ x
copy_from_user(&DXR_data,buf,len);
7 ]1 c: J* k7 Y6 ^$ M iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ' ?& }& i: x4 ~+ M
return 0;; Y0 y! I- j/ A- z+ @) Z: S2 j
' w2 [! p e7 c) q' y% i
}
3 ~( q2 y, U& _: b: G
- q" R& v2 V0 lstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)3 g; [0 A+ i5 j" N0 ~8 n3 {0 G# o
{
7 t. J- D; O* y' } DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));5 B, b* [3 Z( p+ f9 e" L8 [
copy_to_user(buf,&DRR_data,len); * e+ M% _$ @# \$ R* e" u
return 0;
$ F* W z* D) m$ E0 k}0 p) R/ }7 }- h0 ^" f" V
* q- R* L! j9 _
7 @$ i0 Y: a& M, L- zstatic struct file_operations mcbsp_fops=) @7 T- K/ t# F. `: i( V
{
7 [" p* E3 J) R" S .owner=THIS_MODULE,9 k3 [- j. A9 d; G/ P' _
.open=mcbsp_open,
# `' i* X- k# a) W .release=mcbsp_release,! j. `+ y- @( ]% S2 ~& q( y" K7 Y
.write=mcbsp_write,7 L1 O" J; X* U' \) }; w
.read=mcbsp_read,+ q" x' B1 B1 w. v9 u
};
/ e4 F; R7 @4 V- h6 Cstatic int __init MCBSP_init(void)
$ B+ }/ P% ^2 j- {4 ~3 ^# I{2 d' Q5 _% _( s: j+ F" x* _: P# t ^
int ret;
! A3 O' @ X2 V0 y7 k0 c3 g unsigned int PINMUX1_REG_old;: C" L* f: M( \5 q7 R! _
unsigned int PINMUX18_REG_old;
! a$ t& M; B) ^ unsigned int PINMUX19_REG_old;
: y) O$ ?. ]4 y- m, |% G unsigned int temp;
) U' H" _! I8 q/ U" r" J if(MCBSP_MAJOR)6 E6 N& L3 g3 G, [
{
2 t) K6 I4 }- _7 E1 C mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);4 z5 M& S+ N3 F6 r
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);% r& N. A8 O5 n5 o
}
5 F: ^8 V W& @% l else8 C. l: G! _( l: Y
{& @" N6 M/ T; V( j4 s- W2 G' _9 g
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);5 s9 r( p. B r g0 b6 v
MCBSP_MAJOR=MAJOR(mcbsp_dev);4 i' g& J8 M- G5 K. k
}
! x* p# _; c) J
6 @5 X5 o0 V+ N+ a if(ret<0)
0 j6 L" E8 }; _; O8 M; h% r {
4 {6 Z" ]6 _% X% W8 h2 X printk(KERN_ERR "register chrdev fail!");! B5 s% P6 ]8 g H5 Q2 S
return -1;
" r* N# e4 g$ o }
6 \3 J1 [. |1 X
2 b. i7 x! \" I9 C mcbsp_cdev=cdev_alloc();1 o2 v0 U, A' c3 X" `- C6 s
( T3 v! m" C7 B" v+ Q. S
if(mcbsp_cdev!=NULL)
0 B6 \) @* N" g. R/ c' j) e+ Q: B {+ L/ @1 ^, M4 ~2 j& b
cdev_init(mcbsp_cdev,&mcbsp_fops);& f5 [, h3 h" X4 n. q$ y
mcbsp_cdev->ops=&mcbsp_fops;
3 \% Y, @* l; G2 j6 X mcbsp_cdev->owner=THIS_MODULE;4 ^% n% a1 w2 i3 [( }
( L4 ?( v. T# Q, K6 G Y
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))8 v8 l4 c |- A9 \' G* O
printk(KERN_ERR "register cdev fail!");) l( T7 p! E: N
else) H4 \1 H& T& v" M* `" }4 b8 {
printk(KERN_ERR "register success!\n");7 z X; q0 Y5 q% A/ `, [
}+ g: b; h' {$ d7 p
else. ]' E, N: c% w! l( U
{
3 X/ h2 L1 M& L4 ?% r printk(KERN_ERR "register cdev err!");
|( A4 b5 S/ n/ R! q return -1;
: h- v6 @( T1 } N; c: S }
. R8 l2 I, A; i! Y: H$ p2 Y 4 J1 h, b( P9 M" Q" s1 E Q
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
) o/ U+ r2 f* {- f& W% c if(IS_ERR(mcbsp_class))
/ j/ x' g: E% \ {
& M1 i# X0 j3 F$ x# a' i4 N printk(KERN_ERR "register class err!");# U+ N4 R- Q) A& p
return -1;
' r7 O0 N- t. |) [ }4 o3 M7 |: ~- J6 R$ g9 r/ D# ^" N
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);- P' b0 B5 k/ E+ u4 p/ D
6 b1 ~, ?' Z& M- n* R8 \ //PSC1 g& } ~3 X/ f4 S. Y
//add Enable MCBSP
* T" R9 Q* k4 `" U //test
5 a& H* O1 V2 e$ q, u temp = 0x80000003;, Z! y \0 Y" ?% C: n w
writel(temp, IO_ADDRESS(MDCTL15_ADDR));. h+ K$ x: O* g1 Y0 N B
temp = 0x00000003;4 B9 L/ O! n* Q
writel(temp, IO_ADDRESS(PTCMD_ADDR));' E" S* v5 Y( Y# Y1 `" K2 y
! H0 j( R( X- A6 ^; D" a
temp = 0x001FF201;: p s: u i6 b5 u( n: _0 k
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ E6 _( E6 e9 h3 n$ Y @# y5 { / o, E4 T! Q6 z& ?: P
//PINMUX
" H6 w$ R" f2 R, r* Z! C //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,/ L( C, l4 T/ D
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
$ W, N' t, h0 z- D. O( \2 t PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
' B& c) K" O! |: }' w. B; h writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
, W o( k& p+ l1 M( j) J& p) r
: g$ [) s" }5 n //SLEEP_EN,EPR,L138_SHK1,L138_RC
; _3 }, ~% Y, p) s& S PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); " D, _7 \* q4 n( n; e& j. D
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; / c3 G* m, e% c: Z# k8 A
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);) I0 v- {/ ^% ~
; d' c5 M; ^' \7 p J: S, u+ e
//RESETn,L138_SHK2
! u$ \" k* K+ k" |' E PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); + Z3 j" a& e) M9 _; s
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
$ k) Q' {4 G/ {( I. b$ a! ^ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
: W9 U: ]0 l1 f" s c% V3 G2 _ 0 X+ k5 ?( U: l8 ~' i' l
( U' }, G8 A' U, L" K8 @; l //SPCR Register( {# x3 S' T! j& S9 T
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset, u& @) ]* N1 J5 z: p
temp = 0x03000000;//(DLB=0)
# H1 H3 i5 }4 J: \3 H // temp = 0x03008000;//(DLB=1)/ d! I% Z; U3 w, [- Y/ P# z
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset' C6 x: ]( w2 K+ ^. d
temp = readl(IO_ADDRESS(SPCR_ADDR));- X2 O1 R3 ?+ T! ?' i! l
printk("temp=%x\n",temp);
7 d: y' @" O& d6 e, M( I x2 H / s# V) @% H; W. @9 d
//PCR Register2 r$ ~% ^0 p( H& ^+ |$ L
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
( a* @1 m4 o( e8 m // temp = 0x00000F0F;
* j( D/ W, ~& P$ P temp = 0x00000B0F;( h7 b2 \% j& g9 D a
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized : P, S# s& f0 o( f& s3 U) x
temp = readl(IO_ADDRESS(PCR_ADDR));
3 X- D3 r/ v& S4 U+ `* E printk("temp=%x\n",temp);
9 G$ ^* I, m0 g: |5 c6 a( w //SRGR Register
+ W$ x$ g4 k/ N. D //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; @6 m) U7 | b/ o5 A# C9 X2 d7 i
//temp = 0x301F000B;
) ~5 C2 S4 U( {6 D2 X writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
2 `; g( \" x1 d temp = readl(IO_ADDRESS(SRGR_ADDR));: o7 v2 P" G7 X& c$ e! u( l
printk("temp=%x\n",temp);$ `7 n1 \2 K+ ~6 d; o* n& N
//RCR
3 U g& v$ U6 ~! c. `- {2 } //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 |+ n% O8 x/ v% g //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 N, p' b! f7 g: C8 c% Y
temp = 0x00440040;; ^/ j9 \# [& ?
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
" K5 s$ O- q+ a/ m temp = readl(IO_ADDRESS(RCR_ADDR));
3 t& `4 r# o$ s( g |( O printk("temp=%x\n",temp);
: `' g: Z4 k7 Z7 X/ L //XCR
, C. G# C( I8 R //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1/ {. }) u; [. j0 I$ P5 P6 ]9 i
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0# z& X4 `" q) o
temp = 0x00440040;: y1 b; r# H4 e/ a1 Q4 w
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized , G5 [# ~% c& P( `" n8 G
temp = readl(IO_ADDRESS(XCR_ADDR));1 M3 P* q3 ] V+ ?. P5 O, J
printk("temp=%x\n",temp);
' J: t6 c( _0 o" [$ S8 h. } udelay(100);) C& v: |6 `. `4 S8 d1 k6 Y
//SPCR Register4 K8 w5 c R4 v U: K6 J4 X
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
7 k' ^+ ~2 ~5 R4 r9 y temp = 0x03C10001; //DLB = 0 VS DLB = 16 x' t5 ~ h: F; v2 Q2 s' M
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
' n1 M* S6 w" r. s- c( q4 f6 S! M& x temp = readl(IO_ADDRESS(SPCR_ADDR));
) Q; w( X# q+ T3 P printk("temp=%x\n",temp);
; |/ S+ A/ u/ s( K: @; S udelay(100);- \8 _: C0 k# p- e% i
7 A0 \0 R" Q: w- r //set GPIO direction
6 W% E- r5 f( p( [! f: d4 U temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));) f2 ^! F! q: @& z
temp = temp | 0x00000100;//EPR----input8 F1 x; L2 ] g0 _
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
8 K; f$ a' `. t+ P4 K9 G5 B; A6 T __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
2 ?, |$ t; V: ? . N! {) R* T# @8 {* T0 o7 c) J
return 0;# J' {" U8 l" X/ R; H! ?! D
}; z/ i9 d, T" o: u' [! y" r
static void __exit MCBSP_exit(void)
3 L/ ~4 n0 s. d3 ^' ]# y8 }) c- p{
! a2 K# c4 l, W' k, x* z printk("mcbsp chrdev exit!\n");
" @; ~' i q2 J8 N4 W cdev_del(mcbsp_cdev);
7 ?3 I6 r$ h6 f7 p2 ?; u$ r4 j unregister_chrdev_region(mcbsp_dev,count); x4 m1 S @; ]
device_destroy(mcbsp_class,mcbsp_dev);$ ^; I$ i- U+ a( q& \ C2 P" ~
class_destroy(mcbsp_class);- I' @) J# ~* E
}7 R/ C" w9 G$ I X% J, I4 y W
module_init(MCBSP_init);
9 q3 ]1 [9 _. O. o% F6 j7 o7 |7 ]module_exit(MCBSP_exit);+ L9 }$ s( [1 p6 x% F" t, v
) i9 _3 F. |, h3 @/ L. H
MODULE_LICENSE("GPL");
! J+ l4 h% c6 z) [2 I7 e: a% L
3 }5 m, |' ~% Q# ~. L我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
" P% r& b _/ D1 W, a6 q0 J$ T我的应用层的测试程序如下, T4 n1 i# D4 b& @
#include <stdio.h>
) X4 F# g* \" k9 \+ X5 ?$ I6 P* q' Z#include <string.h>! c5 ^3 V* [3 y% P( [
#include <fcntl.h>$ V. p" \3 a) g
#include <unistd.h>) Q8 F, j4 K+ x2 `9 H; @; [
#include <signal.h>/ b; M: q: D$ [: |/ h$ L" U
#include <pthread.h> //线程
8 W8 u' E% A; b) p/ O7 I1 t#include <stdlib.h>
4 M! r) m U4 p#include <pcap.h> //捕获网口数据) c; j3 M7 T5 z$ H
#include <semaphore.h> //信号
3 ]2 {2 b$ J5 k2 u+ ~1 e, w#include <sys/types.h> //消息对列2 x k1 l/ }2 j6 y: Q# X2 } @; \
#include <sys/ipc.h> //消息队列8 @" R% V4 c9 R6 X
#include <sys/msg.h> //消息队列8 u* ^: T* Y. _: C9 e( i
#include <sys/select.h>
+ b& u1 ~0 h% q#include <sys/syscall.h>
# x- s$ b, d" e5 N& M& A: n#include <sys/stat.h>
7 {$ G6 G+ M: V _#include <sys/mman.h>0 z* w6 E. Z! e3 ?0 a' m2 _4 u
#define msleep(x) usleep(1000*x)
5 \ F6 P" a0 c: w0 @
% U) I; f0 K1 \int main()5 u5 }& L9 E* O! ]
{ $ p% }1 n: O2 N* M
//MCBSP,ARM与AMBE2000交互设备
7 D* ^! X: J8 O% N9 `4 Z$ h int fd;" l: r9 \. L% k) i6 W
unsigned short data_write = 0x5555;0 |1 C x+ n$ ?- x& T8 r
unsigned short data_read = 0x00;
" p5 v# P& j- q1 t' d fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
! ]2 Z) O- J2 _+ ^ i4 g+ G- Z // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC); s4 p5 U* d( h# ^
. ~. C0 y1 b5 {+ } ^7 _: Y4 y if(fd < 0)
+ w9 I" p7 U/ n5 F {( r. G/ j% r5 c% F8 p* f* s' G
perror("open failed\n");
4 o& e7 q% }# k P return -1;& o1 ]* Q" i: I+ c0 H) p. A
}) C; `4 ]! q+ M2 K
. I2 j- ^$ o& C6 j$ R O: [
while(1)
6 {* Q, _1 V T5 @ K0 H, X# e {% B$ ^5 k* c2 A$ i
, A& z* Y. R1 a0 Y //AMBE2000每次读写是24个字为一帧6 w1 }- X$ t: i/ }/ y
//写数据时将数据在底层存储起来,等到中断的时候再发送
9 L" x" q' t- \3 X //AMBE2000输入数据是以0x13EC开头的6 f0 i7 h3 {0 ?( \
write(fd,&data_write,sizeof(unsigned short));+ |( q( ?5 G8 y0 M$ |: W
% i& Z* J$ `# E& e, q //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
; c1 J7 `8 l3 {1 J6 `, p# G read(fd,&data_read,sizeof(unsigned short));5 ^/ G( E, z! K; B: @) n
; E" U( |. N5 Z* m" y5 ? if(data_read == 0x13Ec); F9 P* B/ d- A Z* \0 j5 p
{7 _' t3 B; B# b7 Y2 I
) E8 D" V+ o8 z( z: I8 y printf("data_read = %x\n",data_read); l9 w5 ]% C$ u& H4 S
}
1 q6 @+ H- G! J5 o# }! V E% l3 T
0 r9 q8 i0 Q& h( e7 f- u+ P, L& m msleep(10);; [6 |1 N2 u/ }& e# |
* M9 T9 E) x7 |+ h /*
0 e- L. b9 O/ A3 _, Q: t, [ ioctl(fd,1);
7 }) e7 M. f+ }% V j* b7 I9 d" N sleep(1);
+ V8 [- {( Z9 ^1 h) Z3 e+ K ioctl(fd,0);, N! O6 d, ~6 M2 L
sleep(1);$ F7 ?7 ?9 Q, P9 h
*/
! C8 D( u+ C h% @ } & S% y( w* U* y8 T
return 0;
4 s2 o5 z. v& B ' {' c; T! }/ Q1 u
}9 S8 ^% `* }4 T
0 }! ~# D- o7 r, d) i8 ~( A
多谢各位指教,谢谢! 急
/ r: Y- ]1 X$ Z9 Q+ \% H2 W' {. d4 x& G+ G! o; V' j* ~: Z
. t8 j. T9 ?# ?. `6 T* v( h& Y+ S- m3 I5 a( Q
; R9 V5 r' z8 U# {% n7 f1 j9 r0 b( ^/ ?& B
|
|