|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
6 ^6 E$ q. c( X; n/*
0 {: k" |( l& W7 [/ c6 x * Copyright (C) 2009 Texas Instruments Inc
9 C- L# A& T) c; s D *
( }" c& {: V# P3 m7 }3 h * This program is free software; you can redistribute it and/or modify7 {6 O! V- t; F$ j c
* it under the terms of the GNU General Public License as published by
( m7 H! U1 b! S) W v * the Free Software Foundation; either version 2 of the License, or6 j8 e1 r4 }1 e( U! i
* (at your option)any later version.6 R, _% b$ B9 W' @8 X
*
: K3 U2 p4 I, F5 V; \ * This program is distributed in the hope that it will be useful,
/ H1 Z B9 l& B * but WITHOUT ANY WARRANTY; without even the implied warranty of3 h8 a8 z/ \( N G9 w G* V) L
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the' {8 }+ g5 E" b; u& P* N: h
* GNU General Public License for more details.
/ h" w- K0 y6 w" K' Z *6 `; G2 O5 N# K) x1 c+ j
* You should have received a copy of the GNU General Public License9 B J7 [. r, P }% s. N/ [
* along with this program; if not, write to the Free Software. p! |9 c, M5 E0 }. H5 i( D
* Foundati
1 V( {/ O9 i$ j7 F*/
1 W; }6 L4 u' q4 M#include <linux/module.h>
1 E( a" k8 s: @0 s" _- e#include <linux/init.h>6 Z; G4 q+ z1 S8 Z; F
#include <linux/errno.h>4 E7 h e: \- C! l0 h8 k5 r
#include <linux/types.h>! x. f7 `: g+ w0 V5 e, V1 {0 H- f
#include <linux/interrupt.h>
# D, s' s/ H8 v& p#include <linux/io.h>5 j9 B7 g% X" d; ]4 @7 N0 F
#include <linux/sysctl.h>
( ~# h U; o2 Z8 `+ N#include <linux/mm.h>/ I# ^: ^5 u1 }3 \
#include <linux/delay.h>
$ ]& K) i. Z/ J#include<linux/kernel.h>
3 M/ s) w7 h3 _6 @ S# w" m#include<linux/fs.h>
& e9 x% @! Y( ?7 M! p#include<linux/ioctl.h>
) ]0 r4 Q6 [ W+ q#include<linux/cdev.h>
+ I$ |6 n; y( \3 p5 q8 Q* e#include<linux/kdev_t.h>5 I+ @$ l& J% C% O6 I6 H
#include<linux/gpio.h>
5 ^& E$ W( M% i% @#include <mach/hardware.h>6 ?- p g' k! n" j" c
#include <mach/irqs.h>/ r* E0 E! R0 Z! M U
, W0 v, L3 H% L$ E+ F4 H% D. x* C$ A#include <asm/mach-types.h>
- I* ?5 g# F3 x/ H6 e#include <asm/mach/arch.h>4 r6 J0 v( M; \
#include <mach/da8xx.h>. i$ k* P: O+ ] t) |
#define SYSCFG_BASE 0x01c14000
& _* a8 o* s! t3 L4 a#define PINMUX1_OFFSET 0x124 ) p# p" Y3 \9 @+ j, z% w
#define PINMUX18_OFFSET 0x168 & T4 [1 e1 o+ K% s5 d, s8 F& x# i
#define PINMUX19_OFFSET 0x16c: P5 A y8 N7 |5 Q9 D4 M
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
& L' c$ d* d" i#define RCR_ADDR 0x01D1100C //MCBSP1_RCR# c- ]4 A+ c" I9 m8 ]
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
) R9 c# D9 S2 z! H#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR, _) k$ Z2 b! l+ b _# q6 P6 f( a% x. @9 l
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
5 |7 C# X! ^ {
+ J r1 I% h2 N! v1 {( O, ]: ]#define DXR_ADDR 0x01D11004 //MCBSP1_DXR8 Y% B9 |! ]+ W
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR4 I6 r7 f8 x5 I* ?
//PSC
$ P, D% f7 N+ z5 N" q/ V#define PTCMD_ADDR 0x01E27120
# h) h& \" N9 G. I#define MDCTL15_ADDR 0x01E27A3C3 ~9 W3 d8 l, _4 F" n5 w
#define PDCTL1_ADDR 0x01E27304
0 O* u; `1 \1 Z, X! x5 {, C. T//GPIO8 direction
3 n8 T5 B% O" q6 Z& W( h#define GPIO8_DIRECT 0x01E260B04 S( x6 J5 Q |+ ~- g0 H
#define GPIO8_OUT 0x01E260B4
9 z% x3 Q7 Y! R5 P) S- F x+ j1 o#define GPIO8_IN 0x01E260C0
1 w4 G8 E/ F+ A/ O2 {$ _- [! o9 j, q( |# w/ C) Z& {
//#define MCBSP1_RINT 99
8 }- z, A7 P8 n0 D' x' z//#define MCBSP1_XINT 100
/ G4 q2 {6 X/ A2 E! V. `0 N3 f; Kstatic int MCBSP_MAJOR=239;
. X" U- Q& _0 y, Y) o1 [* e* x+ gstatic int MCBSP_MINOR=0;
, \$ G1 {8 R$ F$ F bstatic int count =1;
1 Y( [6 [6 }6 l6 z2 l; F `. F0 w; v3 @$ \
#define MCBSP_NAME "MCBSP-device"0 v0 k2 o2 V4 }& S; F
! G6 D6 q8 @+ C" h" L/ J
static struct cdev *mcbsp_cdev;- h n! f9 A3 h, o
static struct class *mcbsp_class;* C' Y* W, ]3 S! W! T- }; B
static dev_t mcbsp_dev;( i; Z) [) G' G, F
unsigned int DRR_data;/ }9 d z1 L) S. \) ~$ C
unsigned int DXR_data;
" u" i8 U: K5 N8 E+ e& bstatic int mcbsp_open(struct inode *inode,struct file *file)
; R' e- L, K, @; `7 z1 r5 j$ L* `{: E1 s3 x6 B, L( c+ H
- ~' C' O% E, ]0 d9 x, X
//interrupt enable,initialized9 q8 m0 ~( J) n% V5 ?
unsigned int temp;
' Q/ q% ?# q4 n2 x //SLEEP_EN(GPIO8[10])---01 i% `' m R+ Y9 r
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));! ]. ~' R5 F9 f- `/ s
temp=temp&(~0x00000400);
4 `0 z0 |( {6 h% @ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]% W5 |: q1 P8 a: y! Y3 f
//RESETn(GPIO8[8])----0----1& W6 w# L& Q: A& W/ e4 m
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));; q5 G" ?$ M! }1 ]) m- u
temp=temp&(~0x00000100);8 p1 l* C. H+ D1 d" H
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0, l. f. v# [4 v" j
udelay(100);
+ E" ], q6 }6 ^8 @* F temp=temp| 0x00000100;/ L. J& h/ n5 w' e" b% j
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1. ~* g6 N R" O9 c" w' _
udelay(100);7 I4 u3 O0 m- j4 A0 [
printk("open success!\n");
, _9 ]% _+ ]: } return 0;
+ W, e0 J8 N5 m) @- q! I1 k% p}2 u: c B' k0 F9 L5 Z
0 F6 t3 A3 D9 E" O4 B6 Y2 dstatic int mcbsp_release(struct inode *inode,struct file *file) e. n4 k0 i. q! M
{& O" Z% F% N1 \' E
printk("release success!\n");6 L2 ]+ c1 o# [3 Y/ @- A" M
return 0;
3 b3 H3 `0 }0 j, F; w3 j& G4 y}( S( B4 T3 Z, z, X" h$ I1 Y/ F
* `+ g/ q% H3 O+ D' E Y, fstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)8 ~) e; X. X2 V! P& f5 \6 u# T
{
& w0 H8 R6 b7 O) n+ x" k* W copy_from_user(&DXR_data,buf,len);7 e1 n1 Q4 c U- g
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); # m4 M8 q& C- i7 |+ T. m+ S5 P0 O
return 0;" j1 R3 K {" f
% z2 m/ u! F% Z) K) t
}" X5 a: ^% Q) v; B
: X4 `' j& h& Z: }9 B# Sstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
! k# Y3 X5 t. O! I$ X2 H. ~; t{ & L2 z) }4 z1 F- k: V7 v
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));! z0 J3 U3 e J9 F1 W j
copy_to_user(buf,&DRR_data,len);
( C7 ]6 v: k7 {2 d( x return 0;! I) V* r- z7 |, y* h) @
}0 n/ g0 a; o* B: }) p1 o! {
! [% v* u0 x; ^: e5 m2 d! H% B {- D c( K$ B# [- b3 D% t
static struct file_operations mcbsp_fops=
* q8 H) a& H m Z# O |8 U{
' c% t" J7 |) Z: z6 \+ Z .owner=THIS_MODULE," l& y! f) _( U, M7 v. S
.open=mcbsp_open,+ m. a4 O; C" @1 ~' \
.release=mcbsp_release,
2 F: a% G) B& c* Q+ b .write=mcbsp_write,
. V, P! z! }/ C* ^. r .read=mcbsp_read,
+ Z9 {) O' I0 U, b a$ @- {};8 @9 _; Z p8 A' s2 D# E# M/ p. d% g
static int __init MCBSP_init(void)9 }& M+ c/ f) x6 n' n. J" w b
{6 n2 a+ C( i3 C/ { Q) d
int ret; A+ ?* w' L/ X# J. m& M+ V5 z
unsigned int PINMUX1_REG_old;8 }& k8 C2 }/ J: v4 Y) Q% a4 E
unsigned int PINMUX18_REG_old;; y: B+ W% k6 X) o6 I: u' `
unsigned int PINMUX19_REG_old;
, F6 E2 ~: B- A: S. j3 b unsigned int temp; 6 R8 y5 H' ]1 f! [! C& }
if(MCBSP_MAJOR)
: `7 N/ P' U4 D9 C, j: L) S {
# T) t5 N# x4 N% _- q# G2 R5 W/ L mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);+ ?) j+ Z- g& v4 S
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);6 k" ]) F7 P: k- L
}
I3 }% {6 l0 C1 m5 \ else$ \. u. v8 R* n2 _7 {# H
{
! \" D* F( t& \: P5 ? ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);0 |# u* y9 v" N2 h: O$ L
MCBSP_MAJOR=MAJOR(mcbsp_dev);" T# [% f" Q# q9 E( J, Y
}
2 }/ r& D2 l1 i% k % N% H( [. G/ S5 C, `* j
if(ret<0)
$ d6 [% X7 {: M! U: [+ e {5 _5 t0 d3 l F& x$ N* B- x& T& Y
printk(KERN_ERR "register chrdev fail!");
' c" V5 z$ \1 c( W return -1;
- Z* P( e N: D5 t7 R+ X }
, l/ Y) L; z2 b) v$ L" q
0 X" i2 |: ~6 w9 m6 c- q4 R mcbsp_cdev=cdev_alloc();$ ^3 W9 U" [- G
3 e3 Y$ r, ^# Y% _' Q if(mcbsp_cdev!=NULL): E" |! }- n( r& ~% H& ~
{
% t& J6 z% E$ F4 w cdev_init(mcbsp_cdev,&mcbsp_fops);
) D7 H' O. B" c" p* G8 M9 Z mcbsp_cdev->ops=&mcbsp_fops;
6 s+ U5 [/ x" m6 ^, `0 N. T; ] mcbsp_cdev->owner=THIS_MODULE;# W( G n' t; b! L+ R2 }
' [- ~7 I- E# d6 y$ Z% ]- ?
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
! B) `( @( |7 p7 h3 L% I printk(KERN_ERR "register cdev fail!");4 j8 K6 B: L8 M3 j2 a
else
! a1 p. p$ q* Y9 R g, a printk(KERN_ERR "register success!\n");
c. h/ l4 ~# `8 L( H4 K }: G* D+ M0 v' y, t; u4 C
else
! k6 h! f) N) z: e$ c$ ] {4 H, @' ^$ W6 \2 H" i5 v
printk(KERN_ERR "register cdev err!");; W* i8 F, |3 e# u6 i- H& P* m
return -1;
5 D, J4 B* Z; z }# t2 m6 e9 g: \6 U1 u6 S
* X! k& K1 y3 m2 y mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
, j/ \4 k5 G/ w( a+ s4 A, X# G& m if(IS_ERR(mcbsp_class))4 }. J) `3 y' F k1 J" `
{
8 k: @7 [3 V' j, S6 I printk(KERN_ERR "register class err!");0 B$ D. h7 _* S+ g5 s# O! `, ~
return -1;7 I2 S2 ?- |# |; H. r; r" T
}
4 `. Z. ~+ s7 B8 r* F. [ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
/ ^" W9 [6 v. i( w% a
$ w4 A! a7 J W) \' _ //PSC
5 \0 g, w p3 r% p //add Enable MCBSP
. s8 L2 k7 S4 [% d% u. @ //test/ d! ]/ b6 J% D4 j1 J, K
temp = 0x80000003;
; i+ y9 y0 ~. _- v writel(temp, IO_ADDRESS(MDCTL15_ADDR));
& u4 C' `# k) U1 c2 q3 N9 G temp = 0x00000003;
: m/ N( |, a1 C W. p. `4 A) w7 S writel(temp, IO_ADDRESS(PTCMD_ADDR));& {, o* b& E" s+ `5 |- |
' m5 b4 N: p' A
temp = 0x001FF201;/ q' ~3 c. L$ }) Y' A4 K( H4 d# x( d
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
+ o6 _; [% C! K% q+ n' U
4 T, g* x3 g4 P9 K4 p //PINMUX ) k/ B. K8 ^. g
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,0 I. ?% m! ~) u4 X3 |
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
( g# \ [3 j6 D/ H; d `' b2 S9 s PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
* p# @8 k) F8 u( ?" p writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
1 x$ w1 z7 @ q ' g% p: t* Y% \( O
//SLEEP_EN,EPR,L138_SHK1,L138_RC
; ^1 ^' G- Q: E' ? PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
2 _$ K2 e* u( B* U PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; * `- B1 g3 v( r' }
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);8 P: q! U: }- g; t( J
' _6 _* ~0 ]2 U7 k6 o
//RESETn,L138_SHK2
, s3 p7 v/ \8 o/ H j+ [ PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
% _: |9 W6 N6 t PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
- D4 l0 z7 V- k; A5 G writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
; B2 S3 n$ D# d$ l5 L- V
/ u% m& C" f" j& V/ r 4 _* I; x' M; \7 K6 Q/ {4 z5 ^+ _. q
//SPCR Register5 e# u" h: t6 q W- ~( }
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- F) l; F4 R) _5 d temp = 0x03000000;//(DLB=0)8 n) A+ D1 \! V# C Y
// temp = 0x03008000;//(DLB=1)! I& V) U K0 R+ p0 u* ~. k4 l
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
; a; u6 P+ ]3 H' v6 f7 k x temp = readl(IO_ADDRESS(SPCR_ADDR));& c4 K& x/ ?- e4 G8 v
printk("temp=%x\n",temp);% `$ }; R, p0 \' y) z
7 y2 [, Y7 ^ x" f //PCR Register0 o6 W( j& x, t& n; S: O T
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
% ^+ h1 j* s% g- S: G' m // temp = 0x00000F0F;, g1 Y" @: j1 S8 k
temp = 0x00000B0F;
: U2 r8 C5 I0 R' f7 J8 s( T writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized 7 R( e/ A6 k6 l/ y2 ^ B9 A
temp = readl(IO_ADDRESS(PCR_ADDR));- ?' \# H ?9 D. _4 R2 C
printk("temp=%x\n",temp); + @. v3 f5 K' A% S) p/ Q+ F- D( {
//SRGR Register2 B% l" L7 {, C# `
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11; X2 v* d! ?+ D% ^
//temp = 0x301F000B;" A; D! u P6 s3 u, p: u
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
, j* U! m9 \( n3 P c# x temp = readl(IO_ADDRESS(SRGR_ADDR));8 _- f3 P+ X- t' q3 g5 F6 m0 D
printk("temp=%x\n",temp);
) y: k4 w; i/ M/ j; ] //RCR
& W b+ T5 Z z1 e, }$ a //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,$ J0 H" J9 l& @9 c
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0' J" L3 I. p2 G- v2 T7 `& Y
temp = 0x00440040;/ \+ z5 n* a6 k
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
- |9 L$ S' z5 A2 z5 A- Q8 R6 r temp = readl(IO_ADDRESS(RCR_ADDR));8 I; u5 Z+ J( N# R- J0 x0 E
printk("temp=%x\n",temp);
' x: `3 D! w) \+ h' t! F, Y //XCR
4 R: E% v! ?1 c$ N- \5 F //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
J! Q7 \$ \$ X) D7 d- Y& p# @ //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0) K* P; u5 X) g9 G: K$ U
temp = 0x00440040;$ x) c: g; d# f/ S( ?. w4 L
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
5 k* A( [, G. ? temp = readl(IO_ADDRESS(XCR_ADDR));
) \# N7 V9 l3 a; r) U printk("temp=%x\n",temp);, s/ r0 e& ~& [4 D
udelay(100);* i& m+ X% Y# r1 z# r0 Q
//SPCR Register
4 I1 H7 f9 e# H; l8 u //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
9 Q, U. T% D" `2 \$ Q& d6 h temp = 0x03C10001; //DLB = 0 VS DLB = 10 I1 i* M* b7 s: }4 Y
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled8 c1 X ]- k( ~6 w- R$ L+ z
temp = readl(IO_ADDRESS(SPCR_ADDR));" }# i. F. i8 G& g2 U5 _
printk("temp=%x\n",temp);
. Z* Q& B/ m/ v% S3 ^2 p udelay(100);
- a0 {3 y( T6 G4 K. T# v3 K$ z5 r% ^2 s% e3 D* C$ | x2 Q
//set GPIO direction
_/ N& @) M! `' X5 |; z- E temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));9 |$ ]5 u; x s1 g0 j
temp = temp | 0x00000100;//EPR----input
- \/ @9 i4 ]4 R9 j0 B1 g temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
1 f# C% Z9 S' Z# ?0 {5 l9 m3 s9 O0 g. s __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); ( z/ t! W9 W8 W4 P
8 t% t( u; \0 a" h: ?
return 0;5 H, E% v; ~4 ]9 I; K$ ?4 G
}
Y7 x8 B. _% U) ^3 j( i. mstatic void __exit MCBSP_exit(void)
4 D' o" @- A& Y5 T3 P{: B! \9 Z: O: _, z# w7 z- n
printk("mcbsp chrdev exit!\n");( n) ~( }3 w4 e' L" _, V
cdev_del(mcbsp_cdev);7 {" Q# b* c* e- b% T0 \! v" S1 }
unregister_chrdev_region(mcbsp_dev,count);
% m, z2 Y$ o9 E% C2 g& C0 e device_destroy(mcbsp_class,mcbsp_dev);1 n' Z4 Z+ p! }; _! G( S
class_destroy(mcbsp_class);8 N L. w/ F) g7 g- i2 C4 d5 q
}
$ b8 U+ H3 \) j! {+ G Bmodule_init(MCBSP_init);9 [8 |+ ]& A; \$ |9 u6 a
module_exit(MCBSP_exit);! h# U& G0 D' H n" }
$ m1 C4 ]* I) b, P: N- PMODULE_LICENSE("GPL");
* \1 l1 H! O( k3 ]# F" f6 |
. T4 r7 \4 y* r1 a# h6 H' b. M- T我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。3 ~4 ]. f8 b1 M4 ~
我的应用层的测试程序如下, r% P1 {3 Q/ D9 }
#include <stdio.h>
9 d! U* z Y- e+ l7 e, W#include <string.h>! a( c. _. g. S0 a" k* n# @
#include <fcntl.h>
" a" k5 `, y" d#include <unistd.h>. b2 X E# u5 d! T( S8 W9 D
#include <signal.h>) U; H% B( U' R5 |$ H" N. M4 q
#include <pthread.h> //线程 R0 a" `9 l+ a" _/ y& @) s
#include <stdlib.h>9 Y- N/ Q" e* I5 r6 Z; Z7 Q
#include <pcap.h> //捕获网口数据
+ K( A: R; a1 M* m& X- R% @6 y2 F#include <semaphore.h> //信号
- \% y. I; v% A1 R3 Q6 j#include <sys/types.h> //消息对列
5 r7 j8 P# B( J6 `5 L, R#include <sys/ipc.h> //消息队列* @4 ~. w- Z! H5 S
#include <sys/msg.h> //消息队列6 O, G" }8 U X" S
#include <sys/select.h>
& e/ K7 B) ]% |8 M8 Z( Z0 ]& ^- W#include <sys/syscall.h>
1 i, y2 y! w; M2 Y) U" c#include <sys/stat.h>
* i2 e6 r9 F" n) b2 j5 o#include <sys/mman.h>
/ W7 J4 q+ u! s6 R& @! d#define msleep(x) usleep(1000*x)5 }3 b* q1 `1 m. i
( n4 ?1 m7 c3 }* z* Y+ uint main()1 _ A2 w: U" D' J$ ~
{
5 ~, G# d, `6 f. |) z9 [- b, w //MCBSP,ARM与AMBE2000交互设备- w" g) W! w( I, e: _1 m( Y3 [
int fd;9 d3 `5 l2 o: `8 L
unsigned short data_write = 0x5555;
; s+ ~: q9 ?4 I8 U unsigned short data_read = 0x00;
5 f2 I, r, S/ f t ~4 J+ ]$ H fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( F9 U' M3 g1 y9 ^
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 ]8 S, L9 Z4 c: ]$ V; H
; |) j8 s+ h7 E if(fd < 0)1 m( M+ T z- C3 I O- c' r
{3 t6 P' P- s* k1 R3 `
perror("open failed\n");
# ?7 l$ I- x/ r& ^! V" y0 Q return -1;
& F; K5 R/ f0 b( s% x }
5 [9 Q1 S; |8 N0 W" E3 B
) N4 r( U4 ?+ g% X while(1)4 O& h+ Z+ ]0 _: @0 P
{
3 A. k$ p6 D0 H0 ?. l# \
2 m8 u. r2 j# W //AMBE2000每次读写是24个字为一帧
3 r4 l( z7 \2 n# @" p% x4 C! d //写数据时将数据在底层存储起来,等到中断的时候再发送
: ]8 l" b* [' q( Y7 W/ U9 _+ A //AMBE2000输入数据是以0x13EC开头的
! D: L8 i& J! ~) m; ?. Y1 G write(fd,&data_write,sizeof(unsigned short)); u" v" z! J+ u+ m- _1 T9 z7 O* O' n
# L: y! N8 q- @ //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
3 {" l m. |: ?# y [ read(fd,&data_read,sizeof(unsigned short));0 o: ~2 P8 i; l3 x- C
$ R- b( ? V: g* m) H& z if(data_read == 0x13Ec)
: `! @$ T# Y+ a f {
( w2 p$ A+ T# y6 e& J* O# `
: v6 S7 l. `" L8 c& u printf("data_read = %x\n",data_read);
* C7 W$ J" x4 v5 K/ V }3 V- c( t; l# _ |$ g3 @( q
' A) j3 i3 w& l: ? I K msleep(10);- D3 r# _7 S% y8 ?* u
" Q$ j2 Y3 J2 u% x7 Y O9 Q
/*! o( H( F4 O, R
ioctl(fd,1); 7 [3 B* F0 L v. v
sleep(1);6 e4 E2 U9 H9 h# [& e3 l
ioctl(fd,0);
" R8 a9 e; R$ h# t5 r$ S" _ sleep(1);
( s& m! x( S7 u */
+ K% r& y. F, l$ K" X* k9 v3 J } # _8 f- n5 O, z6 r2 `! m M; Z
return 0;. s2 w8 r7 |, X
6 k6 U7 c B; w$ [; h7 j/ d2 S
}' a, |3 r6 |) U: T% p. g
- e2 q, ?; u _多谢各位指教,谢谢! 急
i8 E. b( Z7 y' w' Z) K. `8 Z2 y' B
4 {2 Z; v( D8 E8 r% a% O2 V
& d& W. E# K0 a C/ h
" c6 \* S7 @& [. S$ x5 B% K
1 i" L0 ^6 a) d* }- t6 |7 u |
|