|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
3 y8 T& j5 h. s! a. r& l }! S/*
) B ~& F$ k) F' L* N * Copyright (C) 2009 Texas Instruments Inc6 k& v, L( D I9 `) x
* f6 |0 l- ]( y6 _9 U, w8 y
* This program is free software; you can redistribute it and/or modify2 s- @+ q4 D( W. |' H7 f
* it under the terms of the GNU General Public License as published by
! S3 x3 r3 M9 r4 d1 A4 g- A * the Free Software Foundation; either version 2 of the License, or
, ^2 R; Z& S( Y% e * (at your option)any later version.
; M/ Z; i6 b4 `4 K& h1 o *
( _2 ?/ x+ t3 g. s% Q" Y * This program is distributed in the hope that it will be useful,
+ u0 g- x9 e* I8 v * but WITHOUT ANY WARRANTY; without even the implied warranty of
" s" o( _# {1 E# `2 t, q# ?' T * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ I* i$ _& Z2 v. {* {% L * GNU General Public License for more details. B( U. P2 c+ y* U
*
; f6 A( T/ S( v * You should have received a copy of the GNU General Public License
5 H6 ?2 L) D# w- ^4 T- i( } * along with this program; if not, write to the Free Software+ k2 z# }7 F7 B- T3 ~
* Foundati) v+ ]; l: j% _$ ?
*// ]. G. B8 {4 R6 j
#include <linux/module.h>5 \& {' u( u" l( A
#include <linux/init.h>$ s5 q1 F( }, ~ Q3 ]+ k4 Y/ |) A
#include <linux/errno.h>4 i, k( j+ O* P* \3 E
#include <linux/types.h>, j2 S* R+ ~8 `; @: A
#include <linux/interrupt.h>
, P9 k5 Q% B4 j) b' w#include <linux/io.h>
+ @6 c& x+ V( h0 z#include <linux/sysctl.h>
$ A9 {" b/ X) J#include <linux/mm.h>* f6 @4 b/ B& V \: D
#include <linux/delay.h>
1 g4 B! f5 ]7 v5 E& P0 R#include<linux/kernel.h>
! M: C% u% e8 W% x, g#include<linux/fs.h>8 ]3 h- t6 X& q
#include<linux/ioctl.h>: ?5 l2 ~+ t! r6 p( L G; N
#include<linux/cdev.h>' z! T: U5 B$ e, j/ h
#include<linux/kdev_t.h>
1 ~% T/ Q4 _: r6 H8 c U4 c#include<linux/gpio.h>
7 p1 B0 o2 h& |/ z6 h. ~0 l# n#include <mach/hardware.h># P8 J! O/ P3 j/ ?: a
#include <mach/irqs.h>
9 N2 S$ G% h' T' V' M- C- k. o
#include <asm/mach-types.h>
5 g* @/ a' @0 r3 u+ S4 m#include <asm/mach/arch.h>$ x& X4 q+ v) J) @& H' ^2 A8 R7 v
#include <mach/da8xx.h>
0 A4 E1 L: ]; I f0 i#define SYSCFG_BASE 0x01c14000; D. H9 O9 u6 D+ t5 f, k1 ?
#define PINMUX1_OFFSET 0x124 0 O; K) C3 c% Q1 j( B K
#define PINMUX18_OFFSET 0x168
, H7 \+ v, \3 j/ I#define PINMUX19_OFFSET 0x16c# ~- @7 t% v3 x7 \2 k9 f+ e
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
( T4 Q) E. D' @2 l( h; R#define RCR_ADDR 0x01D1100C //MCBSP1_RCR. a z; H5 M4 l4 a9 }/ N1 V# T+ {; i
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
% i* l; f, j3 }4 w( d3 r3 K9 @#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
! z$ k5 B/ h6 u- B- }$ o. j7 x#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
0 B0 G' D- v# Z2 u7 @* l4 P / q5 p. V' x$ W- K& k6 m1 R
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR9 O8 h$ ?7 {& `5 [$ I( O
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR( q' b* N1 I2 V1 k. k0 o% E, \
//PSC/ u1 ^$ j3 N; b1 ?* I5 q9 w- H/ u
#define PTCMD_ADDR 0x01E27120 ! P+ x/ Y& G+ y# L0 I+ u! T: d/ ?' L. l
#define MDCTL15_ADDR 0x01E27A3C
( B4 Z, q \& }0 K#define PDCTL1_ADDR 0x01E27304$ t% p8 z! Y2 Z) R0 f4 h
//GPIO8 direction
# l/ D. R/ M; z1 B7 m- f#define GPIO8_DIRECT 0x01E260B0: Y. s) M7 d- g% ^, ?3 p. a: Y
#define GPIO8_OUT 0x01E260B4/ z* _+ b9 D; G8 v1 ~: }
#define GPIO8_IN 0x01E260C0# i1 i* v$ f1 N1 N1 [- r
# F7 l6 T8 f2 A6 E/ U7 v5 \
//#define MCBSP1_RINT 99
. A$ E' ~# k; c' A. ]' C//#define MCBSP1_XINT 100
& ]8 A( p3 P y" P; [5 [static int MCBSP_MAJOR=239;
0 ^8 l/ C! u: Z, ~: D6 U- w! zstatic int MCBSP_MINOR=0;
# O% e8 V9 c4 @/ N4 U! o# X4 ~static int count =1;
% Y. v/ @8 s+ O Z3 y+ Z# F+ q" w4 T& t
#define MCBSP_NAME "MCBSP-device"* }5 Y7 }4 `& H, \+ V+ e% w& Z7 ]
& n5 o1 t7 f6 C& Hstatic struct cdev *mcbsp_cdev;/ L5 z* e- O- t9 i: b6 g
static struct class *mcbsp_class;# h$ v' E" B' T/ o% L0 K* k5 o
static dev_t mcbsp_dev;9 r$ S3 ?, ]; ~; a
unsigned int DRR_data;
: q7 _+ S/ E l# u8 }( H* y" o/ Hunsigned int DXR_data;; l; Z# q+ }, {4 q4 j( R
static int mcbsp_open(struct inode *inode,struct file *file)5 a7 Q, D E# n# {4 H# E# F
{
6 }$ ]* E$ i" ~0 F$ w3 n, \, Y
: }5 n8 @4 c6 }1 b! J //interrupt enable,initialized
z) i. R" |4 J7 Q* S unsigned int temp;
0 Z/ Z0 g k( ?3 X //SLEEP_EN(GPIO8[10])---0$ |9 R) f1 Z& R$ E
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
' u! z3 k; b$ s0 @( ] temp=temp&(~0x00000400);
3 C' v* U7 E0 n1 r' Q __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
4 p7 B4 i9 Z) S //RESETn(GPIO8[8])----0----1 a/ K" ?8 ]3 `. t1 L) v* E
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));/ P# v- C5 O9 A2 g
temp=temp&(~0x00000100);- W# q8 Q) ]7 M% ]8 i
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
* f- C( Y; M, J' I/ b4 Y+ J5 r- r udelay(100);
9 ^0 U& k2 B% y7 Y2 m8 Q temp=temp| 0x00000100;) b) y9 \* o0 C
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
; k; a% r. r9 M4 u: h& X udelay(100);
: w5 W6 ^9 X' X: v7 \ printk("open success!\n");7 ^- |" k% @7 n! c4 \1 U, h2 I
return 0;
+ _: `( O& T: G) j2 j2 h/ L}- F! J7 X7 Y- z% D! }! K0 j
# j- @6 ~- ?6 E, w3 q4 kstatic int mcbsp_release(struct inode *inode,struct file *file)
: l3 I+ X4 I* X! x4 _ H* A' K: n{
+ T |( U# s- c printk("release success!\n");% B9 `& x% ~ l1 C
return 0;# ]6 u+ b+ ]: r- e' u4 P4 \
}
, j1 `8 p; |5 b
6 C, b" p1 v2 x4 n4 j& z! Kstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
8 X5 d; M, \7 c/ b{( D8 K8 z" A4 u* }( R& n- S) |- m. r
copy_from_user(&DXR_data,buf,len);
* D: s0 d: z' k; y$ p iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); 9 T& Q& [5 s1 B5 x0 \8 H) b+ x
return 0;
; y, ^- o9 Q3 S5 {+ d ! K$ l' O! P& [2 R0 i
}
7 B4 s+ ?+ j) Q$ [1 y
- `6 u! m( G G j# Ostatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
* G! g( s- u5 ]- x4 }{
, j- Z9 `( A K& D( b. F7 E3 X DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));2 I4 H; \* h% k4 s
copy_to_user(buf,&DRR_data,len);
$ I# G' n6 Y5 @# n return 0;
3 h- e) ?0 f. n: j}& {3 I3 [# t; Z2 r% m# w3 p& ]
: y& {' `1 ^6 P9 J' O
$ Z1 R5 v) X X& G/ pstatic struct file_operations mcbsp_fops=
6 k% G$ ]3 j9 p9 G{3 ~1 z/ V+ K& P; V8 O4 ]
.owner=THIS_MODULE,
4 S% n! F. Y- r$ z3 g0 w7 [ .open=mcbsp_open,9 [. @' ~6 U- N1 w1 a
.release=mcbsp_release,
* w _+ L3 ^ e2 r .write=mcbsp_write,0 \' D6 Y* s1 Y" C
.read=mcbsp_read,
7 W0 K; I5 t s};- `& m! w$ L% E
static int __init MCBSP_init(void)
$ J3 m% I! e' ~{
$ e0 R: f$ [ S% l7 q int ret;2 ]* j3 f% P# k- s
unsigned int PINMUX1_REG_old;! ?' ?* A% H2 d( s$ A
unsigned int PINMUX18_REG_old;8 Q: g/ w& h/ y
unsigned int PINMUX19_REG_old;5 v+ u$ d. ]1 u6 u* D/ |
unsigned int temp; 8 |* j; b7 l+ w5 Z4 D) ~
if(MCBSP_MAJOR)
+ d3 U6 g* m! @! p K& `7 j5 b {
- y/ h8 ], h: h, g, F9 k) h mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
9 {: r+ I; ~) Z% R K ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
6 r6 ]: T6 T8 e; q' q: U }
7 i, _2 K: ^. \) |: \% J else4 e/ c, b- v m( T
{* O( [* p6 T9 U. E3 M6 z3 M, O
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);& w* A) v: c1 Q' v9 P$ ]) b6 E! n
MCBSP_MAJOR=MAJOR(mcbsp_dev);' W% l7 r+ P* Q
}2 F! I+ X3 _+ u) S( h/ d% d1 c' u
0 y0 X1 g! E& x8 g5 ~5 Z6 Y, ~ if(ret<0)6 c* y V3 @% x6 Z( V7 e4 H
{
* g8 u( s5 | f4 M6 W# O6 E printk(KERN_ERR "register chrdev fail!");# K# K# p+ s4 ^, \( H+ K
return -1;: X8 ~8 D6 k, F1 N
}
: H f" Z1 {- o( ?
, W9 w* s i* r: w; ?/ i8 k, ] mcbsp_cdev=cdev_alloc();
" I% o! P. W5 m& g5 X
6 m7 F. T |: \3 B2 ]+ | if(mcbsp_cdev!=NULL)3 D' F; h. P& @. j4 G
{
8 A3 h. m. G. _- G$ ? cdev_init(mcbsp_cdev,&mcbsp_fops);
' W( b. \- N+ R. u7 q mcbsp_cdev->ops=&mcbsp_fops;: ? F* T9 S# R/ u' G! d. I
mcbsp_cdev->owner=THIS_MODULE;
7 k9 s) H) I1 I . y: p* H! }2 Z- { y0 E
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))% F4 ~; X# \- b2 M. ~/ S
printk(KERN_ERR "register cdev fail!");' S+ I1 }$ L+ f; T! }! ^! U) N: k
else/ Q2 R+ P \- v' x$ L
printk(KERN_ERR "register success!\n");+ Z( J. O }8 v* y! z
}
5 {0 }1 A/ o8 c: J else
2 `' K% k1 [# r" J7 \" p {
- h% M' \0 q7 v) a& K printk(KERN_ERR "register cdev err!");
9 C& d. f# b1 O return -1;% l: S+ c& x& R4 b4 ~
}8 \. ^7 }4 L- y, ~5 F9 G
4 R5 k0 g/ b; X* \, Y; n+ T$ ? mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
2 ^6 h' ~: o4 S7 r% t \2 k1 { if(IS_ERR(mcbsp_class))
$ \& q' K ]9 g8 n4 T5 m {
, I2 t5 z$ e' e; K printk(KERN_ERR "register class err!");) B. I9 C0 q' v- q
return -1;
- G/ W. m# I) s }
U) D: S$ K8 w2 S! h, u5 { device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
5 ]( o' y a" H9 s8 _
+ L* a$ D. |: o4 H5 o //PSC$ P* x1 v$ L8 d; a) f/ O' u2 j
//add Enable MCBSP Z$ j. z' a4 X7 y' C" G( _7 r
//test, j5 l3 n6 \. ^: g# l
temp = 0x80000003;5 f) G2 }1 E6 q9 L; f) w
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
9 e) `2 @; A% a# B, j temp = 0x00000003;: ~( Q# C( [7 a l" b, m
writel(temp, IO_ADDRESS(PTCMD_ADDR));
& ?3 ]& y5 D# U+ c4 G% S - k H$ g$ v G' p9 Z& V9 ?
temp = 0x001FF201;
5 i! G1 [# Y' ^( V9 D. p+ J writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 @ y- F4 E) U3 d
/ W2 z' w2 E3 a% z% s& M //PINMUX
( [- a r0 c; \* l1 [) n0 J. p8 T) ^ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,. @& i5 V# v# P2 u( ^
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
3 m0 C4 D& r5 ] PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ( }# l2 t: Z& \) n9 Y. ]9 N2 H
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);1 {2 L' t0 `# @ r) G8 i1 S+ F
: U" E8 i7 P1 Y8 o' n( G) Y //SLEEP_EN,EPR,L138_SHK1,L138_RC$ u7 @ b1 g4 {6 `; b7 u- b
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
4 B) ?4 r; V) z6 Z PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; 8 o" F2 }, W6 d1 \# `1 h; C" [
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);* }) e4 v, [7 A9 b
8 \" D- ~; @$ u( c# L m
//RESETn,L138_SHK22 M: b& V+ M2 |
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
4 c6 U6 n9 e& w: O' X2 n+ t! T PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; + m Z8 j4 p) q: v j, J0 u
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
C2 Z3 Y. {' w . g, y* l p- w
; i: X2 e6 m* w
//SPCR Register8 B5 \% f8 c, K4 J
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
' A* X5 a* [! N2 o( J8 y temp = 0x03000000;//(DLB=0)1 S' i. X; u" G- w, ?
// temp = 0x03008000;//(DLB=1): k8 e' n6 w2 T* r! V' L+ v% d* w! l
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
$ H5 Q( m7 C5 X9 Z9 |" e+ J- x temp = readl(IO_ADDRESS(SPCR_ADDR));5 ]% |5 M% z6 j/ n- W
printk("temp=%x\n",temp);
& s! c5 H! i4 g4 {& O
7 _0 J- Q. c1 D# T //PCR Register Z2 f7 }6 o `& I' u0 H5 n; L
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
5 n8 J3 u7 J: i- M% ~- B( `! M // temp = 0x00000F0F;
' N$ J1 H9 a7 d% u temp = 0x00000B0F;
3 j& u$ ?; u( M9 {3 Y( l1 B writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized F3 j; t& O) w! C( ?: a) K
temp = readl(IO_ADDRESS(PCR_ADDR));
/ T6 d# I& D0 M0 F6 }' _ printk("temp=%x\n",temp); 9 r! r% \/ X1 m2 t
//SRGR Register
5 l s9 ?1 w* ~" E+ j //GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11/ w+ ~) _7 ~& T
//temp = 0x301F000B;
5 \* r# [7 d+ X, J writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
. f' w- {0 o { temp = readl(IO_ADDRESS(SRGR_ADDR));, W+ r$ P5 f1 b2 t! Z5 B3 W, m
printk("temp=%x\n",temp);) D5 T* D E6 f" U O
//RCR2 G1 w1 r$ m" F8 _* z2 e& t- B
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,7 E% {5 I: S+ l5 l }9 g- Z# z- P
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-03 N1 f( P9 H8 F$ j7 _6 A
temp = 0x00440040;
6 E7 V! h: L7 l writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
! N/ T" ? h6 s* P temp = readl(IO_ADDRESS(RCR_ADDR));
, k! J( }- C5 Z/ p/ @% N printk("temp=%x\n",temp);
h! S& G6 r6 o2 p, k //XCR
% R5 @$ ~6 V2 L4 | //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
* g; ~* r$ j1 {, F! N# O) L //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-06 C/ o4 A( N! R6 V
temp = 0x00440040;
# B7 N" S9 X2 { W- e0 \: d writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
. [% o8 K0 R2 t+ h* ^ temp = readl(IO_ADDRESS(XCR_ADDR));
( v$ q+ f0 D. @ printk("temp=%x\n",temp);
; D* b9 [* K1 M6 m- M udelay(100);# S9 d% D+ @9 R5 k, s" Q' K
//SPCR Register5 q) z) [6 \3 K
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
8 I8 _* |" W- b$ i temp = 0x03C10001; //DLB = 0 VS DLB = 1
# Q& O+ E6 I' Q+ o writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
' t, y# m5 b# r' S5 m. O' j6 U temp = readl(IO_ADDRESS(SPCR_ADDR));
$ p! S4 J+ i) R# t* P2 [. I7 y5 W printk("temp=%x\n",temp);
$ ~* B* V2 R, Z* O2 } udelay(100);, p9 Y% E) Y" D3 A
, F: }/ `9 |. |: ^( c6 M3 u C
//set GPIO direction4 Z' R. i* K( {3 P' ?* }6 E8 H
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT)); O" ^- \; H0 A/ F
temp = temp | 0x00000100;//EPR----input4 {1 S0 P M# Y; k% v( O: }
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output. |1 X$ o. l* F2 I+ L5 @* b
__raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
; P9 g# V4 b! f 5 U5 _2 G: Q" N$ p" }* b, D
return 0;5 o8 J2 U7 }& o! W
}8 o- h4 D% P3 \' d+ U3 ?
static void __exit MCBSP_exit(void)- E) R2 N" Q8 ]8 ^5 e
{2 Z9 A% O- j# r4 f
printk("mcbsp chrdev exit!\n");& W8 j3 t; w- @8 i0 @
cdev_del(mcbsp_cdev);! {! s3 \% \* \9 I* f1 E
unregister_chrdev_region(mcbsp_dev,count);' r. H o7 w5 a/ S, m8 Y) G8 V+ b: }5 L
device_destroy(mcbsp_class,mcbsp_dev);
; J* ~0 H. \8 v1 Z3 T8 G& x k class_destroy(mcbsp_class);2 a: z- q2 m% K5 X! i9 n
}
1 s3 j7 _4 z+ a, v3 c# Lmodule_init(MCBSP_init);
4 k7 K! J% b8 `3 u P3 i7 ymodule_exit(MCBSP_exit);% x X7 M0 Q* m: M; e1 v
. ?/ e6 A& d& P z) F- M! r4 r
MODULE_LICENSE("GPL");
6 B& W( t0 G5 x$ ] O2 B' ^! v+ E) F
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。8 J; f" }7 e) J( U: y
我的应用层的测试程序如下
/ U3 C H2 |7 r* C# F: [#include <stdio.h>
1 n! W& Z) U4 l$ x: K#include <string.h>; P7 e# s* [6 C
#include <fcntl.h>
e" S5 z( W/ f \#include <unistd.h>! D) f3 K7 g0 T3 P
#include <signal.h>
+ x' Q7 I7 y) D#include <pthread.h> //线程* f& Y G5 i. D# @" j' n- D
#include <stdlib.h>, f% E& u4 x( D, o
#include <pcap.h> //捕获网口数据: }5 I: C( u" a
#include <semaphore.h> //信号
0 k0 H E$ \( n$ a( B' |#include <sys/types.h> //消息对列: M$ H4 o# d- ]) c0 N% K
#include <sys/ipc.h> //消息队列# a+ W$ q1 h: X
#include <sys/msg.h> //消息队列
+ V0 O. k1 o5 P# F& `#include <sys/select.h>
! [9 G1 D- X2 X; u! {2 T% J#include <sys/syscall.h>! p5 a/ Y0 V7 J; V d
#include <sys/stat.h>
* b4 o! y+ Y% ^! W3 I3 K' M#include <sys/mman.h>' ^2 P1 Q0 O& R, y1 M, s# _
#define msleep(x) usleep(1000*x)3 p6 b3 V m- [* X, {5 l
4 i# X7 L$ I/ \; y- J& z1 ~int main()8 e% Z% h5 O5 s/ S
{ + C$ j# k* a# A& J v- `1 o
//MCBSP,ARM与AMBE2000交互设备
, V& }" y( D+ y3 B/ Y9 Z" e7 q4 f& E& y int fd;' W0 g1 Q; H& h3 X' X0 K0 y
unsigned short data_write = 0x5555;' @/ B( \4 ?. O% ^% G
unsigned short data_read = 0x00;
: Q5 a+ E0 O; V" M fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);8 A2 [) [1 [+ y5 D
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
1 L1 @) y/ o$ c- P; ` e- L8 }/ `
- D3 v* O7 B! f. h: p! X, }7 { if(fd < 0)0 ^- n( ?: Z1 t4 N4 l" p
{% l' w3 X0 S+ ?) ^% ?
perror("open failed\n");
0 Y9 e/ d b: N U return -1;
7 _8 |1 D# P3 q2 ^# n }
" b! c% d/ Q/ p, C r1 v) b$ r$ l , c* h5 U0 y, X7 p' G
while(1)
% g; |3 R$ _# J6 K( y' ] {2 N* B7 X$ H5 w" p/ w9 H
) o6 r2 L/ |) [8 _+ | //AMBE2000每次读写是24个字为一帧
+ P6 i4 t) }- u! D0 v& z, S //写数据时将数据在底层存储起来,等到中断的时候再发送' g$ ?3 z0 o- w' P* [
//AMBE2000输入数据是以0x13EC开头的
3 {9 t, G! P0 W' ~' [ write(fd,&data_write,sizeof(unsigned short));
" u: r, w8 J! ~- }$ p4 j 6 b6 {% S" K; ^) ?3 O% U' k; A
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
) l. |1 p! {9 u" h! C0 g; l read(fd,&data_read,sizeof(unsigned short));, h/ t5 h u8 o; D8 E" b& Z, n
4 U6 O: \6 S+ _+ j if(data_read == 0x13Ec)& {1 _+ m( a* j$ `5 ~. C
{( h5 _$ C' W' c8 F5 L
0 x7 Q2 K! U& w printf("data_read = %x\n",data_read);
/ S) D) D$ d2 e, s }( q7 W. ~6 c9 e# t/ j& m& O; Y Z
' A. S9 j5 ]3 {$ |9 \( W msleep(10);
. {4 X7 }: K& Y6 [
2 u9 `% T% [, m /*
& w S" T* Q( r& s ioctl(fd,1); ) s. ]% u3 y: b- E7 _
sleep(1);
) s% Q" H" B6 z ioctl(fd,0);
+ k( }) r# `& v: `% b sleep(1);
3 S6 }/ _7 z8 W3 f8 F- D */ , l/ D4 B+ w+ M
} I) D# a" }5 L5 }& g
return 0;
9 j( x# K/ C, ~& v
8 S1 {: Y: l8 f! W5 z3 ?, L}6 k/ D) I3 ]) w* ]1 _
8 {$ _0 L8 H D1 K U+ K* \多谢各位指教,谢谢! 急# m4 F& k w. n5 r: R
: u! J2 F7 g" ~0 o/ M9 I% t9 X
% t% c: ~- O* H! p9 ~( ^: p$ r3 B$ F+ H4 w
' d# N8 Z4 q; i% N9 B1 O+ C& d) g- a# j" ?
|
|