前言
人要经常学会反思总结,这样才能不断的进步。同样,一个合格优秀的软件工程师也需要经常的总结反思自己工作中遇到的问题,这样才能使自己的能力不断的提升。我从来不给自己定位为程序猿,多年后,请叫我软件工程师乃至软件架构师,哈哈,又装逼了我!
纵使我现在还年轻,能力阅历还未达到大师级别,但是人要有梦想,万一实现了呢?可是相比较梦想,我觉得有目标比较实际。卧槽,每次写博客都是这样,先是装逼似的跑题一下,然后再进入正题,哈哈,读者莫见怪,只是为了让文章更加生动有趣。OK,今天我要说的是:“一次意外的ioctl调用错误—论不同版本内核的ioctl函数实现!!”

这个问题来源于我公司的一个项目:“BCMXXXX平台无线modem驱动移植!”当时的问题是:模块上电时序都正确、可以正常工作,可是用POS机上的拨号测试程序去测试无线modem是否拨号成功的时候,出现了错误!具体错误在应用层测试程序通过ioctl函数调用驱动层的ioctl时候,出现ioctl调用无效的错误,命令无法被识别。这到底是什么问题呢?后来查了半天才知道原因:原来是由于不同版本的内核的ioctl函数实现不一样导致的!!
1 问题描述
驱动移植之后,无线模块可以正常开启了,但是使用POS自带的测试程序测试的时候却发现测试异常。这个问题花了我两天时间才解决,一开始请教别人的时候,他们说可能是应用层NDK的问题,于是我就自己写了一个无线模块的测试程序去判断到底是驱动问题还是应用层的NDK问题。
我的测试程序如下图所示,通过应用层open函数打开无线驱动设备文件,然后用ioctl获取无线modem模块的类型。应用层ioctl传值给驱动层的ioctl函数,驱动层调用相应的命令获取无线模块的类型。
可是结果却是应用层的ioctl传的命令值到驱动层就变了,导致驱动层ioctl函数无法识别应用层传来的命令值是多少&#