- 积分
- 185
贡献56
飞刀0 FD
注册时间2012-10-6
在线时间148 小时
扫一扫,手机访问本帖
|
我使用飞淩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,不知道有哪些可行办法
|
|