我做的时候遇到了以下问题,待解决。
通过ioctl 操作 /dev/ion 时出现 not a typewriter。
有的时候还会出现:no such device,但是节点已经被打开了,就是不清楚为什么会这样,摄像头的硬件我检测过了,没有问题
看到一种解释: 如果操作的是一个普通文件,而不是字符特殊文件,就返回 E N O T T Y(这是在这种情况下的典
型返回值)。
希望能够有人给予解答,该怎么改变才能成功操作ion。
最近在开发瑞芯微RK3188的摄像头应用程序,是根据V4L2来写的,进安卓系统摄像头工作正常说明驱动其实没问题,但是就是不清楚ioctl时会出现这样的问题。
bug如下:
CameraCreate: ION_IOC_ALLOC failed to alloc 0x200000 bytes with error - Not a typewriterstartCameraTest camera create erro
camrea0 test over
代码如下:
ionAllocData.len = buff_size;
ionAllocData.align = 4*1024;
ionAllocData.flags = 1 << 0;
err = ioctl(iIonFd, ION_IOC_ALLOC, &ionAllocData);
if(err) {
printf("%s: ION_IOC_ALLOC failed to alloc 0x%x bytes with error - %s",
__FUNCTION__, ionAllocData.len, strerror(errno));
err = -errno;
goto exit2;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的问题,ioctl
操作 /dev/ion
时出现 Not a typewriter
(错误码 ENOTTY
)以及 No such device
的问题,结合知识库中的相关资料和您的代码片段,以下是详细的分析与解决方案:
错误原因:ENOTTY (Not a typewriter)
ENOTTY
表示尝试对一个普通文件执行了设备专用的 ioctl
操作,而该文件并不是字符设备或块设备。/dev/ion
是一个用于内存分配的字符设备节点。如果 ioctl
返回 ENOTTY
,可能的原因包括:
/dev/ion
节点未正确创建或权限不足。iIonFd
并非指向 /dev/ion
,而是其他类型的文件。错误原因:No such device
/dev/ion
的驱动可能存在问题,例如:
/dev/ion
无法被正确识别。代码层面的问题
ION_IOC_ALLOC
是一个用于分配内存的 ioctl
命令。如果 iIonFd
不是指向 /dev/ion
的有效文件描述符,或者 buff_size
、align
等参数设置不合理,也可能导致失败。/dev/ion
节点的正确性检查设备节点是否存在
使用以下命令确认 /dev/ion
是否存在:
ls -l /dev/ion
如果不存在,请检查内核是否启用了 ion
驱动,并确保设备树中正确配置了 ion
节点。
检查权限
确保当前用户有权限访问 /dev/ion
。如果没有权限,可以通过以下方式添加:
sudo chmod 666 /dev/ion
或者在 Android 系统中,确保应用具有访问设备节点的权限。
验证文件类型
确认 /dev/ion
是字符设备:
file /dev/ion
输出应为类似 character special
的内容。如果不是,请重新加载驱动。
打开 /dev/ion
时的返回值
确保 open
函数成功打开了 /dev/ion
,并返回有效的文件描述符。例如:
int iIonFd = open("/dev/ion", O_RDWR);
if (iIonFd < 0) {
perror("Failed to open /dev/ion");
return -1;
}
验证文件描述符类型
使用 fstat
检查文件描述符是否指向字符设备:
struct stat st;
if (fstat(iIonFd, &st) < 0 || !S_ISCHR(st.st_mode)) {
fprintf(stderr, "iIonFd is not a character device\n");
close(iIonFd);
return -1;
}
ioctl
参数的正确性ION_IOC_ALLOC
参数校验
确保 ionAllocData
的参数设置合理。例如:
struct ion_allocation_data ionAllocData = {0};
ionAllocData.len = buff_size; // 分配的内存大小
ionAllocData.align = 4 * 1024; // 对齐大小
ionAllocData.flags = 1; // 内存标志位
调用 ioctl
并捕获错误
使用 ioctl
时,捕获并打印错误信息以便调试:
int err = ioctl(iIonFd, ION_IOC_ALLOC, &ionAllocData);
if (err < 0) {
perror("ION_IOC_ALLOC failed");
close(iIonFd);
return -1;
}
确认 ion
驱动已加载
使用以下命令检查 ion
驱动是否加载:
dmesg | grep ion
如果没有输出,说明驱动未正确加载。请检查内核配置,确保启用了 CONFIG_ION
。
更新设备树配置
如果使用的是瑞芯微 RK3188 平台,确保设备树中正确配置了 ion
节点。例如:
ion: ion@ff9f0000 {
compatible = "rockchip,ion";
reg = <0xff9f0000 0x1000>;
interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
};
升级内核版本
如果问题仍然存在,建议升级到最新的内核版本,以修复潜在的驱动问题。
ENOTTY
和 No such device
错误通常与设备节点或驱动相关。请优先检查 /dev/ion
的存在性、权限和驱动加载状态。希望以上解答能够帮助您解决问题!