|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序: ; W) [0 B9 Q$ C i
/* @* O# `3 l4 x
* Copyright (C) 2009 Texas Instruments Inc
- l7 i+ }& K) e/ R *
% ~$ ?6 i9 z3 A4 R7 O# | * This program is free software; you can redistribute it and/or modify
2 Z- A! E c d, H * it under the terms of the GNU General Public License as published by$ F0 N$ C5 `$ \6 I1 l: E8 ?* V
* the Free Software Foundation; either version 2 of the License, or2 \. s4 h% _; D1 N* I
* (at your option)any later version.
1 r6 {7 C2 F% |& U9 N *
, ~/ }( G! x! U, N& s * This program is distributed in the hope that it will be useful,
$ u, l7 M7 h4 i4 s) {+ Q4 ~ * but WITHOUT ANY WARRANTY; without even the implied warranty of6 e3 F* e. F0 W
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6 U4 T( Q; ^2 y! [5 e+ h5 t * GNU General Public License for more details.: N) Z$ N6 ^6 K3 Q# |( C5 V+ ]
*" r! C$ P2 }$ g/ J( ^* k# B5 f& M- d" i
* You should have received a copy of the GNU General Public License M5 u5 t5 E# Y `6 _" m
* along with this program; if not, write to the Free Software
) o- _$ T& I( F5 u( J* ]6 s * Foundati
# R, T' h* i: X3 H* h$ i7 {" z*/9 ]; K( B2 x" G8 k/ {
#include <linux/module.h>% e: V0 ^% {$ g$ S$ [
#include <linux/init.h>
. }7 E0 `6 z H) Y/ o( K#include <linux/errno.h> b6 b5 `0 D J1 @+ z1 A7 H
#include <linux/types.h>5 b O' Z" N2 @' p
#include <linux/interrupt.h>
* y: p, o8 x$ r$ _* C' \#include <linux/io.h>& e& E; h5 m" X0 E" V9 P8 I; j9 ^* \ {
#include <linux/sysctl.h>
O# E* J. L5 b& y7 m4 \#include <linux/mm.h>4 f$ q9 H" X/ c+ i- x' w
#include <linux/delay.h>
S; E9 T, R1 y( }6 O#include<linux/kernel.h>
. q; j; ?# t. {/ z#include<linux/fs.h>
: ?+ Q* d& q. q% y5 l* d/ B#include<linux/ioctl.h>
3 t# n' i `' I; I# l2 T#include<linux/cdev.h>
( a. c" e0 R# @#include<linux/kdev_t.h>
4 ^5 r- r, R: t. x#include<linux/gpio.h>" Y( r/ ^( w+ E1 E# ~7 u( [
#include <mach/hardware.h>
1 P/ o' S+ ] P- v#include <mach/irqs.h>
3 ]7 C8 O) J& \ z% N9 v* E: q
& w9 n7 ?; \" B( K4 j! Z5 h5 x7 W#include <asm/mach-types.h>
( _, m0 y& i2 i0 L#include <asm/mach/arch.h>
3 n$ D& ]0 x! T& ^# `#include <mach/da8xx.h>7 \( {' U+ q! C4 K9 u
#define SYSCFG_BASE 0x01c14000
8 n: c6 W7 b6 ~, p0 g2 z3 @# y#define PINMUX1_OFFSET 0x124
6 P& V2 a6 X, _6 p8 c: U5 L" L6 `#define PINMUX18_OFFSET 0x168 / m* p. O5 T3 l7 ]6 T
#define PINMUX19_OFFSET 0x16c
r% K) D5 Q; v4 |#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR- N$ z+ s) Y/ s3 _
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
8 l/ t& p) ?: [% h. J- `#define XCR_ADDR 0x01D11010 //MCBSP1_XCR! Y, O0 r) j7 L2 A- t8 B/ c
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
+ I3 J% l* ~0 \' v$ q#define PCR_ADDR 0x01D11024 //MCBSP1_PCR# z& Y1 a5 W. v; D, j
2 k. G8 f C+ c" z* C4 ?0 A" r; |
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
: U6 {2 e! ]9 w, P% M! p( R5 v#define DRR_ADDR 0x01D11000 //MCBSP1_DRR
+ ]! u- O/ n* S) L& U% w//PSC
+ W& _& L7 I4 j5 h# a#define PTCMD_ADDR 0x01E27120 3 A" O8 b+ b7 M( s
#define MDCTL15_ADDR 0x01E27A3C
4 Q2 K8 Q5 E2 m4 Y) j3 [* y- `( n#define PDCTL1_ADDR 0x01E27304
) v& V) t8 X6 z- _ v//GPIO8 direction/ I2 [# q$ _$ X6 _
#define GPIO8_DIRECT 0x01E260B0
! i9 r% r/ C& L% Z3 y" S#define GPIO8_OUT 0x01E260B4
O; _/ k( R) A2 H* e#define GPIO8_IN 0x01E260C0
7 W, y2 N; ?/ U6 b; T; _+ \6 O( _$ O6 Q6 O/ O7 L
//#define MCBSP1_RINT 99
& |" o$ m8 e' A; z! Y! c//#define MCBSP1_XINT 100 ( Y7 _% {$ v+ J* l9 @; n
static int MCBSP_MAJOR=239;
: ?# c. c- v. C: F# F$ _4 @static int MCBSP_MINOR=0;0 S8 L1 z1 p" S/ {, v3 U
static int count =1;
+ F4 N8 F( [! @* Z4 b6 L0 A+ L+ P( _+ I8 u" O/ U4 c! v
#define MCBSP_NAME "MCBSP-device"
6 z7 M0 f( }, {$ h' t) o# L3 F& N. ~! |& @' N8 ~
static struct cdev *mcbsp_cdev;' p% K0 e2 T7 u* g
static struct class *mcbsp_class;9 l' ^* F8 ]% W
static dev_t mcbsp_dev;7 Z1 \7 R$ D, X
unsigned int DRR_data;
5 l: X0 I) Y0 m$ L! Q9 tunsigned int DXR_data;
/ x7 }. w3 {. Mstatic int mcbsp_open(struct inode *inode,struct file *file). U! c) D; L, H- S& z6 V
{ {. y* W; B# C& u; L
3 Y* n3 ]: j3 ?+ U3 g
//interrupt enable,initialized& u7 R" k3 B; j3 M
unsigned int temp;3 z0 ] Z g/ i3 {1 P
//SLEEP_EN(GPIO8[10])---0
3 }. _5 o' \4 a$ E5 _ temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
+ C9 g# g7 t2 ^- U: p temp=temp&(~0x00000400);! s, E, U9 ^ [# M
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]' [4 v9 O) B! \ V
//RESETn(GPIO8[8])----0----1
# p8 k, L V* j3 D m9 b, T temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));' L4 q" E- L& p5 C: g& ?+ M
temp=temp&(~0x00000100);
& \+ l) T5 x d3 }$ Z( X T( i# b4 } __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---06 G7 b+ ]) P& K& O
udelay(100);& l5 k$ b& v- K! N! O* v! R
temp=temp| 0x00000100;
! V w7 f) F E0 K __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1& r5 }0 a( l7 K$ R- _
udelay(100);
7 i1 P$ k: {6 ]% ]( [6 u printk("open success!\n");
0 m. U- B2 d7 D: Y return 0;
4 T( T0 u- h: w! D8 O}
7 W+ M8 [. ^9 R- k" q8 Q; z5 S& h! ^! g6 W- K
static int mcbsp_release(struct inode *inode,struct file *file)
% p, F3 V! T6 p9 q6 w6 \0 h{; s$ U1 v; G3 T9 A# _" ?3 B
printk("release success!\n");
% k2 ~2 ^0 W9 s: Y' _+ U0 X return 0;
) Z4 L G- X' D6 a [}
/ b6 H% y, O' D
7 i( D8 y6 r+ @static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): k; @- x8 G# d+ j% a' j0 V& Z
{+ I* }- p5 u6 A# I `
copy_from_user(&DXR_data,buf,len);; ]; e7 M$ c, @! |6 p6 k& l. q
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
6 { \& D8 u7 e return 0;
. _ Z. }, X W
3 A* n/ G: V0 y6 r" ~$ G# k/ R" {}
$ O- o- g! m% ]9 m0 H; a% V
7 y& r( @, q! O) y/ L8 F9 R4 Mstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
% F/ _1 u3 c1 ], ~6 ]0 s{ " U0 `: l+ x9 P7 Q6 G4 N) v
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
- U r4 Z5 N9 T0 ` copy_to_user(buf,&DRR_data,len);
( d" c, I6 d6 Q7 j, {1 ~$ l2 Q return 0;; W/ u% `* W" k+ v2 g# h" m
}
9 V" m9 _& k% A9 X% z
5 G% Z" ^+ C$ n+ o, y# P* J) r" l' [( C; m% c- ]7 ?( }
static struct file_operations mcbsp_fops=
$ E1 z1 E; k9 I0 p, O{9 k. T/ \, n3 p8 f( y
.owner=THIS_MODULE,; r' J- ~8 v P
.open=mcbsp_open,9 M. c: f4 p5 b' b7 w) J. `
.release=mcbsp_release,
' l( G# x6 |2 Z, l& f2 m- `! @: q .write=mcbsp_write,# m( ^' |( r# d4 J* Z1 n5 v
.read=mcbsp_read,: c# E2 N7 f! K9 M ^! m
};* p2 k4 t/ D+ |# o
static int __init MCBSP_init(void)
- T1 i% w: i! f2 t& a{$ q" I; u5 I2 i8 b# ?
int ret;) \3 \ ?& s2 F" Q
unsigned int PINMUX1_REG_old;; @- g5 f+ W5 H+ M
unsigned int PINMUX18_REG_old;8 k1 u8 l) D) q' }% \
unsigned int PINMUX19_REG_old;
6 ^5 g+ [ ?. R, X; R unsigned int temp;
9 X6 m) W+ a* X% T8 i" k. @ if(MCBSP_MAJOR)
, a0 y, u. N; M: W {# n6 g5 |& U2 w0 V" f; x) O
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);- I X2 B6 Z! p9 H. v- V
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);( Z5 o, X% n; `; ~" g% \
}
( ^5 ^0 [" a, T% ~$ x else. x" ^5 A% U, } a
{
+ ^% m; f9 U" S2 _# S* J ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
3 m* k" b+ {& g- y! x) o MCBSP_MAJOR=MAJOR(mcbsp_dev);
+ [% \1 D$ I2 f0 s8 z }
b: d5 z; B3 ` ; m; Z; ~% B. y" y( `: |( p, N6 Q3 l
if(ret<0)
: H* S+ H4 r) [+ Z1 A { k4 k. p7 _, H# g
printk(KERN_ERR "register chrdev fail!");
/ m' D- w; z. J+ Y% \ K return -1;
1 ]& C6 C6 q7 j0 X: w' n }5 a5 L" L: B# V0 u, v& w
N+ s1 @# W) l
mcbsp_cdev=cdev_alloc();
+ f1 w/ r0 c% |0 D; k 9 Z/ F* T' j6 ?) v5 \* o4 P
if(mcbsp_cdev!=NULL); h$ u( U& G4 J" e
{. P9 `7 p! N' W2 c
cdev_init(mcbsp_cdev,&mcbsp_fops);# N. R2 Y5 v) ]2 u6 y: B5 S
mcbsp_cdev->ops=&mcbsp_fops;
8 H# t# i3 d+ Z: U mcbsp_cdev->owner=THIS_MODULE;& T$ d9 [: L7 a4 i
# o) b: {6 B6 o0 B2 }0 u4 V0 S
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
, ]" I1 S& Q$ g+ R printk(KERN_ERR "register cdev fail!");+ d& c& T- Q& o* V$ z. ^' }. S
else' }2 ?2 ~2 u! H) L; L4 P
printk(KERN_ERR "register success!\n");
: R' m3 }$ t4 @1 }2 _* \ }* l! R W1 G8 d1 s7 a% s% j' J0 u
else+ m2 h# E1 V3 J: u% t# O6 Z+ |) T
{$ I4 T* [. I/ Z0 }9 L$ w
printk(KERN_ERR "register cdev err!");2 G1 d2 B4 B2 H& Y* e
return -1;
- h$ n* r0 O, J }
" Q- O: W8 `$ X3 H2 o. X
: ]# j' B$ G( @8 E5 y* `* R- _' y mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);! |3 d( j9 ^8 Z& b0 \
if(IS_ERR(mcbsp_class)): X" |: }& n) n9 M5 j# _* S
{
. S% [! T" M( n' t R0 @: D5 ~ printk(KERN_ERR "register class err!");
, ^- C3 B/ U. V, l3 N( \; H+ b3 } return -1;
! B! P6 u& r, {2 e% \4 \9 H }* O" k- {$ _ v. r
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);8 }6 M: t6 B! y9 ]
: R1 O% o9 w. ]3 K( {, U6 m, m //PSC+ [( X* C f" s) O; ^# b7 U5 N6 ^
//add Enable MCBSP
" o; i( _6 N. a4 o) @' ? //test
1 u' U" [. R1 l, v' [/ h temp = 0x80000003;
) T4 Z+ U7 G% c0 U0 | writel(temp, IO_ADDRESS(MDCTL15_ADDR));
% Q- z8 c9 q m4 B1 D temp = 0x00000003;
) }1 l4 X& o, E0 D) H writel(temp, IO_ADDRESS(PTCMD_ADDR));
4 p' w. ^% M/ }; r6 K/ @5 G5 J" b
2 [+ Q& {3 z+ R+ q/ t temp = 0x001FF201;
) p x2 y4 X( b- u5 N3 g5 d writel(temp, IO_ADDRESS(PDCTL1_ADDR));3 X% _9 P8 A0 _0 V! x: Y7 v
$ K; L$ y% Y1 }4 B5 L- I# \4 P
//PINMUX
9 f: j$ Q9 \( D, \ //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
" d, Q8 d5 [# o0 ^# {1 F PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); : Q' T, H& `5 [, Q/ D' [( i# o
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
+ a9 M/ @) y4 j5 a R5 Z( F4 f! w writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
% K9 N% I- }% `
! ~& ^" a& F. P0 N4 Q! j# ? //SLEEP_EN,EPR,L138_SHK1,L138_RC
) ^' s% X, y6 d! j9 ]; k/ e3 Z& ^ PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 3 h- ~/ R: M7 h {$ n( s; E9 l
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
0 U2 F% x+ } y9 ]4 `1 p writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
) v7 U. _0 M% Z9 x3 T& E( L
7 C! R" U4 g& b! O: F //RESETn,L138_SHK2
+ d4 O' D3 T# g( b2 W; | PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); , C% r3 m. \/ B* Y( T. I6 j
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; 7 V% |7 ~4 e. c r- P
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" e4 K- g' ~" a" Z+ Q- b* I
: ?6 C I# n; J3 z
( Q) l* [* Y' A% _4 y9 B //SPCR Register
& F" t; q8 P4 z( L# Y5 H9 ~- s8 r9 k //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
0 w6 ]( F+ `0 t! M* L s# `4 M temp = 0x03000000;//(DLB=0)7 k6 \# x# P+ w) L4 y! S
// temp = 0x03008000;//(DLB=1)2 j6 c. X* a( I* Z; ~* Q, e
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
/ G" ` s# ?6 V( ]) Q) J temp = readl(IO_ADDRESS(SPCR_ADDR));
, N* `6 B9 p, j* i$ j( p7 a printk("temp=%x\n",temp);9 B, X8 D G/ W4 N* s7 x1 O
" V0 e1 R" o7 f/ p& j, o8 q# z2 l //PCR Register6 ^: n+ ?( @' A% D, n. h
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
2 d% a2 R5 b& x: ^1 s: m // temp = 0x00000F0F;
- s: Q- n* ?0 F( @, T: q temp = 0x00000B0F;3 p1 D. G( i4 f0 j9 h5 f
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized / |2 a% ~: [3 t# J
temp = readl(IO_ADDRESS(PCR_ADDR));
6 P, b* \9 s- L! ^' |8 O( y! Q3 g6 m printk("temp=%x\n",temp);
' Z! I% `/ {1 e/ n* b" ` //SRGR Register o+ b# y; R7 K" S# B* m
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
; V, v' Q, X. } //temp = 0x301F000B;0 _! n# t, ?6 _! Y0 C
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
2 `! w: ?8 u4 q3 ` temp = readl(IO_ADDRESS(SRGR_ADDR));
4 d2 K; U, `$ F A printk("temp=%x\n",temp);
$ s7 X2 Q# ` o' q //RCR; D! H5 S' g1 i* m
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,- q% u9 c* e/ W& q& Y, R2 f/ h p
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
/ L: R- w+ _9 l. \ temp = 0x00440040;
- I; p) D4 y+ e/ M4 c m- b writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
, j& u$ {+ f9 ?- h0 S temp = readl(IO_ADDRESS(RCR_ADDR));) U3 \0 c4 \, X6 P! n
printk("temp=%x\n",temp);7 d0 T! y/ |/ K6 p( y
//XCR5 A9 T6 i: E, q5 h! N6 N
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1: ^' d0 {4 T- G* u
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0* X, F% c: `+ u& }* t9 T
temp = 0x00440040;$ b, p3 u- D. b& n# j6 g) g
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 0 s; n" S- n: x( i0 O, X. f- u
temp = readl(IO_ADDRESS(XCR_ADDR));0 H+ `2 S7 v$ Z% f
printk("temp=%x\n",temp);
9 W# n+ \2 X" `2 V2 M, k udelay(100);) @& x, U, x4 }8 d% H4 A
//SPCR Register
" e- [2 }( f2 a& n5 |) N& k //FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1! t5 m4 q$ N7 D, T/ P% Z
temp = 0x03C10001; //DLB = 0 VS DLB = 1$ L+ q% v% l5 I. l" [: L: C& T
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled H! v" F" w; e A8 i( \
temp = readl(IO_ADDRESS(SPCR_ADDR));
; B$ p( ^ [8 i6 G printk("temp=%x\n",temp);1 u1 P' D _$ {* _9 B: s
udelay(100);
# t( p5 A: k9 x/ N f4 ^ B# C R" m0 V; Q- m4 z
//set GPIO direction
0 R0 S& a& z/ X3 r& V temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));$ z( N# M2 M! ?( K# `6 e( G6 [
temp = temp | 0x00000100;//EPR----input1 P$ [" L* H: r
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
6 p: G$ v; N6 u" q. _5 X6 A __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " |9 [; \+ e% l2 {
& a& v O. C% o
return 0;; {% I! q* e! y7 [% ?
}- B( | b J) U" e+ ^6 ^
static void __exit MCBSP_exit(void) {. O+ x2 ~: m: j
{
' x4 O! B# _6 E8 B" ]5 A printk("mcbsp chrdev exit!\n");0 r* o4 _. d( r' I1 K& }: h4 m
cdev_del(mcbsp_cdev);) U; f0 X: x# [* i& O; ?$ v4 J
unregister_chrdev_region(mcbsp_dev,count);: f0 L3 O5 A/ b
device_destroy(mcbsp_class,mcbsp_dev);0 M- I4 Q) F$ p# W
class_destroy(mcbsp_class);9 ? s+ _5 C/ h' t, E, j
}
- w/ S- h" @3 Lmodule_init(MCBSP_init);
: z- m/ l8 r+ e( a$ Vmodule_exit(MCBSP_exit);
6 ?$ u/ @; t! l+ _: O& W) C2 s6 ?* M+ _- G2 g3 m
MODULE_LICENSE("GPL");
% z4 r) j& G5 I$ I" E. V. r2 _2 H& c9 N# H, c. M5 N( l
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
* e2 o( H2 b2 y0 k% a我的应用层的测试程序如下7 k6 q; n8 V) ~7 F) V
#include <stdio.h>: D( A3 e7 m1 {* L! L5 m
#include <string.h>
4 ~, V. A& [% Q q* _ Z#include <fcntl.h>+ e) x2 H9 D h; X) _
#include <unistd.h>
2 |. h' S7 C& g2 b#include <signal.h>
% H. l( l4 ]4 f" |/ T# u#include <pthread.h> //线程
5 ?. s4 n+ o' K a/ f+ l" P- N#include <stdlib.h>
3 t# ]5 S7 t9 U& C#include <pcap.h> //捕获网口数据
* O. R0 F9 e# h+ H#include <semaphore.h> //信号+ z: D9 Y; i: P9 ~8 o
#include <sys/types.h> //消息对列
9 ^' U$ t; Y5 q% w" x6 L1 X1 t% q#include <sys/ipc.h> //消息队列9 m1 |% Y* I7 r( r2 t' R6 @6 `
#include <sys/msg.h> //消息队列
: J8 Y3 X3 a/ I8 z# Y$ V#include <sys/select.h>' [/ N) a' w& T/ r( p% O& b
#include <sys/syscall.h>
- z; |% E" Y. Y#include <sys/stat.h>
j& x- w0 t* H% C5 ?#include <sys/mman.h>
( F4 @. U/ s5 i( ?- A( A#define msleep(x) usleep(1000*x)
) c$ l* I! h: X' ?3 S
/ n& q: }2 `) Y" c, dint main()- ?0 C5 j9 `2 i2 V7 u8 i
{ 1 s: B% j8 a6 W& z. U
//MCBSP,ARM与AMBE2000交互设备0 D( G1 w+ U# F. o: G
int fd;) r! @5 D$ S# \7 K$ {
unsigned short data_write = 0x5555;
8 x) o) v, X$ n" s4 a4 o unsigned short data_read = 0x00;
4 S) F* `2 E: I- }; U9 x% |6 n fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);( d# u. z7 R. Y3 w. f3 c9 x2 f
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);" R+ k9 J, \4 Q. U2 U
& e* o& O$ j6 T: e2 v, |
if(fd < 0)- w4 {. I! O2 r: `' F
{0 ?/ G3 p4 Z2 T7 N- ?! }
perror("open failed\n");
" D: G7 @6 x& L return -1;- o3 u5 p* W% [$ N3 \1 B0 |
}
/ P% N+ K6 | f V" I5 P
! ~( k3 c' V+ F/ c2 |( F& N4 z! b while(1)
+ ^+ M* O1 J, ^! f5 h8 A m {( [" t2 I/ A4 t
8 k# t. n$ y1 F, F2 i6 k% `2 e //AMBE2000每次读写是24个字为一帧
) y( b2 [9 {+ z# i //写数据时将数据在底层存储起来,等到中断的时候再发送( s3 n( ~5 o5 A; `
//AMBE2000输入数据是以0x13EC开头的
: Y7 `' S6 Z& `" `) Q4 l: T write(fd,&data_write,sizeof(unsigned short));+ E) ~$ q* W5 R+ o% A
% F& o% Z9 J- K //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 4 \" C8 l1 y, S. P0 m' o" s* T
read(fd,&data_read,sizeof(unsigned short));: c7 Q7 D; l0 X4 K+ T1 s& v( T
, c0 @. _# C3 U
if(data_read == 0x13Ec)) n) a; F9 Y6 C/ U& i
{
8 k, J2 }" _* x& H+ a { C: u - R5 [* p6 V/ o4 ^: z) g+ N7 C
printf("data_read = %x\n",data_read);
$ ]) y+ n3 q" s$ |! t2 b, ]! E }9 ]; d) e$ S2 }6 n! {- ^
`: y' o f Z" Z2 G1 M1 F( { msleep(10);
. v& v' w4 f$ W' N Q $ L! @3 H0 }( L4 ^6 n
/*
# F/ X T+ E8 { ioctl(fd,1);
* O. \7 {* u/ j7 g5 m- D c$ t sleep(1);
* \! k# ^! E1 g% H( _0 U- z7 Q ioctl(fd,0);
+ C) F! y4 Z4 T sleep(1);' Z- x+ w/ [8 l( b" b1 M- S: S0 Q3 c
*/
: t5 a6 `2 {+ K4 D P& R }
/ W/ y3 ?5 N ^% p0 w9 ^2 J& ` return 0;" h2 y( R' H4 l/ J9 D
! p5 C) G7 l7 _5 L}! D o- v6 y' I/ R$ O) k
/ Y6 k2 j5 h' E Y1 r. d. S& i
多谢各位指教,谢谢! 急6 `3 Q" |8 n( e0 p# h. _
, P: L9 n* |% [, c% h; W Q9 \' c' S5 g. u5 z, ], ?1 m
& S8 _8 S6 ]! P; U& W+ C/ H* D6 z$ P/ J& @, F( x" `* m9 b' A
5 B. j( J& D& m- C
|
|