|
|
我讲创龙在DSP中使用的例子移植到ARM中,如下是我的底层驱动程序:
( ?( ?2 v; P& m/*4 S" K6 E& j' x
* Copyright (C) 2009 Texas Instruments Inc8 n( m+ H7 K( a# J& f8 n
*" Q( G/ L, _2 R3 w
* This program is free software; you can redistribute it and/or modify
% X, U' I3 O/ w% \! x( u% S * it under the terms of the GNU General Public License as published by
2 d8 G$ X2 Q* C4 u * the Free Software Foundation; either version 2 of the License, or/ w, u G0 l5 R) e& d: K
* (at your option)any later version.5 c$ i$ ] u. o4 P* a+ N: ~5 b
*% @3 R" M! ?. `4 k7 l9 m$ ~' N
* This program is distributed in the hope that it will be useful,1 R# C1 I3 i, F" O+ E9 e4 e
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- k( C& D9 }5 q- v% O * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% B+ g6 T, u$ t# N9 _
* GNU General Public License for more details.
; A3 N7 {/ h, R& z" R$ x *
2 ^$ R1 f$ n5 ?' k5 d5 ] * You should have received a copy of the GNU General Public License
' l# C4 t9 M3 d& d- _# G- h% x * along with this program; if not, write to the Free Software
' z0 @, e8 D2 l8 X( B * Foundati
- L8 d% R4 z% ~/ g. Z, R*/- }# h! S. E ]( J/ ^0 |+ c' q
#include <linux/module.h>: e) [( E" s9 j/ R! O, n
#include <linux/init.h># z1 k1 D3 {# R( j# u
#include <linux/errno.h>1 P7 Z* u9 m% c. Q V
#include <linux/types.h>
J2 d9 a/ {% y; I* I) i# r#include <linux/interrupt.h>
. v$ n6 J9 o1 U4 b- m$ U2 a#include <linux/io.h>
1 _" }/ ~# M$ g9 k3 O* U#include <linux/sysctl.h>) `3 Q4 E/ _3 j5 C# o/ k
#include <linux/mm.h>6 h: c. S2 a' A. g/ j0 X' O8 j
#include <linux/delay.h>
7 o; s, P4 F$ e8 H! V#include<linux/kernel.h>
+ Q7 D& S) e0 H' f9 g3 K6 s#include<linux/fs.h>4 b4 r4 J4 l& Y% p
#include<linux/ioctl.h>
; e# A- l. L7 P. E9 h, B4 |& ?! d#include<linux/cdev.h>+ O' L" }* C2 A1 g
#include<linux/kdev_t.h>" ~% D0 {; k# i' R* C% J
#include<linux/gpio.h>
0 y( d& ^ H q6 [% k5 B# B4 E#include <mach/hardware.h>
1 ]6 r1 g5 D6 \#include <mach/irqs.h>
$ ?5 M3 l/ j. [5 S" { v3 x( Y
- Z- C2 B2 A0 m$ T0 x#include <asm/mach-types.h>0 |- c/ q* \! o/ r. l/ L2 h/ q
#include <asm/mach/arch.h>4 f# s* t5 y% P0 M7 c! D J- Q
#include <mach/da8xx.h>
' a4 ~ y V( j S; x* H#define SYSCFG_BASE 0x01c140001 C2 f6 c/ U* B3 c v9 L0 s
#define PINMUX1_OFFSET 0x124 3 Z! W* U* A; y6 v0 M @# c! P9 N
#define PINMUX18_OFFSET 0x168 ; z4 e5 @# J4 d3 U6 T! h7 ~
#define PINMUX19_OFFSET 0x16c
1 `( \" d! r" p% n/ y5 @#define SPCR_ADDR 0x01D11008 //MCBSP1_SPCR! a# S' }& H3 q1 X
#define RCR_ADDR 0x01D1100C //MCBSP1_RCR
; T, w# o9 ~1 P#define XCR_ADDR 0x01D11010 //MCBSP1_XCR; ?3 f0 V. B3 q$ P( k! j: Q
#define SRGR_ADDR 0x01D11014 //MCBSP1_SRGR% J3 A! H# [! y* X
#define PCR_ADDR 0x01D11024 //MCBSP1_PCR2 L( H8 e$ x3 y) Q( q
% U& s% B) T/ I% y7 `2 [; n
#define DXR_ADDR 0x01D11004 //MCBSP1_DXR7 @7 W2 l. w1 B/ s% x7 S2 y
#define DRR_ADDR 0x01D11000 //MCBSP1_DRR# ?, p2 p1 E2 Z9 Z
//PSC
. Q* x) R6 N ^6 v' R#define PTCMD_ADDR 0x01E27120
5 |+ t* Q) O% |) d$ c#define MDCTL15_ADDR 0x01E27A3C) t8 a' ^! V9 M( J
#define PDCTL1_ADDR 0x01E27304
) y: Z k+ }* x+ J# {. U//GPIO8 direction! P6 ` A; Q8 Q: ^5 h
#define GPIO8_DIRECT 0x01E260B0
6 z- O. Q6 n2 j" l- r/ f#define GPIO8_OUT 0x01E260B47 `7 R. ^0 f6 w
#define GPIO8_IN 0x01E260C0
% f+ \ [% k( B# P& T4 F: W
) U& ]( H* S9 j/ C, t, {//#define MCBSP1_RINT 99 : l3 n( T0 z1 S, j
//#define MCBSP1_XINT 100
& ]/ \# u2 \' s Z, sstatic int MCBSP_MAJOR=239;
2 _5 E3 r* d7 r( z7 Gstatic int MCBSP_MINOR=0;& ^6 r- |0 c$ ]
static int count =1;# v" T k2 E/ c/ z) s3 n8 s
' F* \6 V1 p+ F) G9 g% E
#define MCBSP_NAME "MCBSP-device"1 | ^6 {: l; m: U% J8 J$ U; @# Y% D) g
& R' R+ a5 |, d0 B1 m' j/ q
static struct cdev *mcbsp_cdev;
( G3 X" Y: X( z- F4 h: a9 I- A* [static struct class *mcbsp_class;+ T* Q8 f/ V0 o- Z" H
static dev_t mcbsp_dev;7 O" m# R# {1 G8 e7 P( P
unsigned int DRR_data;, C" I4 L4 ^* \: Q% J
unsigned int DXR_data;
8 Q4 x; y2 a) _, W1 |$ Astatic int mcbsp_open(struct inode *inode,struct file *file)2 F6 g. }* u$ ]- \9 j3 h
{
% D* i7 n* @0 l0 @2 \5 J6 E" x' E4 I
2 |: J1 T q% @ //interrupt enable,initialized
( H* I4 Y3 c( B' O! [ unsigned int temp;$ r; n- n% H4 ]: ^ t* `) N, _& s
//SLEEP_EN(GPIO8[10])---0& E# h9 r; l3 Y
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));+ u( W! R2 X! Y5 P' A; I3 W8 s
temp=temp&(~0x00000400);
E" O! t5 K0 h) B __raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[10]
5 G+ X$ F S! W% N9 p8 V //RESETn(GPIO8[8])----0----1* l+ Z, q6 l0 w) `! v$ s
temp = __raw_readl(IO_ADDRESS(GPIO8_OUT));4 G D+ h9 x, D* t3 B
temp=temp&(~0x00000100);7 [0 ^. b" H6 b& S( x
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---0
6 D; D& j" x' M# |7 Q udelay(100);
: S0 t9 M9 S+ L8 o temp=temp| 0x00000100;8 I# l8 [6 N' Y6 ^
__raw_writel(temp,IO_ADDRESS(GPIO8_OUT));//GPIO8[8]---12 U+ q- j' h: {2 @3 t y5 N
udelay(100);
( [' C) q% F s printk("open success!\n");
9 c% t8 ?3 ]9 U/ W return 0;# p- @3 Z& ^ Q! A/ j; B
}. |" U/ w. ]/ a/ n6 k: |
5 ]- {" _* q9 f. ?8 q$ B8 Jstatic int mcbsp_release(struct inode *inode,struct file *file), i' s% s1 ]6 B0 G& O
{0 t* ~$ S! e+ D) c) F1 J" V9 M
printk("release success!\n");& b A3 i! V J* X) J/ d" W
return 0;
5 C9 q( H" Y8 F/ ^0 T9 O6 p}
( H" |) Q9 D( D* c) l+ R* o9 q m6 Q9 {. O& f
static ssize_t mcbsp_write(struct file *filp,const char *buf,size_t len,loff_t *off): o' k% [, L& Y5 \" F
{
" V% l9 f2 Q7 {7 t; o3 y copy_from_user(&DXR_data,buf,len);
* m* b8 H5 ?( g$ g* F: I iowrite32(DXR_data,IO_ADDRESS(DXR_ADDR)); ( a; I" B K: l7 r6 V6 d
return 0;
. K6 t3 |+ J9 i3 x% T + a* b0 f3 F$ y- @ H7 ?
}
+ C; R8 v2 P+ n) }# y$ I9 p% I' W6 H
7 @" C* I$ I- e# H% R! }5 Wstatic ssize_t mcbsp_read(struct file *filp,char *buf,size_t len,loff_t *off)
) s* l4 e: G$ y5 G0 I& e3 t{ + ?4 |. {7 g" K+ k) J- L- C4 I8 J
DRR_data = ioread16(IO_ADDRESS(DRR_ADDR));
! `* i2 I" p1 g1 L. y% p copy_to_user(buf,&DRR_data,len); 7 R6 |) l9 q1 I7 Q$ ?) h
return 0;& Z, U3 Z7 A# Q1 n6 Q* I
}- M" ^0 N/ [4 [& c9 |, K+ U
+ v( g; s) {( p9 M; [) ?2 v$ o+ s$ s
5 H& X; s* T* h: j4 r" p/ ]
static struct file_operations mcbsp_fops=& U, X8 }' [0 m
{! B# S0 \* t; h0 L, u
.owner=THIS_MODULE,
S9 R( i% M0 O% C& F; D k .open=mcbsp_open,
. d) ~: X% `* M. x/ @ .release=mcbsp_release,+ l, s9 j% p: J! u2 y2 \- C, h
.write=mcbsp_write,+ S& W3 G7 {* B% ]+ [( b$ G
.read=mcbsp_read,
$ D' R2 ^0 G2 A% G3 x% Q' [8 m, o};, L4 T0 ]! n/ ^4 @$ J
static int __init MCBSP_init(void)
5 }$ B |& `$ R) J8 A$ @4 N{+ @: ~( O# }9 ]# a
int ret;6 `: ~# H# z! g7 d# e
unsigned int PINMUX1_REG_old;
+ t$ f9 ?; M3 T1 o$ b5 b0 e unsigned int PINMUX18_REG_old;7 A) |2 j% \# a+ z- a# s! y
unsigned int PINMUX19_REG_old;5 L3 t" h6 X( R" f1 }$ Q) F1 t+ u
unsigned int temp;
, L+ j& `9 H! f% Y( d: S if(MCBSP_MAJOR)- ^9 a W; M* R8 p
{
; E% h* Y3 i- z mcbsp_dev=MKDEV(MCBSP_MAJOR,MCBSP_MINOR);0 B9 g7 T: c. b- L
ret=register_chrdev_region(mcbsp_dev,count,MCBSP_NAME); J. h# F; D8 F2 E' d
}; q4 B' p1 D2 S
else
- V- `8 N: Q, U4 z' e0 N' M {' Q/ ~% n2 _( |
ret=alloc_chrdev_region(&mcbsp_dev,MCBSP_MINOR,count,MCBSP_NAME);
; `2 ]% l/ Q" r MCBSP_MAJOR=MAJOR(mcbsp_dev);+ B9 F. a9 A& x& T0 z+ m
}
; s; r; n, c' P1 {0 a/ ~ $ P/ q, U( F( h/ }( K" y5 ^
if(ret<0)
6 i9 e" D- V8 T) S2 q9 u {! D4 B7 ]8 C/ o4 Q* w5 b
printk(KERN_ERR "register chrdev fail!");1 F4 \: E4 {5 L
return -1;
* H# H* F+ {- B9 i+ d& Q }
3 u5 o0 }* D) o: ~ 2 |! Q( [2 S- N w$ f$ e ~% R
mcbsp_cdev=cdev_alloc();
$ s- u' O, a, m9 p3 L. H! J " B- {; ?6 ^1 N
if(mcbsp_cdev!=NULL)" c3 ^0 d; Z1 W$ `
{
+ q5 Y6 J2 @# `5 p; g7 v/ E# T, ~ cdev_init(mcbsp_cdev,&mcbsp_fops);& \. t. }) P$ v. z9 [
mcbsp_cdev->ops=&mcbsp_fops;) L% y9 j! E& ^8 F" k4 j
mcbsp_cdev->owner=THIS_MODULE;* t' Q5 Y+ {" O0 p* T! V R4 d
7 a4 v+ u+ Y2 J if(cdev_add(mcbsp_cdev,mcbsp_dev,count))# k- ^- Z+ v# s+ o0 Z1 l
printk(KERN_ERR "register cdev fail!");
' y8 c' I3 B6 {+ t else1 W: I$ S) S d" R% H! x, H
printk(KERN_ERR "register success!\n");. R! t6 R7 p- g. i8 b2 H
}9 q3 ~( C3 ]0 W" r8 m1 b* E
else( j& n/ O* X- g1 m& L& [
{5 o9 s1 w4 U8 q4 z# f
printk(KERN_ERR "register cdev err!");9 ^# j2 @3 a+ U2 U: W. v
return -1;
1 x- `, r6 }( S }
* a; ?: e4 i, v% U
$ F; Q" v9 W7 m7 X3 U4 K3 ~9 B mcbsp_class=class_create(THIS_MODULE,MCBSP_NAME);
9 ]% `( i! _0 d4 p9 W( Y! X' I if(IS_ERR(mcbsp_class))" X# T, |* k( s2 G5 I7 D" ]
{* L2 l; }- W- y7 G
printk(KERN_ERR "register class err!");
8 c/ [4 P: R5 m return -1;
* ?( T6 v+ b( l. d" z3 e' n6 G }+ t# N3 w/ e! G) E& l+ n
device_create(mcbsp_class,NULL,mcbsp_dev,NULL,MCBSP_NAME);
6 x5 P/ K+ h" k G8 A7 Q
, {! Z w- ?% e2 {, z9 }! k //PSC* [1 V# v) f* t
//add Enable MCBSP4 @/ D$ ?' e5 ?7 j# @) u4 S
//test+ R5 [: ?: h! A6 w
temp = 0x80000003;. C f; z* U+ {7 E \4 z8 p: I
writel(temp, IO_ADDRESS(MDCTL15_ADDR));! O6 p ~$ l) O: O+ X! u$ ?; \
temp = 0x00000003;0 h2 w8 M" I& p% @
writel(temp, IO_ADDRESS(PTCMD_ADDR));
8 H; O) C& m# g% c6 G) q5 y1 l
0 b9 S; Z8 ?- u' I* ] temp = 0x001FF201;* x, P* P1 l+ j$ P+ j
writel(temp, IO_ADDRESS(PDCTL1_ADDR));( T; l! |" n/ o- b8 U$ i
* S/ I! ^( ~9 f: [" ~
//PINMUX
9 [. [! P7 a7 b7 q0 i //MCBSP_CLK(receive/send),MCBSP_STRB(receive/send),MCBSP_DX,MCBSP_DR,
, u( B4 K' A7 } PINMUX1_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET); ' r* R0 V j& G" Z+ Y* P b# G
PINMUX1_REG_old=(PINMUX1_REG_old&0xf000000f)|0x02222220;
* V4 k3 A% z' ^1 Y2 i( x/ K0 k writel(PINMUX1_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX1_OFFSET);
2 c# R/ i% G- k 1 U, M% a" A0 J4 b/ [- Q
//SLEEP_EN,EPR,L138_SHK1,L138_RC$ x& m \7 Y, e" A
PINMUX18_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET); # F* h9 r: U/ D7 c. [5 H* B& ]
PINMUX18_REG_old=(PINMUX18_REG_old&0x0000ffff)|0x88880000;
6 E C9 R) v1 [; o: p7 }! i writel(PINMUX18_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX18_OFFSET);( [, c8 b% R/ g: y
( f. r4 B6 ?5 [9 \ //RESETn,L138_SHK2
/ o2 H R) z5 m* K/ D9 I) ] PINMUX19_REG_old=readl(IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); 3 ~& `5 Z8 [% e1 x& e( {/ o
PINMUX19_REG_old=(PINMUX19_REG_old&0xf0ffff0f)|0x08000080; . ^+ [6 L# R) X2 t
writel(PINMUX19_REG_old, IO_ADDRESS(SYSCFG_BASE)+PINMUX19_OFFSET); |6 p3 a; K [2 j4 B, D
) @- r& f6 ?5 a8 A' C1 s! a
" O6 M& r* ~" H% N5 {7 \
//SPCR Register) w: u0 J* O: k: [( y, F) h
//FREE-1,SOFT-1,FRST-0,GRST-0,XRST-0,RRST-0,RJUST-00(Zero-fill MSBs)reset
5 Z, r/ F. x; j% o$ X! o0 N temp = 0x03000000;//(DLB=0)
7 y( m. i% z, d# m. s // temp = 0x03008000;//(DLB=1)' r' ~. Y2 c3 y+ `9 D5 n
writel(temp,IO_ADDRESS(SPCR_ADDR)); //reset
1 V& l% i* ^& d. _7 b! K+ D temp = readl(IO_ADDRESS(SPCR_ADDR));& V1 H8 H7 M* \2 b4 `) Q. `
printk("temp=%x\n",temp);1 t/ o' t: [' B7 }1 i0 b! P
9 n7 C0 O2 O+ \2 C //PCR Register+ p# S6 n Z% Z4 i: H, u
//FSXM-1,FSRM-1,CLKXM-1,CLKRM-1,SCLKME-0,FSXP-0,FSRP-0,CLKXP-0,CLKRP-05 Z. i! ^" M( J1 J$ N. ^; Z
// temp = 0x00000F0F;( |- Y* b2 ?- v- f5 F- |
temp = 0x00000B0F;$ X" X) O; V q c. u
writel(temp,IO_ADDRESS(PCR_ADDR)); //initialized
8 C, X" o2 Q. b2 F temp = readl(IO_ADDRESS(PCR_ADDR));$ J, v6 X E9 N1 G; S$ g! l+ C
printk("temp=%x\n",temp);
( l4 M+ A. h* t3 C5 P //SRGR Register8 i% B3 B( G9 ]
//GSYNC-0,CLKSP-0,CLKSM-1,FPER-31,FWID-0,CLKGDV==11
& P! {6 X/ T6 }& c' t* o* J. @ //temp = 0x301F000B;- ]! ?' T! |# z" F
writel(0x0301F000B,IO_ADDRESS(SRGR_ADDR)); //initialized
* M+ p& t9 M( N% _* f; o7 p7 ` temp = readl(IO_ADDRESS(SRGR_ADDR));
6 g; ~! [+ \+ J+ f$ w printk("temp=%x\n",temp);
# x, S6 `8 Q6 C' T% |9 ~ //RCR
+ g' D r7 C' m. `" b/ G //RPHASE-0,RFRLEN2-0,RWDLEN2-2,RCOMPAND-0,RFIG-1,/ F, `0 e2 i$ ?* h$ ~
//RDATDLY-0,RFRLEN1-0,RWDLEN1-2,RWDREVRS-0; y/ s: `. [" k$ `
temp = 0x00440040;6 I- j5 L" _% G1 {) H
writel(temp,IO_ADDRESS(RCR_ADDR)); //initialized
) T) q {3 H# ~* b* G temp = readl(IO_ADDRESS(RCR_ADDR));
7 X) g7 n0 d* i4 [* B' O2 i" f+ A printk("temp=%x\n",temp);
. h: H; h. @- ?5 r //XCR! T5 i. F& U& d8 s8 W- j( v% z
//XPHASE-0,XFRLEN2-0,XWDLEN2-2,XCOMPAND-0,XFIG-1
1 m* m) K- m- B //XDATDLY-0,XFRLEN1-0,XWDLEN1-2,XWDREVRS-0$ g$ m5 i+ K. S# H& x( d. b/ p. a
temp = 0x00440040;
3 K0 P( _( R8 w. X writel(temp,IO_ADDRESS(XCR_ADDR)); //initialized 9 f, Z; ^7 F6 z* ?
temp = readl(IO_ADDRESS(XCR_ADDR));
" Y/ e2 ]% Y) J6 x printk("temp=%x\n",temp);
. R+ Z7 ~3 q# j- Y udelay(100);, {, Q, B$ k7 I& {4 c6 m8 L
//SPCR Register, J5 c- Q+ z9 V: r5 y% s; D
//FREE-1,SOFT-1,FRST-1,GRST-1,XRST-1,RRST-13 G7 F) A" l, r, g3 b" T u
temp = 0x03C10001; //DLB = 0 VS DLB = 1- G3 _* A1 `0 s$ k
writel(temp,IO_ADDRESS(SPCR_ADDR)); //enabled3 ?+ z2 b: V' P
temp = readl(IO_ADDRESS(SPCR_ADDR));: K. s/ r$ }0 w) J0 T- L* |6 V
printk("temp=%x\n",temp);
3 G; P; _: @( y udelay(100);
, g- x$ @( }8 ~. c$ x
5 u5 y8 h8 i+ r/ P' G) v //set GPIO direction) e2 U5 R0 {$ U8 m: v0 [8 q% X8 \
temp = __raw_readl(IO_ADDRESS(GPIO8_DIRECT));
5 [- @& s. A; ^6 y! K temp = temp | 0x00000100;//EPR----input
4 R9 l9 R" K' h0 m' d# s temp = temp&(~0x00000500);//RESETn,SLEEP_EN---output
. z0 ~7 `+ T+ Z, ?/ H __raw_writel(temp,IO_ADDRESS(GPIO8_DIRECT));
$ x9 j0 H2 I- K+ w t/ f# u
4 X9 _4 X6 @: ]1 k" D9 q! m- ] return 0;
4 g+ o( x+ s4 b) s' ]) m}* `. Z0 ~: a0 A. v
static void __exit MCBSP_exit(void)
. `' ^. z( b* h! I* U+ b{
* Z: Z% @3 H/ Y6 t printk("mcbsp chrdev exit!\n");
8 j" k0 _4 b- }/ h/ U! a& X* _ cdev_del(mcbsp_cdev);
2 K t6 [. b; \: j k unregister_chrdev_region(mcbsp_dev,count);' [9 T& f# V! h1 M* d5 n0 K$ ]- m
device_destroy(mcbsp_class,mcbsp_dev);9 I7 E& \: X) m9 N o0 b# U
class_destroy(mcbsp_class);1 S1 H1 o, L& K
}
* ~% Z/ R! A' h" m4 Ymodule_init(MCBSP_init);
+ J' u/ Y3 S& D4 P* ]* xmodule_exit(MCBSP_exit);
+ ~7 A# {3 X4 G& E' @5 H8 o& d- |% f9 U( E4 }' y
MODULE_LICENSE("GPL");
' L5 V5 O8 {! h6 P
, _- y5 X' s( a4 T, _) Z L我讲上面的程序insmod之后我用示波器量 McBSP的发送时钟脚,发送数据脚(我还没有发送数据)以及发送同步脚,3个脚的信号是一样的,不管是用我自己的底板测试还是用创龙OMAPL38 的开发板测试,都是一样的,类似于噪声的信号时钟频率也不对。
$ }* z3 R* ?6 H8 T( ~* F( l. ?4 r3 ?我的应用层的测试程序如下" ~' o) l) @1 ? F
#include <stdio.h>
. U+ J+ ?" m1 k( D5 o0 U* W6 s9 c#include <string.h>2 h/ H4 f; z: e" I! B7 m. e. L
#include <fcntl.h>- h- ]! F! m- H9 i* J) o
#include <unistd.h>9 B6 |9 |* y2 y
#include <signal.h>: f3 {& y) I: A+ i
#include <pthread.h> //线程
: e% X3 v0 d4 d4 Y2 v#include <stdlib.h>
/ N2 O8 l& P2 w% x M. t& n3 A! [$ P#include <pcap.h> //捕获网口数据. A! |. d: L9 |
#include <semaphore.h> //信号
7 [. L* p/ ^% d, P" \, v' |#include <sys/types.h> //消息对列
/ D6 W- y0 T# p! x#include <sys/ipc.h> //消息队列& L2 i+ |- D# S8 s) A
#include <sys/msg.h> //消息队列: X+ a1 J8 g1 A
#include <sys/select.h>
- F3 T7 q. f1 z1 F#include <sys/syscall.h>
5 J! K, I5 y; Y2 r' q$ I#include <sys/stat.h>
0 r& R4 |& v: L; m6 p#include <sys/mman.h>
: |; ^ k. p! a2 G7 J2 j! b#define msleep(x) usleep(1000*x)
& d o- R( z' s8 f; ]* A5 J3 ]9 Z$ j: x0 ?4 @# ~. \
int main()5 f m* P/ C) z
{
& a" `& D- `. l4 D, t& y1 _ //MCBSP,ARM与AMBE2000交互设备. e' f& u" X0 g) \
int fd;; N4 k9 [9 n' n% j
unsigned short data_write = 0x5555;/ d3 n6 {4 }4 k3 A
unsigned short data_read = 0x00;
' X- W- J4 J' N fd = open("/dev/MCBSP-device", O_RDWR | O_NONBLOCK | O_SYNC);
# L$ t8 o7 _- a- | // fd = open("/dev/led-device", O_RDWR | O_NONBLOCK | O_SYNC);
( _* `8 I0 U+ j. O8 Z
1 E$ a& o! m$ {/ Z6 O; i if(fd < 0)
1 }; K0 ?. Z" ?" G$ K, s0 ?$ P4 F {6 O; e+ P2 B( a }2 J
perror("open failed\n");* a" |. S; O$ Z
return -1;8 Y; U$ L, U5 b3 V; I) F
}
6 c* M0 k/ M, w4 g- w
4 F$ l+ c0 ^2 h! G1 \0 D while(1) p# I6 ~+ k# f( [
{
6 j9 L4 s3 p4 o) F! O. c# k: p $ b3 k |8 ]; d
//AMBE2000每次读写是24个字为一帧
2 v! Y4 g1 T2 V //写数据时将数据在底层存储起来,等到中断的时候再发送
; A8 h( I! v( W0 |( y //AMBE2000输入数据是以0x13EC开头的
6 x: {! t0 }, y* ]0 o6 z# w, h write(fd,&data_write,sizeof(unsigned short));+ N6 A4 g8 {+ V$ S' X9 T* s6 z
2 \* ~/ y1 m7 d) H/ b //读数据的时候,在底层中断中将接收到的数据存储起来,然后再传送到应用层
/ x; o3 f* r+ S7 b& g+ S read(fd,&data_read,sizeof(unsigned short));
* q) V2 o$ G z2 J! y' A, Z
1 ~/ k+ j. C1 w' s) X7 O if(data_read == 0x13Ec)7 @6 W1 @/ ?# B1 t1 I: A
{
; ]) J# w. P/ M9 b( a
7 _' @6 M3 x! _* \( I, O0 N printf("data_read = %x\n",data_read);
9 p3 e6 S& F5 x3 g }7 f" n P- e, t" w( j' Y
. w8 |5 L# ?8 U* D) r7 V9 s msleep(10);8 w+ P9 g) ~: @# M B* h9 J
% H/ K! R5 N# R* d0 X3 {
/*( T$ ~* T+ R2 c) E3 t4 c+ \
ioctl(fd,1); + `, A {) P+ V$ a5 m( H
sleep(1);: M5 a4 w; \3 k$ L) \0 g: x( w
ioctl(fd,0);
: {/ \- m, R' a2 y1 C, v8 S* u sleep(1);
* a7 D/ e1 s9 ^6 c4 P */ $ K [3 {7 [3 o. N- w* v
} % Y% ~1 r, V9 X( Q
return 0;: {0 \+ u0 q7 Y y
- q) g3 C8 n& Z% t
}
# D; u$ {3 M- e* Q3 k4 M5 _% I1 V: Z9 I6 K
多谢各位指教,谢谢! 急0 G4 k; }: b! m `% g8 f
3 S1 F o- B1 O
* U, h$ s: x9 b( q5 H, o( ]4 j5 C8 }) A- P1 P/ q) N. ~* E! U
. W- K* _6 {) a. h
0 g. G3 L8 s$ F- Y3 u8 q |
|