|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
( Q5 H h- P" K" g4 {- A- L/*3 w( g+ R% V' r
* Copyright (C) 2009 Texas Instruments Inc/ Y5 W% A) s. M' v4 W
*% ]( y$ o3 l% {- {; N. a
* This program is free software; you can redistribute it and/or modify
% z% k) e+ B; B) Z, @9 i * it under the terms of the GNU General Public License as published by0 L7 `3 O4 D( x0 H0 x7 o; }
* the Free Software Foundation; either version 2 of the License, or- T& M$ V* X e9 x! c" Y
* (at your option)any later version.
8 r W! s8 u) k* B- ?# @* } *. m& w( A& N) z0 l4 f8 C3 k
* This program is distributed in the hope that it will be useful,
% X. H l( D7 U, S# Y * but WITHOUT ANY WARRANTY; without even the implied warranty of( r/ c1 \2 X0 N
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
: o* N9 a5 X" H4 K * GNU General Public License for more details.
8 c" F" S/ q' O% v& U */ d( _0 b3 E- M/ t7 f9 W) t
* You should have received a copy of the GNU General Public License
# M! A0 _3 f1 m) D& J8 ]% e * along with this program; if not, write to the Free Software
8 N3 a$ a/ H& t! z0 x% n4 \ ~ * Foundati
3 z4 A5 J' f; f3 a*/$ d1 k0 C- [$ ~, w9 @1 c
#include <linux/module.h>
8 }7 E3 X3 h3 q( {; m0 R' B#include <linux/init.h>8 N& G; |9 i8 y5 t) P; R; t5 Z- J, \/ `
#include <linux/errno.h>
! Y4 v. p1 @' l- H! V#include <linux/types.h>0 Q( j- e% Q8 E* h; Q/ W
#include <linux/interrupt.h>
6 T# I- r$ j2 ^9 G v#include <linux/io.h>
) T, X( O4 r+ ^! p8 w7 L4 N#include <linux/sysctl.h>
5 Y. S) F5 y, [8 E% n1 \: S#include <linux/mm.h>$ M: G! y3 f4 e* `$ c
#include <linux/delay.h>8 b% O1 b# v2 e
#include<linux/kernel.h>" X" x0 s* {8 z% n2 q' }
#include<linux/fs.h>
- v6 P O" Z$ ]: h0 N$ |! H* }#include<linux/ioctl.h>& C7 B \$ H+ C- G5 ?$ F
#include<linux/cdev.h>& I/ D; r- P. |' B$ U0 a
#include<linux/kdev_t.h>5 z9 `9 ^0 F l) Z% d
#include<linux/gpio.h>- O3 R9 k3 \& r0 S. O' r
#include <mach/hardware.h>( q: f3 \1 j- e" o B5 z
#include <mach/irqs.h>+ c0 `$ x% _' \. t& w X3 Y
) P' u. \( @: Y#include <asm/mach-types.h>, o2 f' O3 E% b0 M) |* M6 ~
#include <asm/mach/arch.h>. X! B: s7 U$ f7 {- e
#include <mach/da8xx.h>* y( z- L+ }1 m4 @1 b1 a" _& f% f2 A0 U; P
#define SYSCFG_BASE 0x01c14000' W/ r0 X! i, H- f
#define PINMUX1_OFFSET 0x124 * x# ]2 t5 J( E3 ^4 [1 I# h
#define PINMUX18_OFFSET 0x168
, ?0 V3 m8 s. m8 v#define PINMUX19_OFFSET 0x16c
# Z, c) P' v8 e. g& |; V#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR
; h0 |' H, F8 R% o+ h& I/ k; z#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
3 K( Z, R& n R( Q#define XCR_ADDR 0x01D11010 //MCBSP1_XCR+ [: `) G% |/ S: O; ` W; ?
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
8 F5 K1 A1 g& \, E: S- L" }# |#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
' [$ M$ |, W% q . R4 W/ K- G6 ?8 T/ m
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
. y* X1 |7 s; [; @ p! ]) n- F#define DRR_ADDR 0x01D11000 //MCBSP1_DRR9 \; o) l# e/ W
//PSC( s4 D; G2 a8 h5 m2 B" q# x0 ~" R
#define PTCMD_ADDR 0x01E27120 2 }* n. }2 A/ P
#define MDCTL15_ADDR 0x01E27A3C
/ n2 a% I3 D2 Y#define PDCTL1_ADDR 0x01E27304
7 t+ Z, N5 d- N# r//GPIO8 direction
. A; A+ r4 Z/ M3 X! _6 O: N7 F#define GPIO8_DIRECT 0x01E260B0
. A o: ~) s( T4 D% @1 i, M#define GPIO8_OUT 0x01E260B4
0 a1 E$ g3 o' `' F( r/ `' ^ x#define GPIO8_IN 0x01E260C03 ?0 _; S& o- w9 O
1 u( |% |) O ^6 G; z5 a% n, k
//#define MCBSP1_RINT 99
* ?) A- @5 g8 C' F# p9 ?+ i( \//#define MCBSP1_XINT 100
/ N) b- Z) e6 j7 L' `9 q" i, Tstatic int MCBSP_MAJOR=239;% J! d. B( g+ D1 t* _7 x1 x
static int MCBSP_MINOR=0;
6 i# A5 w7 V M7 ` rstatic int count =1;+ s9 N" D4 V4 h! n6 i% B9 Q* \! a
; ?$ ^% v5 H( ?
#define MCBSP_NAME "MCBSP-device"
$ g! |9 E) q% V9 h* V) e" G* D% P, s5 b: v7 V+ c `
static struct cdev *mcbsp_cdev;1 ]% b$ [* M* X) \2 y+ ~" w
static struct class *mcbsp_class;' @! m4 l+ m! V
static dev_t mcbsp_dev;
: `8 V Z2 g, g. C# x" _unsigned int DRR_data;
6 ~! t( \- r |3 [! m0 |unsigned int DXR_data;& A; T, X! P" S+ I! ~# ?; e7 _
static int mcbsp_open(struct inode *inode,struct file *file)# M# G7 L- { \5 r
{
( c5 I3 T. G% a; d( ]( k: y - h- k# U# G7 s/ Z0 }& |& J& B
//interrupt enable,initialized0 Y* G8 p7 F' ]4 b
unsigned int temp;
; w6 T D8 ]$ ~ f //SLEEP_EN(GPIO8[10])---0
7 ~' m2 s4 E! x2 s temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
6 s% T# D7 u: E4 z/ g: i temp=temp&(~0x00000400);: W2 j) {( N7 n& @' J$ C$ h8 e7 R
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
* u" f5 I7 O" X6 `- e( }7 e //RESETn(GPIO8[8])----0----1
' k7 t) U& g- A! \) x9 y temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
, E9 a, J) V, h; Y temp=temp&(~0x00000100);
( }5 E5 G# d$ [" | __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---09 N$ m4 Q9 M& G- J
udelay(100);
; g! x6 ?- Y* d3 o temp=temp| 0x00000100;
% ]1 \/ n& p V9 x4 k __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1$ S3 w. V1 |# |5 O! d3 r5 ]
udelay(100);4 y( X4 `' s# c- t0 _5 Y. W
printk("open success!\n");$ r; {5 \) Z) F Z0 k! B$ W; K
return 0;
+ D) o9 g6 v3 V5 b}3 N) S- L, B* J7 O; u# S3 ^
; C( ~7 W$ l; Y6 y
static int mcbsp_release(struct inode *inode,struct file *file)' v# r9 V8 U& u5 c a$ g; @
{- I' [; j1 N. N4 g% \7 [% j* _
printk("release success!\n");3 n0 X0 ~: z) `9 R- g5 }+ K7 \' p
return 0;1 S1 C2 O d' a+ `
}. [* Z2 M: \7 q, v# h
" H, J* V) u$ v9 j3 g: gstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)
5 D6 Y) J# w4 b# x0 V, B{+ n$ \* Y7 m2 R2 b' e
copy_from_user(&DXR_data,buf,len);
6 K$ ~: H0 t; n, r8 ]) b: C$ W iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR));
* m, }, ?' H* u4 F! J, o return 0;
/ c% e5 I. b* S. b8 T , [$ _9 I" P: S5 X! Q$ Z
}8 f: M3 i1 Z! B0 I F7 F7 R: }% H+ c
- w6 h- y. ? r0 x* ~static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)2 o }+ y7 A, L/ z2 E4 Z6 G
{
m* ^$ {6 }- {8 F( X DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));( C2 l- ~& h8 P& \" k
copy_to_user(buf,&DRR_data,len); }* s+ q9 y$ i( m$ s7 Z* k
return 0;
" H+ d, u5 Z" B M8 x$ @' ^}
! o$ t& n; Y- C+ L& c G/ H7 C$ ^8 G! }9 G/ u
# b1 F; j4 m/ `4 cstatic struct file_operations mcbsp_fops=6 R0 }3 g& i/ j5 }+ _/ L9 @+ u. E
{
+ i7 R7 _ {6 G! a .owner=THIS_MODULE,
% ?4 F ^0 r/ w1 j# c! | .open=mcbsp_open,
# I G, O; T X3 Y .release=mcbsp_release,
" \/ c! K2 [& o- I3 L .write=mcbsp_write,8 t4 Q, _$ D! F- D* E% K$ e. _1 y& ]
.read=mcbsp_read,
9 R1 r8 O! ~# U6 q2 M7 b5 W};
4 ]) N3 g) N( r! o/ [static int __init MCBSP_init(void)+ N2 s; l& J) G9 W6 x0 C
{3 S+ Z" ~0 o: R
int ret;7 a: B% V% Z! ]' p
unsigned int PINMUX1_REG_old;2 v# G, C7 r! ?9 d' A
unsigned int PINMUX18_REG_old;
; U$ \4 d1 ]" m2 m# ? unsigned int PINMUX19_REG_old;1 a) Y1 @1 W: K" M- H1 ~
unsigned int temp;
' L1 e7 R2 c: U! Y. U0 X if(MCBSP_MAJOR)6 M7 b0 x( S1 u1 C4 y$ w) N
{( S0 v# [& F' _2 S
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);
: X! d9 w+ y, d* j; [ ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);2 i) x' e4 _! m" Z+ _$ ]3 b
}
# N2 F$ ^; `7 [7 l7 `7 S# q else
! D: i! V7 F5 `: X# L* S7 P9 V3 \ {/ T3 H& X% z/ `; x1 i) I' r
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
+ h" f0 X' b* Y- N" \7 j; D: t MCBSP_MAJOR=MAJOR(mcbsp_dev);9 H+ Q8 X8 `( k" W" F
}
' H# t& E# X4 @% U2 g * \6 h2 l( y7 x2 p" w
if(ret<0)" s1 O+ B( v9 U3 v' o
{
4 c- R$ t5 |0 S printk(KERN_ERR "register chrdev fail!");6 q% L1 B e$ a1 c G2 T
return -1;% ]5 c. G4 O4 z; X! A! R
}7 w" ~- T' z( ^1 @* X
- Q% n$ T s$ b
mcbsp_cdev=cdev_alloc();* X; n, P8 M* x' n, m2 X+ y) L; ]- ]
: c' G0 A1 J' z1 f: \4 l
if(mcbsp_cdev!=NULL)' _; t2 K9 T# g/ F+ d
{5 a( ?; u- g* y) C0 {, b8 o( n
cdev_init(mcbsp_cdev,&mcbsp_fops);& A f5 v; P' m/ N, N. @1 a1 n: X
mcbsp_cdev->ops=&mcbsp_fops;: d- y* D, R5 b) U2 f( d
mcbsp_cdev->owner=THIS_MODULE;7 M+ P; @2 r$ {6 d2 j: I! F
3 K/ E1 p8 {+ V+ l- A1 u
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))
- H, |+ H. }. O- d! r/ ? printk(KERN_ERR "register cdev fail!");# V( T. ]. E+ }) f% Z* L- ]
else
' \% U0 f; M( H& ?5 I' \9 j8 z printk(KERN_ERR "register success!\n");/ d) Y0 L" X, Z! l& r0 S, k4 x
}& I3 [% O1 g4 U7 d7 B4 n& A
else+ t D( n! d1 x# E
{
7 P) m p( B3 l" d printk(KERN_ERR "register cdev err!");. U! w$ i" p j$ o$ v
return -1;3 y, v6 h. M9 c% T8 s
}2 ~8 J, u) ]% C
D _; F4 [1 q) o9 b
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);. U" C2 Y. W1 ^5 r& y$ @/ {: E
if(IS_ERR(mcbsp_class))
0 O6 `, ?' R F0 a! s {
! E* v3 k' Y# [ printk(KERN_ERR "register class err!");
" {( q0 g. _* M/ y9 ~* ?. r7 r0 e return -1;% c) m1 S' ]$ G$ S9 z6 l2 m
}, E8 u+ p6 l5 l+ i7 A( v
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
0 E5 v( _" F' N- p* h
$ V b1 \" ?& ?% ^; w/ z* K' F //PSC5 N" O k" s" Y# E+ e
//add Enable MCBSP. |2 T8 [1 `/ g3 W$ {) |5 v
//test
; L, D7 F# h9 ]1 ~) E0 O2 | b7 P+ g temp = 0x80000003;" T M: |* i3 r
writel(temp, IO_ADDRESS(MDCTL15_ADDR));
; _7 C+ t% H0 ? temp = 0x00000003;
1 D8 J0 ~2 u/ n e. I4 R2 W% q writel(temp, IO_ADDRESS(PTCMD_ADDR));& u* a, [& ^! D7 T1 a3 d
, d% y. p, E- Y temp = 0x001FF201;
! F& L+ I9 @0 }3 {/ B# m writel(temp, IO_ADDRESS(PDCTL1_ADDR));
9 M. [1 w U! O l , p0 \1 D- \# { i& R, E+ M. a6 a+ |
//PINMUX " ?: K% s6 k; r' R) c' ^
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
! V1 z5 e: W& {: H6 g. h3 [ PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
& ^: R- E% T' h" l" `; ~ PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; - B; F8 d+ o, l& b
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);& L8 U! S: d4 O1 ?5 }1 U$ Z
9 S* }9 O9 ~+ d9 N9 N" M
//SLEEP_EN,EPR,L138_SHK1,L138_RC
( l$ r5 T5 o' V PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); 4 M$ k, {3 L. Q! {( T
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; - l/ l- O) H" F' u, E/ h/ T' @6 X
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);7 w4 i+ R7 p2 ]7 M
* g- U% s- y2 [ //RESETn,L138_SHK2
) o" ~2 ]6 B& W PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); ; L7 I% _1 c2 w, J1 i9 N
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; ; k: @6 `. b0 F: C0 Y
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);" q5 T$ A! d1 j1 Q
, }( J1 u% M: i& `; ? / K$ e8 J4 G, r8 A6 R% k0 Y
//SPCR Register7 A8 t2 U3 d- X' E' P1 t4 `' }
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset9 x2 j1 S7 O) I$ U
temp = 0x03000000;//(DLB=0)
: E- {* ]2 I- G // temp = 0x03008000;//(DLB=1)
# R+ A k4 \: E5 @ s, W( @ writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
L" L. n Y; Z* _; r! k$ C temp = readl(IO_ADDRESS(SPCR_ADDR));9 Q! l; a5 t6 e0 e4 @$ T
printk("temp=%x\n",temp);
: }9 F! y9 [7 T: ~9 x2 O
/ {7 }% D! n* t8 z7 }* I //PCR Register
+ @" F+ o. W/ M$ |# m2 d, x5 k //FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-04 X# I3 @) r7 ^4 M! l5 r
// temp = 0x00000F0F;
* K/ _; A; h' { temp = 0x00000B0F;
# ?; {( u, G9 Y O0 c- P) | writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized $ g" y4 c, E* R5 C* O! B6 M9 p( |
temp = readl(IO_ADDRESS(PCR_ADDR));' b T/ ^3 @ n/ |6 ^
printk("temp=%x\n",temp); 5 c- \4 P) [- m; E& C
//SRGR Register( k+ t+ r* _. k9 b' @
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11/ \8 s- y/ ?$ [
//temp = 0x301F000B;
5 b) |# ^/ l$ o. p writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized ) @4 Y0 F: t# L4 q2 Y3 Z% P
temp = readl(IO_ADDRESS(SRGR_ADDR));) T' j& G1 J E% Y: u: o- S% K) [
printk("temp=%x\n",temp);
; Z- `( v0 V2 ]/ c //RCR
2 v7 |' o0 W h9 P, G; B; i/ J+ l7 L //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
8 P; W3 O$ ~, U* L3 p* }( u6 a //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
) h8 u- N$ a4 p: @ temp = 0x00440040;; J7 k6 b" |7 p
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
) Y$ G' `: e6 S) o temp = readl(IO_ADDRESS(RCR_ADDR));
- I$ d1 w% g! {( M8 Q( Y! d printk("temp=%x\n",temp);4 q1 @# @: u+ w& u4 w h9 R
//XCR
- T4 x1 e( j) J //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
' w0 g) V. }& b //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
; Z$ o& Q$ b" e4 E: E4 ~8 v temp = 0x00440040;
5 v l" z, O$ m, S writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
. ^# J0 p4 k8 t$ ^) Z temp = readl(IO_ADDRESS(XCR_ADDR));
3 {2 h/ l; \ y3 d$ t' v( ]! G printk("temp=%x\n",temp);
" c4 ~2 l" a8 V6 ?2 @: |+ E udelay(100);
6 x' p! ?; |: t) z0 R //SPCR Register3 _& n! L3 a7 d$ x- D. K9 x
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
0 Z1 G' w5 T5 {5 m7 H' f4 [; x9 V+ s temp = 0x03C10001; //DLB = 0 VS DLB = 1+ v8 h1 T+ O. v: P! F8 t5 r
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
% e- T# R+ u) P0 B- s6 j temp = readl(IO_ADDRESS(SPCR_ADDR));
* x1 ~* G" P- f% X printk("temp=%x\n",temp);- d" F" G+ V& n6 n4 N+ g7 p
udelay(100);+ S- G) ~8 y8 q) u
4 {( y. M" T" m- q
//set GPIO direction
# G$ }) {3 g4 u c2 E* x( ` temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
8 l9 j- f2 ]. O1 a3 D, T8 t @9 q temp = temp | 0x00000100;//EPR----input9 C, v, |' j- O0 y+ x6 J8 N
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
: x% c0 d6 C9 D5 l __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); " `$ ^# M4 e: C) G1 E
, P1 ]" V" {, Q. d d: P$ }
return 0;6 h: T* m8 X) \. O% H. Z9 \0 ]
}
* o- q( b5 @/ H" F) `, @6 estatic void __exit MCBSP_exit(void)7 O" R1 h+ P T. d$ R
{% G, u. j" D0 J6 M3 D
printk("mcbsp chrdev exit!\n");
6 q6 P1 u/ ?7 \ G6 O cdev_del(mcbsp_cdev);- C+ l9 b" V+ R
unregister_chrdev_region(mcbsp_dev,count);
1 i9 ` U- Q& s9 H* G" L8 Q( ~1 j device_destroy(mcbsp_class,mcbsp_dev);
$ [1 a5 e3 Q1 H% @9 P M class_destroy(mcbsp_class);
: x; p* q" J* E3 f3 F}+ n F& |" l% X4 i: o
module_init(MCBSP_init);9 E3 `/ B6 W- P" h% K6 L
module_exit(MCBSP_exit);" K$ `- z& `9 i& N- v
. S4 f% s. ?: e" W7 A6 z! ~MODULE_LICENSE("GPL");7 W ?; `" Y6 F- ~. ?8 |
0 z( c( w k. D2 D" F
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。2 o2 `+ b$ \0 [
我的应用层的测试程序如下
9 C) F7 Z* m i#include <stdio.h>
9 j& z& Z9 \( r#include <string.h>
, t! G, J4 I' ]1 E) \7 J- s3 J#include <fcntl.h>
* }% f+ b0 B# N- C#include <unistd.h>
; U6 V) }2 d' x% j& M- O+ @' ]#include <signal.h>, U, h9 o; ^8 H9 E5 K
#include <pthread.h> //线程9 \0 x* ^. M( b3 g
#include <stdlib.h># u! r' L, f5 Z& b$ v4 } l& O) m
#include <pcap.h> //捕获网口数据
9 i2 Z( Z6 s7 g3 J* W- b5 i#include <semaphore.h> //信号
3 b* I2 P5 P% N#include <sys/types.h> //消息对列& n; ]1 L; E9 l# R
#include <sys/ipc.h> //消息队列 t/ I8 Y$ [5 a5 S7 ]+ ]' k
#include <sys/msg.h> //消息队列5 W/ M6 K ~. e5 M5 G ^& S1 R
#include <sys/select.h>) p5 A9 [: L( @! {/ x7 L; i7 P Y4 u
#include <sys/syscall.h>- D0 y- r# I7 O* _! y
#include <sys/stat.h>6 q2 S3 z* p( w' M
#include <sys/mman.h>
0 ~; M. R5 f9 C( N1 i#define msleep(x) usleep(1000*x)
' i& z& u1 R7 I- v% y- \4 N& D& T) e
e9 W; p0 X) P/ h* l) F* u3 ?int main()
& T6 U! `7 o% q' [6 q{ 5 n0 f, `8 r: L( T1 I5 p) g' W$ A
//MCBSP,ARM与AMBE2000交互设备
4 f9 s* ^9 N8 ^ r, t int fd;
# A5 S+ [' O) c* P7 Y) ]- s! G unsigned short data_write = 0x5555;
9 m* x0 I8 T2 U8 {/ { unsigned short data_read = 0x00;% E+ ?+ v0 P- I l3 k
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);, R$ A; s+ D% ]2 W _/ T
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
3 u0 z* B5 T2 O$ ^7 c u * g, ?, D8 l5 | ]7 |0 `/ Z! s" M @
if(fd < 0)0 Y* p3 ^! D C* g
{% C) U0 ]8 l: R' e$ t( X; u+ F1 Z4 M
perror("open failed\n");
% g2 t$ u1 A) O+ x return -1;
* ?; o# ?1 G: x) B! L) ]8 w: @ }
& n- m6 e8 V- e, X- c+ y
$ x* C4 d* B( k! [ while(1)
( z1 X# C. _; b1 y. m {
4 ^( E) O, Q' q- i0 r/ z' _
$ P6 B; v1 A$ M) r0 R6 G1 a //AMBE2000每次读写是24个字为一帧
5 {, w# t, G) D4 H //写数据时将数据在底层存储起来,等到中断的时候再发送
# Y6 G" A; w- Z. B, V' A9 H, f //AMBE2000输入数据是以0x13EC开头的
7 m0 I) h+ w6 v5 T* C+ H% Z: u write(fd,&data_write,sizeof(unsigned short));5 L& ^' D: `4 [7 t6 X/ e3 ]$ e
1 }5 [7 L ]. L& ~! A //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 2 n# M( Y; w" E! j7 w
read(fd,&data_read,sizeof(unsigned short));) p: ?' e3 c% n0 u6 G6 t
& `! q0 [ H+ s7 n$ F7 E: X
if(data_read == 0x13Ec)
! G, b* M, [- y% t# x {
1 a$ G; M. ~6 o: l* j 2 Q* R5 u7 \6 T0 P1 i
printf("data_read = %x\n",data_read);
: b: p: d1 U; I6 q- Q }
: Q% ~- l7 X. K4 a ) [' ~' R) W- m& t
msleep(10);
. F1 |; O" Q- `2 B
+ D- X6 g$ s' N" ~" t- R1 S. K /*
6 _0 N) j6 C% B% r! D8 B0 ~; t& t( B ioctl(fd,1);
* k9 E, P! D; m! h/ H8 |& J sleep(1);
& N, } C6 q2 e. b" _' T* [# S' K ioctl(fd,0);; F1 }4 H9 e+ P
sleep(1);
% ~- w& u) r/ ?9 s6 o; x, v( {, G */
* O# o- D8 |9 m2 ? ^. U; t9 a" H }
7 K& T, R% M$ ]. p' W return 0;5 ~9 Q8 L. C ^. E* M! a, U4 d
) p1 v6 M% L% n- q" \' b2 o0 F! }}
" Z9 g0 U6 Q, v4 t1 b$ m/ p4 G& `3 ?4 u C. b
多谢各位指教,谢谢! 急
% _9 w% u( b% n6 C! ^/ @5 d3 \$ q- m
% D! _, F2 W' g* n) p6 R3 s7 i) \) U# a/ V1 E1 b' m
" p4 `3 L* z f: ~
Q( H. O+ x ^. _+ H5 H
( {' s/ Z' Y V- ?* \9 ]+ C' N |
|