|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: % M5 y4 \5 V7 [
/*4 W7 Q7 `- O+ p! O
* Copyright (C) 2009 Texas Instruments Inc
- j- u ]: s: ` Y4 G1 j" k *
& ^8 v9 i- Q: D) I3 { * This program is free software; you can redistribute it and/or modify- z6 K4 ^# c; g, P3 |; J; U5 q
* it under the terms of the GNU General Public License as published by
4 r" ]( e2 L5 N; J! U, I * the Free Software Foundation; either version 2 of the License, or
% ]$ T- D, D3 K3 S5 A+ t * (at your option)any later version.
( q' U- w: [/ ?; S( j9 Y* ^1 x *
5 V! x9 o2 p8 P, i$ h; c/ e9 Z * This program is distributed in the hope that it will be useful,. a' \6 c; l# _. @" [" h
* but WITHOUT ANY WARRANTY; without even the implied warranty of$ j# R0 P. @! X8 ~, ~3 f0 Z
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the4 a$ c. u3 E% [+ M ^* D u
* GNU General Public License for more details.8 _& {" {% M" R# ^( `" Z8 F
*
3 X) Q( k( H/ _+ n6 }7 k * You should have received a copy of the GNU General Public License* j/ N8 t. f$ I3 ~" x. d) k: X
* along with this program; if not, write to the Free Software6 |! t0 K9 L( y% D$ K& X4 {
* Foundati$ [# v) M/ z. L' y& X, a
*/& A g3 n7 `# ]" V9 e& m
#include <linux/module.h> }/ y. Q# B _0 c' e: {' ?
#include <linux/init.h>/ ^' v/ B' |& ~& X
#include <linux/errno.h>
4 F* i7 S! J0 p#include <linux/types.h>9 W/ D, t0 F# y, l# U8 D7 N+ M& f
#include <linux/interrupt.h>) l: i: v. ]$ {3 K+ b
#include <linux/io.h>
" a2 q3 l, {% d" o5 i/ O#include <linux/sysctl.h>
: v6 Y c5 q1 @1 b& q#include <linux/mm.h>9 H" J! Q- o+ K9 ?5 v+ X
#include <linux/delay.h>
* R/ v [0 ~: U/ f3 ~#include<linux/kernel.h>* ?! J- `* u/ Y
#include<linux/fs.h>
$ d2 r# P8 R/ F+ t#include<linux/ioctl.h>
9 D% x) Q. @2 ~#include<linux/cdev.h>) ?" O( [, v" V4 F2 |$ \
#include<linux/kdev_t.h>6 e; E b( j8 W7 W& }
#include<linux/gpio.h>
& @' H/ S3 c* a( v0 }#include <mach/hardware.h>
$ V4 A/ e& q, _#include <mach/irqs.h>
* m. ?& m0 m, N- B. Q/ o4 l
$ o$ C8 }5 t- o3 i) \#include <asm/mach-types.h>9 t/ \$ c6 n' @# q$ l
#include <asm/mach/arch.h>
% N, i5 O# Z+ b; o#include <mach/da8xx.h>9 y/ _. F# \0 ]- n8 j. m: o$ e, V
#define SYSCFG_BASE 0x01c140006 w7 _: T. u# A: D0 a$ n5 K
#define PINMUX1_OFFSET 0x124
4 j' I* B o- T0 q& P9 \#define PINMUX18_OFFSET 0x168
4 V0 q; R+ ]4 ?' V" r8 k$ s/ u#define PINMUX19_OFFSET 0x16c% U& [6 _* U% U( u! F3 R+ @$ o
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
1 {; j0 h- @% K2 _. J. Q#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
, A9 ?) j0 x/ k8 T" E5 c( N#define XCR_ADDR 0x01D11010 //MCBSP1_XCR. g3 g! R ^! B5 O
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
2 `, X& g! k/ l* z: C. n#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
6 P Y# E7 t) |3 R5 f, H + Q5 m D5 O) ]' D
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
. A/ H: s0 ?1 `! J# `#define DRR_ADDR 0x01D11000 //MCBSP1_DRR5 g5 a' a- u7 g$ V
//PSC; X. e |. B; k
#define PTCMD_ADDR 0x01E27120 & D7 [9 Z( S9 L, |) f8 {3 w/ h& g4 P- d
#define MDCTL15_ADDR 0x01E27A3C
6 Y; T% C; l! T2 d4 m1 [/ j$ ]#define PDCTL1_ADDR 0x01E27304
8 e7 ]' u0 b" b! |//GPIO8 direction
/ I! G" \' X; T$ X* }! [& }: b#define GPIO8_DIRECT 0x01E260B0; p1 {/ x0 T9 \6 C3 e. T
#define GPIO8_OUT 0x01E260B4
5 v# q; S# K. J$ p& ]#define GPIO8_IN 0x01E260C0) w3 X. j8 h, T4 o) t
& [2 K- Y1 h5 p: N' |( `
//#define MCBSP1_RINT 99 5 q" N. I) z" m$ h$ _: ?2 O
//#define MCBSP1_XINT 100 ) @7 |) Z4 p* N& y) t- l4 P
static int MCBSP_MAJOR=239;
, i6 t( A _# |( m5 w) ~: [$ X! {static int MCBSP_MINOR=0;. Y" M, K4 P# n0 H) d. ~
static int count =1;
, K3 I0 o1 U. ?+ L4 d: I" }
9 v* W4 E/ ?5 {! e, Z, I#define MCBSP_NAME "MCBSP-device"
4 L( R: s7 l$ E* W" b- N4 V
1 }& K7 l3 s) |9 p6 z/ o: O2 x6 Ystatic struct cdev *mcbsp_cdev;- B2 m% m9 }4 N
static struct class *mcbsp_class;( m* Q; R) N v* M4 U* n
static dev_t mcbsp_dev;
/ G7 R: {2 J# k6 D) q4 aunsigned int DRR_data;
. D1 ?. n% b1 _* iunsigned int DXR_data;
0 G5 T3 v7 V; s) x) l2 Ustatic int mcbsp_open(struct inode *inode,struct file *file). H! \9 |, p; z- h, o% Z4 H
{1 L0 T/ ^1 G* v( b& F: |
! k9 ]. j. \8 o, ]' h1 t% V* @. t
//interrupt enable,initialized* u7 m: _- q' {# G3 {, h6 N+ F+ w" B+ k
unsigned int temp;; h0 m- p' r! Z
//SLEEP_EN(GPIO8[10])---0* f/ m; b! D* S/ u3 H
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));& {+ X4 r' B7 G( [
temp=temp&(~0x00000400);
, |1 |. O: r: V" ` __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
3 ~ r8 p: X, P //RESETn(GPIO8[8])----0----1- j# F0 }, q. ~2 A* E
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
& f+ J! l6 }- _9 C& g3 V" i, w temp=temp&(~0x00000100);
L5 M4 [% l% g, r3 g __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
( u+ T% n+ X7 S. V& q udelay(100);
' o. F& }, ]7 j temp=temp| 0x00000100;
- p# [( v3 t- l( w( K- p N: i. L __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
/ P# P& r, w( D/ a. c7 N udelay(100);' N* q+ c6 [, E
printk("open success!\n");7 Q% G( U# l: c! g, t8 t
return 0;0 {+ ^, y: ?1 V6 W. j4 g, P
}
7 W% {' |: t! g0 ~* n T
! M9 U: u1 G4 L1 T9 c: Jstatic int mcbsp_release(struct inode *inode,struct file *file)
6 h6 k7 R& V+ [4 h6 n; `; J{9 u+ h3 G- i# a% z- w X! h# Y' C
printk("release success!\n");* f* w! K e% B+ e m
return 0;0 |$ K4 m7 B% ^8 K
}
# o" ^2 f+ e! _9 H9 {$ B" |" f# j, |; i6 Y9 g) N8 a9 G
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
( l, Z) P$ a) j+ I$ ?+ R{# Y# f6 H% A; ~; P
copy_from_user(&DXR_data,buf,len);
; Q* I( o: c0 G9 t" i4 s4 z+ J iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
8 ?8 s1 {- }# t8 z; q5 G1 Y/ N2 M return 0;; K2 H- p2 _/ q4 ]/ _1 R9 ^
% n% M$ f. j+ n0 }2 C; S}$ a! z( H/ u" @0 c7 P
/ p, X6 h7 T E: Z# t
static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)1 L. J6 j# p& [1 l
{
; l/ D. ?# I. Y9 j DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));9 W; Y0 c9 @6 q& }
copy_to_user(buf,&DRR_data,len);
* @' o ^9 g' ?& K& m return 0;: p- i6 T: Y# N/ i( {* N; Q
}
6 F8 f8 S+ [# N! a2 P: M5 P h
w+ r2 @1 X& T8 w3 m0 z6 l% S" `# i& ]! C$ G! x* g
static struct file_operations mcbsp_fops=, L% |2 x2 ]' l4 M2 j- ]$ i% v/ v
{# g* M( \7 [ A+ U! t. @
.owner=THIS_MODULE,
/ M Y8 v) A; z1 N. M .open=mcbsp_open,% _5 b6 n k4 a. D2 }0 y2 V3 L
.release=mcbsp_release,) E; a H- [8 ~& ]; T9 m
.write=mcbsp_write,, g/ D8 \; y& S2 y
.read=mcbsp_read,
/ _& A/ G1 K# w0 _7 y) v9 r9 T};
% c0 i. e: L& z! Gstatic int __init MCBSP_init(void)/ x' j6 Q# Y* {, j& } H# f
{
2 W$ M- u- r8 g3 E int ret;: K+ `. {0 W9 e# Q: T' c* x- d4 f
unsigned int PINMUX1_REG_old;' P1 P5 A( M6 E O
unsigned int PINMUX18_REG_old;
+ D2 N o, Y, `5 x, R l2 U, f4 ^ unsigned int PINMUX19_REG_old;
2 s1 Y( W5 [# U unsigned int temp; ' M5 Z& j! i: s/ Z$ r
if(MCBSP_MAJOR)+ S; s; {' X) ]) s4 v
{
3 O3 Q6 W; |+ P4 b7 X3 [2 K b mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
' u, B5 W1 f7 U4 K ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
+ p) M6 |8 _6 k* i+ [ }
! J. d- e+ U$ K6 D* i+ T else) b4 X5 s& i* m( p3 `( Q, D: t: a* H
{( P+ _; b5 n6 _3 Q* N' D
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
- i* q6 m0 N7 d3 d9 U3 _% g MCBSP_MAJOR=MAJOR(mcbsp_dev);
5 t3 \ X% N! E }0 g! E. A4 y2 Z2 |
1 n* [0 l4 I' A% W1 H if(ret<0)
, L a5 {3 A: \$ {8 x: D9 I) M {
$ ` Z, z3 v' n2 x2 Z% ~" }/ T printk(KERN_ERR "register chrdev fail!");7 K* o+ j; l- r/ e- v6 {. @
return -1;
0 v4 A- W/ _4 P3 y/ u% h }# Z2 L& Z* C" }/ Q
/ }6 c/ J7 W r( s% }/ i$ X
mcbsp_cdev=cdev_alloc();
1 L* v! D6 p. p6 t4 y
( ]5 ]8 p( R- }! C9 L2 P if(mcbsp_cdev!=NULL) K6 m- l% H3 }! ?* Q
{7 v# W& [: Q3 \+ }
cdev_init(mcbsp_cdev,&mcbsp_fops);
( O/ h' Y4 I0 G6 `* u7 T mcbsp_cdev->ops=&mcbsp_fops;
4 k7 w) v @9 {0 J mcbsp_cdev->owner=THIS_MODULE;$ p/ O, Z: N* ?3 r" Z1 ~6 a
o0 k5 V7 u$ b/ T1 n if(cdev_add(mcbsp_cdev,mcbsp_dev,count))2 K3 E+ |" Y7 m- l& I6 U
printk(KERN_ERR "register cdev fail!");& _, i6 @3 ?% @; u
else2 ^" W( m; a+ ^& _, D8 ?
printk(KERN_ERR "register success!\n");
9 A. w! \: U% D2 ]" |9 `- l; L }
3 ?0 m. s5 F0 `7 X else% U* V& W5 o; S3 n1 H+ M
{
( f2 m7 j- S# v) N, ] printk(KERN_ERR "register cdev err!");
5 i$ t1 A4 ]) p7 X# \- ^& n( k return -1;
& U! j4 a; m+ u5 Q( w }. r d; }4 @! n; q. P6 v
8 h+ \: j$ G) J/ g$ q6 W9 H mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
: x& z5 K }# p7 B if(IS_ERR(mcbsp_class))
( ~$ h+ [) u' A' M {8 b& f% a' M6 {0 S& s
printk(KERN_ERR "register class err!");+ Q5 U6 f% r3 h. Z3 R* W
return -1;
0 C' d; }! s3 m% K- e$ O" Z }6 b/ N: L' E3 w6 m; H( S% g6 k
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);1 w( A- v; k5 n6 l
3 Y, O1 Q: e4 v' f+ a. _- |4 B //PSC, W8 y3 d/ l( g( }9 ^! w
//add Enable MCBSP1 I' r6 B8 z# H$ V, I5 |( F
//test# I4 ~# ]3 ]/ V/ j
temp = 0x80000003;/ g3 R, F- z6 n8 Z5 ~" N
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
4 b# X8 s' P% ~6 a1 V x temp = 0x00000003;
" s" k' w6 r% R4 U writel(temp, IO_ADDRESS(PTCMD_ADDR));- K" c8 w* ?! V: Z. Z
( d! [, N: u% X' t/ R3 u temp = 0x001FF201;
/ ]" r- v6 h( l9 b1 u writel(temp, IO_ADDRESS(PDCTL1_ADDR));
* w. L0 e* p0 D" f & ]' P$ h" Y( S% p& j3 ]# r
//PINMUX
' y2 o! C- O. O! e r5 ~ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,+ `$ k7 p' S9 o$ A( Q/ `; n: k
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); % s8 P" c5 S3 }4 R, s
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 9 ~" z$ P$ P3 h ^( _5 C
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
* M& `( U/ K: W L) W2 W* N7 V
//SLEEP_EN,EPR,L138_SHK1,L138_RC4 E5 q+ W; B6 W' P
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); , T9 N4 h0 D8 e' @" R- e
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
# a2 R' x, d, E# a* B; ? writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
6 T9 D/ T, n. x/ m/ q" j $ U4 _, @" G1 y( ` V. j# W
//RESETn,L138_SHK2$ Y% x4 |6 |9 Y8 x
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); : S3 ^: j5 Y) X. y' i# w
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 8 @" s& n1 j& k, _
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
! ?& ~, q) Z, N6 N4 |0 i9 N, U/ [
/ R R! }, o2 i
) W5 _+ [. W: `8 N //SPCR Register; K& d6 ?/ u# y; c$ T
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
2 V9 |) Z; Z, O4 F5 Q5 s( h* r. } temp = 0x03000000;//(DLB=0)1 u! W3 x: Y, Y s7 o% b! j
// temp = 0x03008000;//(DLB=1)% g9 v O7 G6 Q
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
5 J8 C9 K ]; O4 `+ m temp = readl(IO_ADDRESS(SPCR_ADDR)); w8 J0 }- p. {1 a3 V6 U
printk("temp=%x\n",temp);$ m3 c+ I8 g# e6 D
4 j5 G9 q" r @( Y9 L //PCR Register: ]; | x3 c/ ^* H
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
6 J9 I# }) S# d* X m) | // temp = 0x00000F0F;
- _ q" x3 S4 {: w9 h$ k temp = 0x00000B0F;
( [1 L/ G1 }3 Y writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
8 ~3 S5 y5 K }, H4 f temp = readl(IO_ADDRESS(PCR_ADDR));
& K/ O2 A9 Q3 A t* ?. F; `9 U) K printk("temp=%x\n",temp);
( Q, U- d! @3 Y: t, H //SRGR Register- Z- T4 @; m F- ~3 A
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
6 u) S: s% r6 T" x! k! Q7 w //temp = 0x301F000B;
( v* M- }5 K3 H' v% d' ] writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized 5 M" e9 h) N' S* Y5 ]
temp = readl(IO_ADDRESS(SRGR_ADDR));
; e! W/ s/ W; |* E9 F printk("temp=%x\n",temp);
3 V- ?: L4 }5 D3 I; s //RCR
. u( k) m( Q+ r4 E, w //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,) m. x! `; j: O# G, V. v. X1 G+ L" C
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
3 ]6 {; g4 _1 @2 K) ^ temp = 0x00440040;
! F8 W' g$ B, c. L writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
6 G5 c- f; f5 n' @ ? temp = readl(IO_ADDRESS(RCR_ADDR));; T9 Z/ l+ p; i% [- P
printk("temp=%x\n",temp);
9 j. ?5 o1 O; j/ e% H, \9 I //XCR1 h4 l) k$ u5 B- ~4 J
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-18 n. x( h5 ?- d- {8 N& A7 l
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
; K% }2 R, [$ l3 ~2 c' k* b- k temp = 0x00440040;
. Q% P- e9 S4 h0 X8 L5 m/ W writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 0 g: L1 F/ N7 Z) p% s
temp = readl(IO_ADDRESS(XCR_ADDR));
4 q" E) {" E0 }! r5 y; ]* S2 M printk("temp=%x\n",temp);# D$ _5 G' ], F# N5 Q! |9 Q
udelay(100); ~ p4 z# M9 G2 u+ J! l: C
//SPCR Register# I0 g8 G6 L1 R/ B( Q
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-17 z3 Z& S7 [" N5 L+ @6 t; D% C
temp = 0x03C10001; //DLB = 0 VS DLB = 1
/ E: R' ^* d; i W. Y/ n writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
7 }3 J7 k; i1 w. q4 @ temp = readl(IO_ADDRESS(SPCR_ADDR));: {. w9 l$ G' D! s$ f
printk("temp=%x\n",temp);
! N! ?! |3 K" o4 y udelay(100);
- U2 y4 }3 ?; ]% i
. A: d! R: ~ K0 |0 y' a3 T+ h //set GPIO direction
3 O8 k8 w( y' o" L3 Q7 x1 F temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));- w) R/ ?" u1 N; c3 h% f
temp = temp | 0x00000100;//EPR----input
; W% B6 g( [1 N7 P0 j! Z8 l temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
( J. S/ k/ @. r) T. }; q" J __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
7 j: W* ` Q$ p+ u
3 \! W$ Y/ {( T7 W/ |3 P$ F6 l return 0;
x6 `- ?! z) Y$ C% \! z}
2 k9 I/ `7 G! N# z# w sstatic void __exit MCBSP_exit(void)9 M$ z. a1 y$ `/ b0 t" g
{
2 b3 O% k1 j& | Z% I5 L" R printk("mcbsp chrdev exit!\n");/ U( a1 I! ?! `# ~7 V, E
cdev_del(mcbsp_cdev);
9 V* |* R" ?7 ?9 S9 \" A& ~' { unregister_chrdev_region(mcbsp_dev,count);% a* w* Y% t6 d/ ~# Q$ j4 Q, [
device_destroy(mcbsp_class,mcbsp_dev);' `2 U7 I. v$ r0 Q* o
class_destroy(mcbsp_class);6 ~) F9 C" |- Z* f4 q' A
}. _ B" v; c4 g- u0 q
module_init(MCBSP_init);
; o m( D6 E+ \module_exit(MCBSP_exit);
2 n2 X/ \ C2 }- I& W+ x( q2 O3 i" T. D/ A; W
MODULE_LICENSE("GPL");
) U/ k8 U2 C, F) K9 |, n3 I/ l" ~
3 K0 a4 E" `7 f. g4 }( r我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。9 ?( m5 V4 x9 h1 U* ~* U% r
我的应用层的测试程序如下8 i6 W6 {* V2 { o
#include <stdio.h>
+ e' J3 N+ o2 G: x4 j#include <string.h>
5 u: A4 _3 s' q% S9 M#include <fcntl.h>
1 H/ X0 m5 F5 W5 t6 p# s#include <unistd.h>
% c: i6 y9 p) V#include <signal.h>8 I( f( A/ u- J0 I
#include <pthread.h> //线程 b- t. t9 f1 Z }# W
#include <stdlib.h>
" H, [ I" L% H#include <pcap.h> //捕获网口数据
" P X" M1 Z+ @% g) v% S#include <semaphore.h> //信号
, g+ c$ g$ _9 B. \+ @+ g#include <sys/types.h> //消息对列
; Z ?! ]8 v6 g: ]! c, C#include <sys/ipc.h> //消息队列
7 |. V" w% n% a9 t) a#include <sys/msg.h> //消息队列2 j \; I, k$ z& x
#include <sys/select.h>; q! t% Q2 B# ^% |0 g. O
#include <sys/syscall.h>
7 A7 ]2 L4 Z7 Y7 E& ~0 @; `#include <sys/stat.h>
+ ~* I1 J8 K4 \' d, S P0 x+ ^) b( f5 @#include <sys/mman.h>
3 S+ y! z. k/ u! {#define msleep(x) usleep(1000*x)
\' s2 M! Z6 m7 {9 q5 Y( @& ?
/ \9 ^2 u* v8 G" A. `, v( t3 d; Gint main()
v7 P/ B- J* V{ ; }( m- @5 d6 x: Q1 W9 c
//MCBSP,ARM与AMBE2000交互设备
5 J- k" e1 c6 m4 x int fd;
6 f( l; g( ?6 j# p' {3 j4 L unsigned short data_write = 0x5555;
0 j7 D; g9 K: Q1 }. w) m8 v& _6 c9 a unsigned short data_read = 0x00;/ `& [/ j! b1 b3 B$ n
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
' J- G6 L* J8 s* n* S8 F4 Q // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);1 d$ o8 @1 z& z+ m* G
' i) ~& X! {) V4 b5 a3 U
if(fd < 0)
2 ~6 U" E0 p7 N% L {
' R* K$ a: H3 J; Q, h perror("open failed\n");
5 n0 E8 ^* ?7 p+ P return -1;( \7 {& E* p$ w7 h# T
}( K/ [* V5 `1 |* h3 i
5 X2 [3 T$ ?3 ?5 v3 H/ @
while(1)
) C; K- W X9 }6 l5 x {8 P: X3 {- o! Z3 _6 [
) m" r% ^; q6 o0 _ //AMBE2000每次读写是24个字为一帧
2 S# K; X+ z: h0 T/ M //写数据时将数据在底层存储起来,等到中断的时候再发送
6 W7 ]" @ {- ^& m2 j //AMBE2000输入数据是以0x13EC开头的
; _ }* F6 n- y3 e write(fd,&data_write,sizeof(unsigned short));$ V7 _" G1 a% Z/ \! `
; h1 F, `4 y0 M0 O' i, q7 g' Q2 f
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 * @4 {/ k: w! j7 N5 w) E. c- W
read(fd,&data_read,sizeof(unsigned short));2 _+ {5 C4 P/ p
5 E, H. e% L/ ]* @! \" g
if(data_read == 0x13Ec)
8 [- l8 H1 E3 V7 m6 _! v1 Q9 q) O {9 T! g% F; N* X! M7 s
4 p& `4 C0 J3 e# r4 i, l6 {
printf("data_read = %x\n",data_read);
. b6 a$ e" }: @; l; A9 d }
9 |5 ]6 R/ Y# k9 b+ `3 A; u2 u. b 9 F& ^# s+ ~! G( U
msleep(10);
" u/ F# `2 } T2 Y0 q4 l8 S
4 t. V$ i& J; l" V- g% O /*
+ R$ f' `: W; z! U, D3 J ioctl(fd,1);
; k* b0 v% I0 K sleep(1);- a; K9 q$ G3 |7 Y, L$ p
ioctl(fd,0);
) c& U& _5 } G+ K. v" H; o3 C sleep(1);
# j+ }/ ~8 j2 k) Q) i N0 _ */ 9 r. D- @ w! A, d$ w
}
6 h& L. {( u0 @$ s4 Y8 J5 f return 0;0 J* R7 }) u1 D2 ?5 B* B
7 o+ d% e5 ^& C, l}& X r9 m8 y" _2 q) r4 a
" h1 i- \7 e/ _8 m
多谢各位指教,谢谢! 急' ~* Z1 ]* W% ]: }. s
# p; Y9 @4 r) T/ ~0 \! ^0 h$ p2 f7 N$ h# p. ^- }5 @2 e, f
8 L0 v% T8 m. r
" ?, p2 A" p5 N% i2 [" e$ y
( M* m( ]6 y6 E
|
|