|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
! W4 n2 Z# K/ f2 [/*
6 @: o7 }; g( E! v; Y9 _- i$ N' o * Copyright (C) 2009 Texas Instruments Inc
) k1 t, }3 X: J6 o* ^ *
& U( y4 X6 R9 w * This program is free software; you can redistribute it and/or modify
% o. X6 g- M) \! n' {7 U * it under the terms of the GNU General Public License as published by
+ W3 A7 W8 q$ ` * the Free Software Foundation; either version 2 of the License, or
+ @. l0 K8 A3 D( b$ N1 B * (at your option)any later version.
& z+ N8 y2 @3 s *
: `5 m) P+ y. e2 S9 q8 C * This program is distributed in the hope that it will be useful,
5 h8 | q$ _4 r b5 w4 t* F * but WITHOUT ANY WARRANTY; without even the implied warranty of
. N1 d# T e" M% P* G6 _8 T * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* [: k/ G* B6 p- q9 @& b S2 T
* GNU General Public License for more details.: P' Q3 b! @" i, u! s5 e% [# }$ n
*
+ G( _/ T% W7 f * You should have received a copy of the GNU General Public License$ u6 Z2 @8 X8 ~$ o( h0 @1 K8 Q
* along with this program; if not, write to the Free Software$ w* Z. Z1 Y$ l
* Foundati2 ?7 T6 v# j2 C- B6 J+ v+ _
*/
+ _* J+ u. _2 f#include <linux/module.h>" w& P; Z8 T* X: R' a4 f
#include <linux/init.h>
1 h* b& t* X! q: D- n7 h#include <linux/errno.h>( ?. V. D c: W; y7 K" F* Y
#include <linux/types.h>
4 p5 y x4 e% O9 n& I#include <linux/interrupt.h>
% ^; [5 w ^4 I6 f4 ]0 i0 C. u$ e#include <linux/io.h>
6 c3 b6 x3 v* @#include <linux/sysctl.h>9 T6 `1 F* }2 g+ n
#include <linux/mm.h>+ `( _2 v1 B5 J- x; |
#include <linux/delay.h>" L1 _* e4 s* W, G2 e
#include<linux/kernel.h>2 ^4 Y |0 r8 @* { P, u
#include<linux/fs.h>
7 |2 O4 V; J: l#include<linux/ioctl.h>
; t! N' w% m& @ a6 t#include<linux/cdev.h>0 J) F2 n7 z$ \8 s4 J
#include<linux/kdev_t.h>: O4 w% l" I! n5 c4 D% g& w3 |
#include<linux/gpio.h>
* T; P" y0 Y. S* [$ y$ o#include <mach/hardware.h>
, W3 T& x5 y, l/ Y1 O: Q#include <mach/irqs.h>2 x# T% P1 z. G) l$ `
: h Q' g# G v
#include <asm/mach-types.h>- j$ C6 V2 v9 r" x0 n/ x
#include <asm/mach/arch.h>- s) b$ r2 J3 \5 P& _
#include <mach/da8xx.h>( U6 `) t1 ? L$ n4 ~
#define SYSCFG_BASE 0x01c14000; G9 ]; R( Z& f. U" {0 l
#define PINMUX1_OFFSET 0x124 , C* g! G% ~# v$ B
#define PINMUX18_OFFSET 0x168 8 Y6 u! H2 v7 J+ S% X- Q
#define PINMUX19_OFFSET 0x16c% I8 L, ]5 n" N! c
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR$ e. C. p, U6 P% v8 H
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR, A7 A- ], U; d, U# s. A
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR
; r4 w9 x; q5 `# m. O8 d+ T#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
z# e4 H2 V. }#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
2 L2 X$ X: _3 k8 I! s ' B7 ~: m ]/ k$ M4 N
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
U6 ^$ F/ ?$ p* _3 p) C$ S#define DRR_ADDR 0x01D11000 //MCBSP1_DRR# I- R0 H7 S# z- I3 B4 V
//PSC
" l1 c8 k. ~) W. A* a#define PTCMD_ADDR 0x01E27120
% o% S0 x8 r! ?/ P) {5 E3 V#define MDCTL15_ADDR 0x01E27A3C) o, ~9 E' q0 a3 [
#define PDCTL1_ADDR 0x01E27304
- k3 w$ n* J; C) n& L/ x( B, a//GPIO8 direction; j% A! v, y- C" F! S: f
#define GPIO8_DIRECT 0x01E260B0
7 X3 a5 N: {# g: S! M1 H; T- }% y#define GPIO8_OUT 0x01E260B44 Y3 s1 k) R [3 k$ W. o0 O
#define GPIO8_IN 0x01E260C0
/ V- h1 ^' i- m, K1 z* b- N# I& T/ T$ g% d( K: {( t, a/ T
//#define MCBSP1_RINT 99
. F; v% L2 h3 ^' _//#define MCBSP1_XINT 100
2 ?& X* C2 }- _4 X4 ?5 r. zstatic int MCBSP_MAJOR=239;* N3 ?. x1 w, | z9 V6 m; p
static int MCBSP_MINOR=0;
0 t- X& B) T2 c! [, l/ w& |0 Mstatic int count =1;2 v8 K5 K+ ?( _- y' \
3 H6 G8 r; R' e2 a+ N+ V$ d: k#define MCBSP_NAME "MCBSP-device"( l" \9 L' e; F) r' A/ L0 ^: J
6 m# ~5 q. D$ ^# ^% q3 O P# ^static struct cdev *mcbsp_cdev;8 c( ]2 R' E. r9 u8 j% s& R
static struct class *mcbsp_class;
6 q% {1 y, n( ^2 w, a! g3 Istatic dev_t mcbsp_dev;$ T2 @% ~. M& F- Q% Z5 Y
unsigned int DRR_data;; m8 N3 ]3 Y! I' @; V D* b
unsigned int DXR_data;
. _6 e' v9 G7 k, {/ q9 Qstatic int mcbsp_open(struct inode *inode,struct file *file)* w/ A# M$ a7 h* x
{
* T: q- g( x$ v) N( @ 2 j6 ~; C: n; Z8 S; j8 v
//interrupt enable,initialized
" G& \, J& U2 ~+ O: ~( H- X! l unsigned int temp;
' x. I. i$ T! P# V' r! s2 i //SLEEP_EN(GPIO8[10])---0
' M- i- _% G3 R4 E/ \& } temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));* ~" \" w; _% [% B/ ]& P! `
temp=temp&(~0x00000400);
" `; t: E1 I( m; w6 V5 B9 t __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
4 N, F( T0 F v" `* T //RESETn(GPIO8[8])----0----1& ]! ^& k6 N( @# G0 G" R
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));. j. e7 [- B) r0 S& `
temp=temp&(~0x00000100);
8 F0 \7 m8 `$ C7 M- @" F2 u __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0. c9 U$ G. D& b! e2 ^& F
udelay(100);
1 L. [$ ~& A) U: F9 y. O temp=temp| 0x00000100;
0 A' ?: E1 G* Y5 _ __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1
: |! E9 Q& s! Z udelay(100);
, k& G% A* q! D6 }! l+ D& f$ E printk("open success!\n");8 F0 i& X5 w& q. A! p& Y
return 0;
. t; Q* C% j8 O- b}# p: ^! C( Q) _/ ?
5 B1 k; A4 H( V
static int mcbsp_release(struct inode *inode,struct file *file)* d, u6 l- W$ u: y2 {/ b8 ~
{
9 k$ R5 u! g- A, A; l printk("release success!\n");* ^& k% b+ g& j6 c: y" @2 g
return 0;
( R3 ]) D- ]& D8 c: n}
# I. v/ \0 Z1 T: ]! f! s: s; o5 V, M% Y! T
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)/ j, U# p) Z( W7 d6 d6 T
{& y( R A6 ]7 X. ? x( T$ \
copy_from_user(&DXR_data,buf,len);6 I0 d2 `. U) h9 y' X7 V# S/ @! H
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ) _9 L9 r; k: F2 }
return 0;5 C0 ?1 c3 C6 b+ a2 [/ P; j
$ z2 K4 l$ y+ a6 S3 u! b3 R
}% u2 K) D! h$ d w1 |! O
9 t* y6 p# \' G {static ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off) w" ~" T3 F' d7 ^6 Z! T; z
{
/ k) k; ?# E, F+ Z DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
! k8 \ a0 A& G! b2 B$ e$ E# k1 T copy_to_user(buf,&DRR_data,len);
* p% |" t" D; J: r( i return 0;, a8 ~5 K4 ^/ M# w& d! J
}
( r9 z" g& R( U+ Y: v, @/ V4 ?3 Q$ s* ^' `; `# _- [
8 e2 B6 X5 S k& `! x/ Z
static struct file_operations mcbsp_fops=
, A% N8 p% a6 a) T4 c8 w{
/ x( {9 L) T/ s( R& j" o% s .owner=THIS_MODULE,* m& g7 ?4 w+ `8 Y( j. k
.open=mcbsp_open,, q; b- K, I, ?7 F, q0 d
.release=mcbsp_release,( C d; l" ~5 j ?! X! J+ a
.write=mcbsp_write,9 u$ u# {8 V( l) v' W% J
.read=mcbsp_read,0 I- P/ q4 p4 u+ e6 M' Q
}; e; F7 c: a( Y" I+ E3 |
static int __init MCBSP_init(void)
- T4 @5 }' t8 {2 s, t% `+ ^$ ~{! r) z5 V8 ~, [) l7 I. a
int ret;, x. z6 U2 i7 q
unsigned int PINMUX1_REG_old;
0 d' N8 E+ R4 {9 D! c8 x unsigned int PINMUX18_REG_old;
. i8 E* W8 @5 i5 K' @7 F unsigned int PINMUX19_REG_old;
; x: V- N' p& b$ j- W0 K unsigned int temp; 1 n0 R' u& l+ `8 `8 f8 e+ x
if(MCBSP_MAJOR)
/ L4 F7 I( I4 W, P% `/ m {# ^3 O( g ~) d9 d" h& g6 f
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);1 y' O8 d. X1 f% ]" d2 L2 W: T D
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME); D# g- Z( ^! U0 S# ~1 [
}
% n) |* F0 } i# u' ` Z7 ] else4 q2 i: K) A6 W1 F% M
{5 ~* [! T$ x& v) ^; S) G9 I: X
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
% C9 x' G- s: _+ U3 U6 } MCBSP_MAJOR=MAJOR(mcbsp_dev);
) f x5 K9 G! z6 } }& ~6 N# x8 z3 ?
& T7 i1 T/ o. q! Y
if(ret<0)! l. H5 g" f M) E
{% m* a5 T+ J7 w/ @; V! S
printk(KERN_ERR "register chrdev fail!");
" {% H% @. P& i, X return -1;3 Y* H5 U- R7 d
}
5 a* l) e4 x4 e 3 P" _5 r9 f: t. z% t1 m
mcbsp_cdev=cdev_alloc();
& M$ V7 Q0 ?. ^$ } & N) i( t3 s* z9 e
if(mcbsp_cdev!=NULL); S2 `) T0 O3 m f# L n v
{# U$ v8 ?. n9 M% ^8 f& k% E7 H
cdev_init(mcbsp_cdev,&mcbsp_fops);
8 K8 X/ ^5 T" O, f! {' X mcbsp_cdev->ops=&mcbsp_fops;
) y8 P' s! ^5 m( Q+ ~' G mcbsp_cdev->owner=THIS_MODULE;( c; k. \. V7 j6 ]. D: z0 h- n9 @$ b
; H: h+ o7 u3 _% e( h4 P, s: B$ Q if(cdev_add(mcbsp_cdev,mcbsp_dev,count)), J/ |; ]" d Z) Y/ I! g" g
printk(KERN_ERR "register cdev fail!");0 S- G, d) \ ^; {
else
, z) x1 C' v$ V0 { printk(KERN_ERR "register success!\n");7 w% c: j/ y" E/ _; M, r' b% C
}- F B+ m& y/ Y5 A3 ~2 N
else
# q( ~% v' w. f& R3 ?8 Q0 K5 X7 H {
0 E6 P0 M' |0 s5 j) Y% t printk(KERN_ERR "register cdev err!");6 Z) k( W; D7 ^' v4 D3 t
return -1;
/ d! E3 U( W% m5 y( `2 w }2 k0 x; N- n3 B! t
( \1 a" a: n0 T4 _8 n" L$ q# Q
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
; Z& I2 X7 P3 Q+ j* d if(IS_ERR(mcbsp_class))
$ H' K k* i3 `: K6 ?) Y {* N3 E1 t! N5 P" o
printk(KERN_ERR "register class err!");
7 b# @# W! L7 D. ? return -1;# u5 i% p/ U+ i( Y7 H' d
}
$ ^ v4 _9 _3 @5 L& t9 h3 \ device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);9 u5 @$ v- X4 l* B+ |
/ ]/ Q# h6 ]/ J: F" e //PSC2 }7 F& I0 M2 I; i: U* L
//add Enable MCBSP% Z7 q7 l J0 J5 T5 ?3 y
//test+ B% r* @ W( x) ~ o" ~0 P s
temp = 0x80000003;
7 B5 i; i- j* V2 r. E writel(temp, IO_ADDRESS(MDCTL15_ADDR));8 m5 |' c% i4 F+ Z! z( f
temp = 0x00000003;: @0 {+ E. W% J% q
writel(temp, IO_ADDRESS(PTCMD_ADDR));4 u& R: o+ B4 b$ J, `" A$ `0 g
' a( t& e" V1 T temp = 0x001FF201;
; l5 t( x# q8 l3 ^! y" m2 \$ C writel(temp, IO_ADDRESS(PDCTL1_ADDR));0 w6 Q, U2 r, b1 w
$ K' ]2 k& i1 z5 a+ q
//PINMUX ( t9 B5 X2 e2 w3 s2 x
//MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,, D" ~( u/ K+ o( [" g( E5 u h
PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 I2 _9 Q3 C. Z7 t0 M5 Q9 @ PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; 0 K- `6 L3 b, H' Q/ ^- d
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);( p: h# B4 \& U) A% \( d! F
. F- e% U0 E* _ //SLEEP_EN,EPR,L138_SHK1,L138_RC0 o# s4 a. ^, T2 r+ H
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
" w0 X) ^) t+ k2 p" C2 i# l! b+ ~( d PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000; : S6 q2 G7 b2 k) [6 g
writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
' `& @0 ?' Y3 X; l & N' G8 q; H t* S% h# r
//RESETn,L138_SHK2. n+ J7 r7 Z5 v0 f
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); : @) r7 v9 D6 Q. @" K$ v3 K
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080;
- [# t. P8 {3 _ writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);/ G# a# O5 r" p
/ O P( l# p, }& j6 s* r
* Y8 S8 \8 X/ Z7 {- F
//SPCR Register
6 C( O8 j1 q! d" B% o& a //FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
- t4 K3 z* j/ |! y: |- r9 X temp = 0x03000000;//(DLB=0)& ^$ h1 G5 M) e# u
// temp = 0x03008000;//(DLB=1)
6 ]4 }2 B0 J4 A. n# G" U6 E writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset, F, ?4 V! s! {# m' M
temp = readl(IO_ADDRESS(SPCR_ADDR));* N0 F0 L* Q* \+ h; t
printk("temp=%x\n",temp);3 Z; G2 O( M- Y* \6 ~
" f/ H$ X* e) B, [. N
//PCR Register& o0 u7 ]1 T1 e/ ?
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0* ?1 |7 N, i1 ~, I5 S
// temp = 0x00000F0F;
& n: U/ Y7 D1 J! W4 z+ i" }: { temp = 0x00000B0F;
& t" x9 _( F U6 c4 c4 j7 H/ ] writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized # [, r) a, c ^( C. x# Z
temp = readl(IO_ADDRESS(PCR_ADDR));" G. R9 ?8 }9 p: J/ _* x, x
printk("temp=%x\n",temp); ; S1 V, f4 x2 C
//SRGR Register! @7 `) H) k5 n% ^
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
7 ]& B/ Z5 ]" V5 z! g8 B) F //temp = 0x301F000B;
% Y7 I, |. H# u9 B8 m4 X- E writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized g3 N5 v% j/ ^
temp = readl(IO_ADDRESS(SRGR_ADDR));# ?$ b# y( b6 p) q; b) H. I) [
printk("temp=%x\n",temp);
" W( A! h+ @ w0 h: z' S //RCR
; j: d1 K9 [8 B+ ?; ? //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,7 [# M+ S, Y6 y8 A+ G
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-09 v/ \& w( x4 J1 a4 Y
temp = 0x00440040;1 T: O" \8 y2 m8 A
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
( w$ E1 Z2 d2 X Q2 d5 P temp = readl(IO_ADDRESS(RCR_ADDR));0 [* a8 ]3 H& ?2 s' s
printk("temp=%x\n",temp);4 {/ s9 l; X- m% P: \2 ^( s8 E5 g0 ]
//XCR
4 v& B. w% x8 G8 y, m W3 n //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1- t! ?: o Y1 J, J
//XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0, _; n( o4 D4 x$ ?8 S, J+ ?
temp = 0x00440040; Y7 T y$ N# A' T. C
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
1 @9 v I/ y% H" ~8 [1 v temp = readl(IO_ADDRESS(XCR_ADDR));
8 ]0 K5 p+ l' a4 V+ |7 t! X printk("temp=%x\n",temp);
" N t( A/ J" X udelay(100);- f; n, V/ D! R7 N7 Y* Q9 y
//SPCR Register7 }$ v0 H, w1 D$ C8 Z. ?$ M7 Q! T W0 ]
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
6 X! K( Z7 h! g. ~+ Y temp = 0x03C10001; //DLB = 0 VS DLB = 19 q( J; M0 q; a5 m* P5 E; m
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled, \% x4 | a+ E' Y9 y
temp = readl(IO_ADDRESS(SPCR_ADDR));
6 K3 e T" K# b+ c3 P$ ^ printk("temp=%x\n",temp);& A. s" S/ E Q
udelay(100);
+ r3 T) Q# {7 f; {4 k0 b6 p- n$ P# N/ F
//set GPIO direction
, w3 u4 m/ E9 y$ o; o temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));6 T% T3 r0 B; u8 l: M
temp = temp | 0x00000100;//EPR----input& G; S0 E' v& R3 ~
temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
! o. h9 N" I% P$ A __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); 4 ?, I* L; G! [% [5 f( A$ H
, Q; O* `4 P" o* ?0 p3 a return 0;! F/ s' r0 G: d. N& O' u+ d
}
9 q& F& N" G- Ustatic void __exit MCBSP_exit(void)' X( d; m* T( v0 U) U8 n) i' U
{
5 V: u$ o# `+ ?9 m: N printk("mcbsp chrdev exit!\n");
; T$ {. k% t' Q cdev_del(mcbsp_cdev);
" I4 n0 K. Y& a8 s) S: M unregister_chrdev_region(mcbsp_dev,count);
5 H: m9 ~1 n- q6 i" Q device_destroy(mcbsp_class,mcbsp_dev);
$ f* S' D a" l- V8 x. G class_destroy(mcbsp_class);
7 v5 q" G4 q: x1 a}
3 d8 A% ]9 p ^) `9 pmodule_init(MCBSP_init);. q+ y# I: F5 `# e) Z4 z
module_exit(MCBSP_exit);
8 ^3 R" P, @, K% s1 H1 d1 M- \; }& C6 i2 R6 F1 M
MODULE_LICENSE("GPL");$ C, o( n7 d9 C4 y6 Q) k, C! {
2 X# r- A! b: P: F
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。8 D* D; _- `% V, x
我的应用层的测试程序如下
5 ^1 f9 M) l5 n! Y* b# H& F#include <stdio.h>
& q. P6 d0 e- t" A4 {#include <string.h>
" b: Y2 t) N( ?0 w. A7 X" m" `#include <fcntl.h>
# | [+ O! ^: g1 B4 k#include <unistd.h>
/ d* q0 F. E% L6 E- H& l#include <signal.h>2 ?% m( p) L( s; M, T! J8 ~3 Z
#include <pthread.h> //线程
' Q; h% r. e) O- K#include <stdlib.h>3 t: ]. D* ]- a' r, \- L0 q
#include <pcap.h> //捕获网口数据& E0 }% p m- B/ M& A7 t2 p9 O
#include <semaphore.h> //信号
0 _4 L. ?/ s0 A* v4 S#include <sys/types.h> //消息对列
2 g9 Q3 e- H2 q, c" e+ d- o# _#include <sys/ipc.h> //消息队列
, _* C7 v6 n: O5 O7 r6 j' s#include <sys/msg.h> //消息队列
! V3 Q2 j& K5 W7 ^; p#include <sys/select.h>
- @& g: W9 c# }) x% n) V0 p#include <sys/syscall.h>* t' G: b" B4 q! x6 |& t
#include <sys/stat.h>& K7 a% H; F: O. a' ?* r
#include <sys/mman.h>
1 S- C, k8 d4 U s1 C9 Q: f$ k#define msleep(x) usleep(1000*x)! u5 Y; y: x8 ? C& D1 v' @4 [
% c! r0 ?: @0 g2 d8 V
int main()! M' |$ m1 W' s9 Q8 v
{
v7 R' Z$ }0 s7 ^6 ]$ @ //MCBSP,ARM与AMBE2000交互设备
/ e# T* _3 w& i: i int fd;
$ E8 D1 m5 w- J, y9 I+ q* r' @ unsigned short data_write = 0x5555;
4 p1 J# ]" ]# V1 Q unsigned short data_read = 0x00;1 V c0 g1 u& f6 y( i- i2 V- @
fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);+ j# p2 V" n6 ^% {. j
// fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
5 E6 y5 Z/ S* u( X0 t) y
) m9 v! T- Q# p v3 m if(fd < 0) p* F5 q7 N! D
{( j$ p2 Y0 C. _8 v R8 K) w
perror("open failed\n");
5 A% K; ~% l" K return -1;' N' [2 s1 \6 P. f; b
}" v' x" f* T- R H9 `, t
# G2 ` X- H! c9 `; Z# w9 i8 D/ M while(1)8 w! @/ p& u6 R# ?7 ~! u
{
9 n" N& u0 O! L- j3 h x0 S; l 2 _' X9 X( q2 X" ]
//AMBE2000每次读写是24个字为一帧
- i2 _! _) J" _& T: r+ j; N //写数据时将数据在底层存储起来,等到中断的时候再发送' n; ?, V( z/ ?3 O
//AMBE2000输入数据是以0x13EC开头的
0 Y8 U7 ]* E; N O; u write(fd,&data_write,sizeof(unsigned short));
& v7 f6 ?( x: J8 h' Z: _
8 ]) h/ W2 {* L8 h" C //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 , _$ o& W/ O- ] a# W
read(fd,&data_read,sizeof(unsigned short));( e+ R* a/ y' z& t% P
8 Q( C& N' |; { if(data_read == 0x13Ec)
2 ?" Q P O( [# Y {, C7 Y. U% K" E7 b6 p* A/ ]$ a" n
5 H! b! V2 o/ S I9 j
printf("data_read = %x\n",data_read);) [! i, v/ f1 j# ^3 Q# x9 F
}1 A! S7 ?% ]- `; X- Y0 Z! G0 A
6 N1 v8 a9 \3 |) [ msleep(10);
1 A! V- i( D+ s. d 1 a: T) p4 r) c
/*
3 y4 i4 p9 U& G* l& k& L ioctl(fd,1);
6 T+ x( a9 S7 p+ S- R8 S sleep(1);( p7 v. x& P8 U- n/ H8 k
ioctl(fd,0);
5 s7 E3 f# q" ~9 c8 t sleep(1);; W, ]& l& g* Q+ p
*/ 9 c4 ^2 \+ g) j5 F8 I" G
} 5 E& G6 v; X4 s3 C
return 0;% M J. e0 m9 d' e! U
: i$ U- O9 P! f. S# a8 T; L, R8 n% {
}) R) ]7 B7 S& o0 r+ x
0 S. I g6 c8 d9 S' G+ t! i多谢各位指教,谢谢! 急+ g) Y- [! ]0 b: z0 Q: L" g
- N- d. I7 g, P! k0 B7 |4 l. ?9 C
1 k4 B: `( L6 ]- ^0 E: @ L4 u1 d x. j7 q0 {( m
: U h" V/ c+ u$ L/ L) }" i! o o3 W6 y5 ~" R5 F, T$ t2 p4 v
|
|