嵌入式爱好者

查看: 8574|回复: 1

新手求指导

[复制链接]

14

主题

35

帖子

185

积分

扫一扫,手机访问本帖
发表于 2012-11-27 09:57:38 | 显示全部楼层 |阅读模式
我使用飞淩OK6410板子 LINUX3.0.1环境,试验SPI特性,因为飞淩内核不能做三星SPIDEV_TEST的试验,我在网上找来方法重配置内核,加入SPI设备,试验能看到SPI动作,但是感觉效率很低,
A--------ioctl(fbport,0,1);
B-------- write(fspi,&tx,2);
C---------ioctl(fbport,1,1);
我用这样代码,通过IO口观察WRITE调用,结果发现从A时刻到SPI的时钟输出,延时50us—100us,从B到C延时50us,查看了代码,发现WRITE做了许多工作,包括一些数据长度等有效性判断,关闭共享,拷贝应用数据块到内核数据区等工作.这样的操作,相对对我的需求太消耗时间,我能确定我应用层不会产生多个线程争用SPI,数据长度有效.我的目的是希望从我操作SPI指令发出到SPI执行时间尽量短(比如5us内).为此我上网找了若干解决办法做了试验,但是没有成功,下面介绍些我做的试验:
A-------- ioremap
我希望得到SPI的虚拟地址然后直接操作SPI寄存器,在应用程序中加入并把io.h包含,没有编译过去,说是没定义,网上说法好像ioremap不能再应用程序中使用

B--------mmap
网上说这个能在应用程序中使用,所以我这样用,其中fspi打开时成功的,因为我关于fspi的ioctl  write都是有反应的
fspi = open("/dev/spidev0.0", O_RDWR);
if (fspi < 0)
   QMessageBox::warning(this, tr("Error"), tr("can't open device"));
addr=(char *)mmap(NULL,2,PROT_READ|PROT_WRITE,MAP_SHARED,fspi,0);
ui->lineEdit_4->setText(QString::number(errno));
errno返回19号错,对应说NO  SUCH  DEVICE
所以这个也失败了

C---------直接操作SPI
我想对于确定的板子和内核,SPI寄存器肯定映射到确定的地址空间,所以我期望用
*voiatile ADDR=DATA方式来访问,遗憾的是没能查到映射的地址,水平所限,也不能用其他途径知道地址参数,所以也没实现

我的目的是期望比较少的延时(由于系统调用造成的10ms延时不考虑)操作SPI,不知道有哪些可行办法
该会员没有填写今日想说内容.
回复

使用道具 举报

0

主题

0

帖子

0

积分

发表于 2012-11-27 15:08:12 | 显示全部楼层
用户空间要是用mmap的话,好像驱动中要实现对应的接口函数,要查看静态映射的地址的话,应该是在
arch/arm/mach-s3c2410/mach-smdk2440.h里面的一个struct
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-12-27 11:41

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表