|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
2 q5 `4 v0 V( R% J/*
0 n, S& {3 M: p4 F% _ * Copyright (C) 2009 Texas Instruments Inc
4 Q6 C2 s1 F- V# H: D *
; v& _% k. B$ a4 N" ^* C * This program is free software; you can redistribute it and/or modify
; X' `" a, O: V; s5 a$ _2 _$ S" z8 A * it under the terms of the GNU General Public License as published by
! F. G8 K" j) o! T * the Free Software Foundation; either version 2 of the License, or) }! M2 X& _# m. f. X7 L" A
* (at your option)any later version.( B4 ]% v( I- E6 b6 l2 q3 P/ ^
*5 h) t1 l7 O$ q0 X' U' q/ L5 H
* This program is distributed in the hope that it will be useful,# z$ |; ~/ w9 v' v" F
* but WITHOUT ANY WARRANTY; without even the implied warranty of L. p% ~3 ~0 |6 B v' D. r! j! r4 E
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% h0 E! {/ T6 \7 }- K; c9 d9 J( _, [ * GNU General Public License for more details.
8 R% @0 M; ~5 b *+ a" u, u; d- `; o
* You should have received a copy of the GNU General Public License
3 x/ Z0 Y+ }* ?- e/ A/ Z) X) W1 f * along with this program; if not, write to the Free Software
F$ \8 x9 @ n! z. R1 e" s. { * Foundati g) Y9 B( \- ~
*/
" x* J" ~. e% t4 q/ C- G [8 K#include <linux/module.h>" K! S; g" N, g2 f/ H5 B
#include <linux/init.h>
$ i$ e( v6 {5 W3 ~8 o" Y9 {. I#include <linux/errno.h>3 V- t, D: u: p" f9 O4 x! ^
#include <linux/types.h>4 t! R' q" _7 `
#include <linux/interrupt.h>6 X; C8 @6 D9 A2 j
#include <linux/io.h>0 w+ y ^' P8 r
#include <linux/sysctl.h>: \( I! c4 N% b% Q3 I8 y
#include <linux/mm.h>, [, X8 @. M/ n+ @
#include <linux/delay.h>
. N4 a* V/ Q" l" E& L#include<linux/kernel.h>
. K! _/ |) s4 O* o+ {" A4 B#include<linux/fs.h>; y2 g. w8 f: j
#include<linux/ioctl.h>' J* x& {' f7 t; J
#include<linux/cdev.h>/ o! z8 a ~6 A" V
#include<linux/kdev_t.h>
, J5 j$ n2 P1 t6 s4 f% r9 m#include<linux/gpio.h>$ E L: Q" d8 J# h4 x: S9 G
#include <mach/hardware.h>4 w# X3 V# e" i3 y4 B& T* t4 M9 \
#include <mach/irqs.h>
$ }7 S9 t8 ?! [/ m; V* l% \" X
6 N4 i Q* F, U$ w0 h; _7 a, w#include <asm/mach-types.h>5 x, p1 N8 b$ h, Q! d" R
#include <asm/mach/arch.h>
+ _7 J' k* B" a$ f7 i, n. r#include <mach/da8xx.h>: U% ^9 A! F( Y# {$ H7 u* a7 T0 n
#define SYSCFG_BASE 0x01c14000
9 ~; c8 V2 L5 ~6 z. h0 R$ y) N#define PINMUX1_OFFSET 0x124 % o$ A; F' L9 u% M7 Y/ D
#define PINMUX18_OFFSET 0x168
( }- ^2 B, ?2 y9 E4 W' z#define PINMUX19_OFFSET 0x16c0 C' j P V2 \+ u& R: B
#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR% L3 y' Q0 ^4 x2 g+ J; v
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR2 |. G( |7 D3 d7 ]4 ~
#define XCR_ADDR 0x01D11010 //MCBSP1_XCR' x7 M- p8 o8 j/ H; l
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR
. h/ z1 `! T* A7 ~$ V#define PCR_ADDR 0x01D11024 //MCBSP1_PCR
! q2 r% m% X, F8 t : x, u4 U4 \% Y( B7 b0 U' b( ]
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR
1 ~: o, _$ ~$ g$ C! x, |#define DRR_ADDR 0x01D11000 //MCBSP1_DRR D0 I2 m- y, A) y& b% ?
//PSC7 c1 B) K$ {+ L
#define PTCMD_ADDR 0x01E27120 + L2 c( _* n7 Z# {1 Q1 B
#define MDCTL15_ADDR 0x01E27A3C" g, K: A" {4 z& w" ?$ n6 E
#define PDCTL1_ADDR 0x01E27304
( L2 b! Y" Q8 }2 `/ Y& Q8 o- ^//GPIO8 direction, F6 \; s) y# }- s+ N% b
#define GPIO8_DIRECT 0x01E260B07 {4 m& T+ g8 }. N. Q1 @
#define GPIO8_OUT 0x01E260B47 @! p0 J+ \# y1 _
#define GPIO8_IN 0x01E260C0& `. T% S0 _4 C* P7 X, W
1 V1 {# ?3 G/ V5 r$ K
//#define MCBSP1_RINT 99
6 ^# e1 Z4 U$ \* ?//#define MCBSP1_XINT 100
3 v; E5 R+ l' Z! h# f4 l- V5 M/ vstatic int MCBSP_MAJOR=239;
: }" K) p$ Y6 C' cstatic int MCBSP_MINOR=0;/ t2 O) l5 w! \1 z" P
static int count =1;
/ g b: p& X+ D; _& a5 g; s
3 n) R$ D* S3 T! h% D#define MCBSP_NAME "MCBSP-device"
) a5 j% D$ ]. u
4 q# n8 z4 D) L _2 Vstatic struct cdev *mcbsp_cdev;/ B; P. p9 b: P; S$ ?9 v* i
static struct class *mcbsp_class;4 N- H' K3 G0 s. j4 `: |+ C1 M0 V
static dev_t mcbsp_dev; F6 K6 K S5 p" }* n" @# v* l
unsigned int DRR_data;
+ h, i4 t: k, f4 u0 M) R! V* gunsigned int DXR_data;$ g( u' x4 c- `
static int mcbsp_open(struct inode *inode,struct file *file)
" u* T, p% A3 Y6 k* k{
1 D+ O7 J; K0 b6 k; C1 ] 3 S5 K* b, O# i* \ W7 d5 F5 X
//interrupt enable,initialized
# N; v5 n4 ?( V# B" u unsigned int temp;
# {) n0 ~. o! \3 Y/ V( v //SLEEP_EN(GPIO8[10])---0/ y4 ^( P+ h2 d4 G" m+ ]1 r0 g
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));
" e/ t6 r( A( V, s2 A. ], D3 o5 ~ temp=temp&(~0x00000400);/ F3 v' h3 f1 z/ Q4 U
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]$ O& ]) m) y h# G, a5 J
//RESETn(GPIO8[8])----0----1 K/ i4 k5 V z% B! b1 e
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));, W9 c$ C* q9 } f
temp=temp&(~0x00000100);$ l5 F9 f+ y- H8 R
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
- s& i! b; U; K! y8 D udelay(100);9 `5 G! G; _" B X( r: Y
temp=temp| 0x00000100;. b% M0 r" g2 p) o2 o6 m
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---1" W: k' b5 W# [9 j4 P7 s
udelay(100);( z3 L% B! N0 l0 W# h: M! t, F
printk("open success!\n");& a3 F2 [$ v: B
return 0;
( Q# {' D1 d9 T, q}
$ ?% h# \1 u- _; M1 I8 U1 J8 f" n& v
static int mcbsp_release(struct inode *inode,struct file *file)3 F2 n" g* m8 }: Z5 M" f
{4 J, ~- F- |. A, ]0 g2 J1 J
printk("release success!\n");
& D7 W& v0 ^8 e n$ n6 f) ` M6 S return 0;9 p% p' f3 a" W% d# J0 J5 G
} S" n, E* h! o r
Z( h0 |2 ?6 _5 a2 f' |" F* t+ nstatic ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off)! T9 s. c6 A6 ?, ]0 G
{# t' Y# L9 D/ ?3 _4 |4 F
copy_from_user(&DXR_data,buf,len);" q" e% M# x* u7 H% P: ~- X/ @0 p
iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ' A3 ~7 G! e S; f0 O
return 0;) ^0 K, b8 j- [8 [
* Q9 i& I( L* ]4 K3 ]0 d}
, @7 p' V) m: e, r1 H) C) I2 N
1 ~) [0 j, L' _! H3 Kstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
1 O( c h: M( F- E G{
% B$ y0 \) t' @: ~6 q DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
, m$ l8 L5 s& G I# f( J copy_to_user(buf,&DRR_data,len);
5 N2 S% D: \( ] |' ]" ]% c' w return 0;
. s. N9 v/ ?; m" _, r}& a( j$ }# l& v$ x% p( M* G1 Y
% U% f& V- G8 j- u, C2 e! W/ H
/ B" |, W+ E' Tstatic struct file_operations mcbsp_fops=
; i& V5 I3 g/ Q{
- N, ~0 h: _6 L( }5 O$ N* q .owner=THIS_MODULE,
' E( q! T- F1 S' R .open=mcbsp_open,
7 f, Y4 ^2 U$ y+ | W' w .release=mcbsp_release,2 L1 I) e3 k* a/ S( H% R$ ?4 D
.write=mcbsp_write,
& ^/ N3 l9 ]# K' U .read=mcbsp_read,
6 ]+ u$ N; y9 [( b |1 p7 R1 F};
8 m* @1 Z; _0 p! H2 D _/ k$ ~static int __init MCBSP_init(void)$ V# |' J9 L3 v! Q6 Q# L) ?
{0 a8 f2 F1 @- R) v
int ret;
- n' Y4 m8 s9 I. j# P5 ^ unsigned int PINMUX1_REG_old;! \- i8 E& I/ s. H3 x" G
unsigned int PINMUX18_REG_old;0 u+ G, o+ x% r/ ]2 A. Y, @ C( k
unsigned int PINMUX19_REG_old;
* |! ^0 H! Z3 \: ^ unsigned int temp; $ \* n) r+ ~% M q
if(MCBSP_MAJOR)5 C6 w/ Y2 p3 S6 s8 H
{' A- T0 |7 x5 K6 N& C" Y8 `4 L
mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);5 d2 G0 `) ]; o# ]
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME);
% s' s5 R# q. |( j3 V/ f/ K) J B& T }6 Y p0 F! g5 o) R! f
else4 B- @! J+ ]5 c
{, y/ |/ r" V; z v, z
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
& K1 @8 X; ?* D$ f6 m/ l MCBSP_MAJOR=MAJOR(mcbsp_dev);
# T2 L7 `$ L: B# x V- K1 N7 C }% x/ X4 K9 D z$ m5 r7 q
' K! Y1 j: b6 L( j C. U0 M ~/ K if(ret<0)) X: `, v& ~. X7 k2 e4 R
{! J3 j0 r+ O6 B- R7 E
printk(KERN_ERR "register chrdev fail!");* h6 I% B q1 K# a" {! p
return -1;" |: X2 K% Q. Q8 E1 I
}+ y! ?* u; n/ M# J+ B
0 h' {% N$ @ N6 ~' {; H& S
mcbsp_cdev=cdev_alloc();6 Y$ j2 z; x+ W; {' k
# T0 A7 N' {( J% @
if(mcbsp_cdev!=NULL)5 `. b+ r. [$ t- o6 e4 o
{( j3 b3 }# i& |- A, S% Q
cdev_init(mcbsp_cdev,&mcbsp_fops);0 \1 F6 `' ]( A( h7 g
mcbsp_cdev->ops=&mcbsp_fops;
; g# _2 B- Y3 k( p" [* E: w: i/ ^ mcbsp_cdev->owner=THIS_MODULE;
, k/ \- F$ A9 f: X- Z2 K ) r* G+ V5 g0 ^
if(cdev_add(mcbsp_cdev,mcbsp_dev,count))3 ?4 z# _0 p( q2 X, k$ G
printk(KERN_ERR "register cdev fail!");; x, }. C# p0 R+ D* o+ ^
else5 x( e! p& ?; [2 m# v2 t
printk(KERN_ERR "register success!\n");
3 S8 n! k( C/ t, [* _ }
8 @* \" M4 g. E% B+ l0 D else2 l0 S H! X% _9 E
{9 D2 P7 k8 t: X5 ~0 {5 a, B% w
printk(KERN_ERR "register cdev err!");
7 `1 q: r3 o, V8 n return -1;- a+ F }9 e9 J4 Y
}
. n6 t f& o F+ Z$ ]. U3 a1 \ , R: ~% L6 ~, h
mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
- o; k, U5 d' X/ u if(IS_ERR(mcbsp_class))6 @( B7 F7 Q& ^$ [# y
{
( t6 `! j' i1 O; g+ Y2 o# f printk(KERN_ERR "register class err!");* J5 I' E: N0 C% l3 a% N, Q8 j
return -1;
8 p; [# b! k0 ~" b: s5 P }# [, H) X1 [2 S7 Z" ]# N3 W
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
+ z) q8 B" ~ ~, A6 D6 `- ]! M5 Q6 D
//PSC1 K' Y/ d1 e" o% H6 k# L, q+ t& C
//add Enable MCBSP
6 j7 \; O8 W! M //test/ T. g G* P4 |6 N3 q
temp = 0x80000003;
+ \ A8 v! A7 _8 i2 C- E% r writel(temp, IO_ADDRESS(MDCTL15_ADDR));
5 Z. V9 n* D3 w; y6 u; k temp = 0x00000003;
& _8 U5 S% T, ~0 [3 c writel(temp, IO_ADDRESS(PTCMD_ADDR));7 \ @! t8 B& w* {
n. x2 L. { W u! R" f
temp = 0x001FF201;/ l! O0 b1 c9 r2 e' ~
writel(temp, IO_ADDRESS(PDCTL1_ADDR));
; t7 ^; W# w6 d; F6 z, l' g4 L + e! ?, P' L, B* o- y- q$ b
//PINMUX
. T* G" M4 _7 K& Q# p0 C //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
: X- E$ F ~: \ R PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); 5 H0 i+ D- n" M# x- L+ B% k
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220; ( o8 L. {6 o& E' S/ I
writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
: C8 _1 ]0 R, Z2 f, n& ]5 t
& c/ ]4 d! |. W- l: \: \ //SLEEP_EN,EPR,L138_SHK1,L138_RC/ j4 b: @1 N; q$ b J$ }
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);
: s6 ], o- `( _- @/ W: u PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
9 ]- P: p" |' S! D writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);: \ u7 ^, m! [1 d
6 \+ r2 R' b" t
//RESETn,L138_SHK2 X. X; d5 N, F0 `5 r3 u
PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
4 @9 I0 x8 _( C6 g) J& s6 y" Z" @0 ] PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; % K/ A! F9 f B. ?" o. s
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET);
7 w$ A5 I! c& g# A. p7 ]& u 6 i$ k/ m. N! u
* _. h. P) s- C } //SPCR Register% r5 q/ z$ k; z! A2 X
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset4 N2 l3 W1 h6 M% j; H6 h6 v6 e
temp = 0x03000000;//(DLB=0)5 V: o0 ]9 z2 ~. H2 u
// temp = 0x03008000;//(DLB=1)
3 G- U m' ?7 U! C$ X writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
$ s0 K, r8 M' G temp = readl(IO_ADDRESS(SPCR_ADDR));
5 J, @; C8 Q4 I& h9 I+ w& u+ I1 r& x printk("temp=%x\n",temp);
) I* T5 c% K& _3 B3 D/ b5 D 8 v# l+ s5 I9 |; N( A. I
//PCR Register) Q' T: S& @6 g; f8 M$ L ?
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-0
) X$ e5 r, J$ |# n6 U; h1 r // temp = 0x00000F0F;5 r2 Z# ~* a3 Y' o. a2 L' {
temp = 0x00000B0F;
9 m9 m. Q' F, s6 b' T U2 O writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized " k4 W- a" ~% E) I5 i4 E
temp = readl(IO_ADDRESS(PCR_ADDR));3 F! r& p S) e w* J5 v
printk("temp=%x\n",temp); $ i, a2 f# \/ ~# U
//SRGR Register0 D' z' J) S/ e! G. k0 x; |
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==119 t1 {) o+ u1 u" y& Z
//temp = 0x301F000B;- {# H) u4 f. z; h$ D3 M0 ^
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
* I$ f8 E# y* ?# n8 n5 P temp = readl(IO_ADDRESS(SRGR_ADDR));: D3 e8 s: @( D& u3 u, e
printk("temp=%x\n",temp);8 X8 x+ D c! |2 h; C9 |
//RCR" I9 a! r V' H, H' S; d& {3 u) O
//RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,
9 G( B' x# x) p) U* P" j( o //RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0
# O+ S, W4 w" u: r temp = 0x00440040;& |! e2 A5 A. k# i3 r, N* W
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
8 i- u* ]. q) M temp = readl(IO_ADDRESS(RCR_ADDR));6 q+ k4 k5 s. p7 s2 r4 S
printk("temp=%x\n",temp);
5 |4 d* i b: x! j" D( e, ~ //XCR
9 X3 e1 B2 h$ I1 G //XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
( K! Y6 a {3 ^" I# t //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0
. w m0 _/ }, g# m temp = 0x00440040;6 Z" g) x- M' d6 ~+ @% u9 _
writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized
% J; f. \1 L( h2 N! S+ W, T temp = readl(IO_ADDRESS(XCR_ADDR));% z" z' }5 I* g' }
printk("temp=%x\n",temp);
. m+ u5 N7 ^! H: w' X9 [ udelay(100);
$ |" m- Z% v, S4 @ x% B* U //SPCR Register+ X+ i! }" G+ l1 q0 j, e
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-1
( w# E0 x0 }" I: K$ p temp = 0x03C10001; //DLB = 0 VS DLB = 12 ]* p" ]7 S; A0 b1 t1 H+ e
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled
: e. ?& ~1 k; _9 M temp = readl(IO_ADDRESS(SPCR_ADDR));9 E0 i5 k% B( J9 i, a2 Y
printk("temp=%x\n",temp);
2 e; P2 g& e: K8 z$ y, C! K udelay(100);
1 b/ J4 a' S1 h% h. \+ t; z& x/ H3 ^! Q8 g! A5 |0 v
//set GPIO direction
# f; L/ Q. X9 D( k+ S temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));. r$ { ~+ k! Z/ M
temp = temp | 0x00000100;//EPR----input
. u; x& \. p8 m4 B J1 d temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
" | @7 N) @3 p/ X8 @ __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT)); & s' Z- }1 }8 o
) h: M1 F" }5 K4 w4 F2 Q+ v% F return 0;6 C$ \+ m6 U3 Q# p2 _& q) m# Q. l
}
0 {8 a7 e; d+ m5 M$ x N, Estatic void __exit MCBSP_exit(void)
" ^( \( m) t+ w9 X- ]. ]# ] H{; B1 m3 S9 E: E( [
printk("mcbsp chrdev exit!\n");$ k" ~$ `3 Z. t* C1 N# C
cdev_del(mcbsp_cdev);2 Q2 f9 w5 ^' ?
unregister_chrdev_region(mcbsp_dev,count);3 c/ C! i* h% x1 y' K
device_destroy(mcbsp_class,mcbsp_dev);
1 ]3 c! K/ N1 O) r class_destroy(mcbsp_class);
8 x' Y' v6 n6 M' }; h+ {5 }}2 s; I* v4 o1 R
module_init(MCBSP_init);( R6 s p3 Y3 H+ A4 B R& b( e
module_exit(MCBSP_exit);
1 ^" n/ R0 c9 X& }3 N$ p/ o1 F& \" s) E9 L
MODULE_LICENSE("GPL");$ W' E. q# A+ x* u2 }* F
h4 \0 n1 s9 }7 I
我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。% h4 a4 Z; j( S. {7 ?3 C( D
我的应用层的测试程序如下* X' \$ `9 @0 T1 g6 H" h1 r; S- ]
#include <stdio.h>/ j$ W7 Y. Q8 E
#include <string.h>6 t0 f3 ^: D( I& I4 G- `
#include <fcntl.h>1 D; x( N; R* u7 F+ E- k
#include <unistd.h>
6 Y3 \' Z; z5 l1 @#include <signal.h>
% ~% H# V3 @0 Z! P) K& Z#include <pthread.h> //线程
- [! Q/ l% d' T) b* }% F#include <stdlib.h>- [0 n/ r: p7 ]8 g! [5 M
#include <pcap.h> //捕获网口数据2 a" l/ f8 g$ h2 f
#include <semaphore.h> //信号
8 ?0 Z* j: v, R1 N#include <sys/types.h> //消息对列
: c+ Z, Q; W$ e" b! H- e5 M#include <sys/ipc.h> //消息队列
6 _5 v) p6 I: O! C/ \8 w#include <sys/msg.h> //消息队列
4 o" B# S9 E1 p1 S' G; u#include <sys/select.h>' q! W4 K# ~; a' f& A Q
#include <sys/syscall.h>
, t$ {0 ~4 }; [7 L5 [5 x, D" f#include <sys/stat.h>
" Z* g# x- h/ o. R#include <sys/mman.h>
, H) O& A( ^3 a* B+ M' d#define msleep(x) usleep(1000*x)
' m) C3 \* ^ C% g8 S) H$ X6 X( j, P; y# S$ S
int main()! l0 o$ Y8 Z4 l9 v2 x r
{ 0 W2 {* y% e* R3 w9 Z; }
//MCBSP,ARM与AMBE2000交互设备
- u4 L' f7 L* u. V9 X. P& B- c& P int fd;0 N" z" i; ~) H; V2 ~0 |$ o' K0 |8 k) n* H
unsigned short data_write = 0x5555;: z; L+ }" u3 Y/ g& _8 S/ U
unsigned short data_read = 0x00;
. \6 n9 f; g& Y! P. Q! O3 G3 K2 g4 Q fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
2 p1 O i/ g. H/ t6 F# }: ` // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
; Z+ o% z. J+ _ T ) S0 q: x% ?! u4 l
if(fd < 0)) m6 Q+ w! n7 t4 I- ^
{
' U$ o, E2 ~" c4 `1 n perror("open failed\n");0 I/ o0 a8 H9 G d! q o
return -1;5 |# F5 c [4 T9 r
}% A) m- m) d3 _, L$ |& k
4 w* Y) w* k9 R+ Q' c1 q) M& u: W while(1)
. r, T& U" U! M9 t1 A \ } {
7 ~5 L1 X2 v# `" I! ~ 5 c4 @9 N1 l0 [9 w
//AMBE2000每次读写是24个字为一帧: e4 x+ _8 B; @1 |
//写数据时将数据在底层存储起来,等到中断的时候再发送
& x4 M: _" F1 [! E# W //AMBE2000输入数据是以0x13EC开头的
( J$ O7 q8 s! g# k t write(fd,&data_write,sizeof(unsigned short));
. ~9 D' W! e- y% j% v9 C! {0 @9 m " g, [. ?; g9 o
//读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层 0 N. U) v8 w. C8 K
read(fd,&data_read,sizeof(unsigned short));
( S' i7 r% v* }3 l8 N( W
5 ?0 a! @- P" g5 i. d" s9 p8 B if(data_read == 0x13Ec)
- m; Z! j+ O) `4 d! Y2 ]; }* s {
5 J/ Z5 @# O# f4 x m2 ^+ C+ w g" c/ n 4 n$ G/ N4 n1 Y3 \4 t. Y0 ]
printf("data_read = %x\n",data_read);
, m, }- ~* y( P' C+ I }' |' p& | Z; k& Z3 V% D. Q
/ G( l) Q3 p/ {+ l7 M/ C7 s msleep(10);( {7 Z5 \( @4 p4 K) `0 }7 V
1 I7 v3 c9 K7 m: J2 b Q
/*2 A4 d# \2 H2 j, B# I; R2 x6 ~- d% A
ioctl(fd,1); : p0 f" |, X6 @+ D% s: t) C$ V
sleep(1);5 G A% e A4 r) f: f
ioctl(fd,0);- r- ^: x3 D& O" g) H, Q
sleep(1);
+ }+ R( X k/ Y! A */ & e$ j' R7 x1 v7 ^7 E# d
} # e% K* Q* b% o: R* H
return 0;
1 H @* R! w [. k" [ + e5 }0 M/ E9 R4 t
}
5 E+ G+ U( ~0 j V6 d* ~$ A; C% f1 {5 ?! a/ L6 B
多谢各位指教,谢谢! 急; p v6 l4 ?" e( v# G7 {% T
P8 C1 P' X, k" I( E8 `7 B
2 @2 J' Z0 {) `4 l+ P4 O0 `3 R* u. `5 G+ I
7 E$ c, W4 T, B( J3 e" @- U/ l
1 ^: W5 W; i( S3 ]1 n: U! Y- C |
|