搜索
bottom↓
回复: 9

入门进行中,被LINUX戏弄,本坛人气旺,在其他LINUX论坛发的

[复制链接]

出0入0汤圆

发表于 2012-11-28 11:40:37 | 显示全部楼层 |阅读模式
贴没收获,重发这
我使用飞淩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寄存器肯定映射到确定的地址空间,所以我期望用
*volatile ADDR=DATA方式来访问,遗憾的是没能查到映射的地址,水平所限,也不能用其他途径知道地址参数,所以也没实现

我的目的是期望比较少的延时(由于系统调用造成的10ms延时不考虑)操作SPI,不知道有哪些可行办法

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-11-28 11:58:02 | 显示全部楼层
数据量越大,效率就越高。
不然,单字节操作比51还慢。

出0入0汤圆

发表于 2012-11-28 11:59:14 | 显示全部楼层
在 mini2440 上面弄SPI驱动,再挂MCP2510刚成功的飘过。

出0入0汤圆

 楼主| 发表于 2012-11-28 12:15:05 | 显示全部楼层
本帖最后由 NJ8888 于 2012-11-28 12:16 编辑
aozima 发表于 2012-11-28 11:58
数据量越大,效率就越高。
不然,单字节操作比51还慢。


我那个应用恰好是小量数据突发性的频繁交互(与FPGA交互,要先读回状态,在写入控制在读回,反复三次,每次4--40字节不等),所以我想跳过系统调用直接寄存器操作,至于系统时间片造成10ms延时倒没很大关系,我有的FPGA有FIFO能缓冲,但不希望每次交互额外加100us,一轮四次就400us了,我一次突发可能有50轮

出0入0汤圆

发表于 2012-11-28 12:22:55 | 显示全部楼层
系统调用应该没有10ms吧,这个时间有点吓人
应该是线程切换要10ms一次,不切换不就行了,等处理完再切换

出0入0汤圆

 楼主| 发表于 2012-11-28 12:25:29 | 显示全部楼层
xi_liang 发表于 2012-11-28 12:22
系统调用应该没有10ms吧,这个时间有点吓人
应该是线程切换要10ms一次,不切换不就行了,等处理完再切换
...

是切换,我用词不准

出0入0汤圆

发表于 2012-11-28 13:19:32 | 显示全部楼层
做法不对,不要在应用层做,你自己做一个驱动,挂在SPI总线上实现。比如中断触发,SPI读写一堆数据等。

出0入0汤圆

发表于 2012-11-28 13:34:24 | 显示全部楼层
瞎猜了一下:Linux下的SPI总线是单独作为一个设备的,有一个类似硬件抽象层的驱动似乎翻译成平台也就是platform,外围器件都挂在platform上访问Linux用这个东西来屏蔽不同设备的时序和协议,上面没看到这一部分的内容(有一个添加的动作)所以估计B过程的error是这个原因.另外,ioctl本身就可以在用户空间直接操作寄存器的,但是需要有东西可以操作,LS的方法是大多数开发者都用的办法,做一个内核模块开机加载到内核,然后ioctl直接操作.

出0入0汤圆

 楼主| 发表于 2012-11-29 11:45:12 | 显示全部楼层
最新状况:原来ioremap是真是内核用的,应用程序用不了.改到内核试验,控制GPIO可以了,但是我把地址换成SPI数据口,控制没能启动SPI传送

出0入0汤圆

发表于 2012-11-30 07:54:43 | 显示全部楼层
这个啥,想知道
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-16 02:04

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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