开发者社区 问答 正文

有人做过瑞芯微RK3188的PCBA测试程序吗?

我做的时候遇到了以下问题,待解决。
通过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;
}

展开
收起
morixinguan 2016-03-28 10:45:10 4234 分享 版权
阿里云 AI 助理回答

根据您描述的问题,ioctl 操作 /dev/ion 时出现 Not a typewriter(错误码 ENOTTY)以及 No such device 的问题,结合知识库中的相关资料和您的代码片段,以下是详细的分析与解决方案:


问题分析

  1. 错误原因:ENOTTY (Not a typewriter)

    • 根据您引用的解释,ENOTTY 表示尝试对一个普通文件执行了设备专用的 ioctl 操作,而该文件并不是字符设备或块设备。
    • 在您的场景中,/dev/ion 是一个用于内存分配的字符设备节点。如果 ioctl 返回 ENOTTY,可能的原因包括:
      • /dev/ion 节点未正确创建或权限不足。
      • 打开的文件描述符 iIonFd 并非指向 /dev/ion,而是其他类型的文件。
  2. 错误原因:No such device

    • 这个错误通常表示设备节点不存在或驱动未正确加载。虽然您提到摄像头硬件检测正常,但 /dev/ion 的驱动可能存在问题,例如:
      • 驱动未正确初始化。
      • 设备树配置不完整,导致 /dev/ion 无法被正确识别。
  3. 代码层面的问题

    • 您的代码片段中,ION_IOC_ALLOC 是一个用于分配内存的 ioctl 命令。如果 iIonFd 不是指向 /dev/ion 的有效文件描述符,或者 buff_sizealign 等参数设置不合理,也可能导致失败。

解决方案

步骤一:确认 /dev/ion 节点的正确性

  1. 检查设备节点是否存在
    使用以下命令确认 /dev/ion 是否存在:

    ls -l /dev/ion
    

    如果不存在,请检查内核是否启用了 ion 驱动,并确保设备树中正确配置了 ion 节点。

  2. 检查权限
    确保当前用户有权限访问 /dev/ion。如果没有权限,可以通过以下方式添加:

    sudo chmod 666 /dev/ion
    

    或者在 Android 系统中,确保应用具有访问设备节点的权限。

  3. 验证文件类型
    确认 /dev/ion 是字符设备:

    file /dev/ion
    

    输出应为类似 character special 的内容。如果不是,请重新加载驱动。


步骤二:检查文件描述符的有效性

  1. 打开 /dev/ion 时的返回值
    确保 open 函数成功打开了 /dev/ion,并返回有效的文件描述符。例如:

    int iIonFd = open("/dev/ion", O_RDWR);
    if (iIonFd < 0) {
       perror("Failed to open /dev/ion");
       return -1;
    }
    
  2. 验证文件描述符类型
    使用 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 参数的正确性

  1. ION_IOC_ALLOC 参数校验
    确保 ionAllocData 的参数设置合理。例如:

    struct ion_allocation_data ionAllocData = {0};
    ionAllocData.len = buff_size;       // 分配的内存大小
    ionAllocData.align = 4 * 1024;      // 对齐大小
    ionAllocData.flags = 1;             // 内存标志位
    
  2. 调用 ioctl 并捕获错误
    使用 ioctl 时,捕获并打印错误信息以便调试:

    int err = ioctl(iIonFd, ION_IOC_ALLOC, &ionAllocData);
    if (err < 0) {
       perror("ION_IOC_ALLOC failed");
       close(iIonFd);
       return -1;
    }
    

步骤四:检查驱动和内核支持

  1. 确认 ion 驱动已加载
    使用以下命令检查 ion 驱动是否加载:

    dmesg | grep ion
    

    如果没有输出,说明驱动未正确加载。请检查内核配置,确保启用了 CONFIG_ION

  2. 更新设备树配置
    如果使用的是瑞芯微 RK3188 平台,确保设备树中正确配置了 ion 节点。例如:

    ion: ion@ff9f0000 {
       compatible = "rockchip,ion";
       reg = <0xff9f0000 0x1000>;
       interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
    };
    
  3. 升级内核版本
    如果问题仍然存在,建议升级到最新的内核版本,以修复潜在的驱动问题。


总结与建议

  • 关键点ENOTTYNo such device 错误通常与设备节点或驱动相关。请优先检查 /dev/ion 的存在性、权限和驱动加载状态。
  • 调试建议:在代码中增加更多的错误处理逻辑,捕获并打印详细的错误信息,便于定位问题。
  • 进一步支持:如果上述方法仍无法解决问题,建议提交工单,提供完整的日志和代码片段,获取更深入的技术支持。

希望以上解答能够帮助您解决问题!

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: