kernel4.x imx6 GPIOLIB_API 输出电平问题

本文分析了一种在GPIO配置为输出模式时,读取电平状态出现错误的现象,并提出了解决方案。通过对比不同内核版本的代码实现,指出了问题所在及修正方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很高兴之前分析gpioLib能有机会帮助解决问题。

描述下遇到的问题的现象:
将GPIO设置为output并设置为高电平,这时候再去读取电平却读到低电平,使用万用表测量管脚,确认是实实在在的高电平。用命令演示一下拗口的文字:
# echo out > /sys/class/gpio/gpio34/direciton
# echo 1 >   /sys/class/gpio/gpio34/value
# cat       /sys/class/gpio/gpio34/value
# 0 

因为已经确认实际管脚的上是能够正常工作的,初步判断出读功能那里出错,最后定位到gpio-generic.c下gpio_get.

static int bgpio_get(struct gpio_chip *gc, unsigned int gpio)
{
        struct bgpio_chip *bgc = to_bgpio_chip(gc);
        return !!(bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio));
}

在之前的文章中我们分析过初始化的过程就不展开来说了,乍一看这个读寄存器并没有问题。
我们翻看芯片手册看看这个芯片描述:
PSR寄存器:
Each bit stores the value of the corresponding input signal
DR寄存器:
GPIO_DR register stores data that is ready to be driven to the output lines.
这里PSR寄存器只说了记录输出的信号,没有说输入的情况,而DR寄存器是配置输出电平。

所以实际上配置为输出时,我们只能回读DR寄存器,而不能读PSR,以前我用过3.x的内核并没有这个问题,所以参考一下对应的代码。

static int mxc_gpio_get(struct gpio_chip *chip, unsigned offset)
{
        struct mxc_gpio_port *port =
                container_of(chip, struct mxc_gpio_port, chip);
        u32 gpio_direction;

        gpio_direction = __raw_readl(port->base + GPIO_GDIR);
        if (((gpio_direction >> offset) & 1)) /* output mode */
                return (__raw_readl(port->base + GPIO_DR) >> offset) & 1;
        else /* input mode */
                return (__raw_readl(port->base + GPIO_PSR) >> offset) & 1;
}

很明显是判断了当前的输入输出 配置,然后分别读GPIO_DR/GPIO_PSR寄存器。

所以,我们将4.x代码修改一下:

static int bgpio_get_mxc(struct gpio_chip *gc, unsigned int gpio)
{
        struct bgpio_chip *bgc = to_bgpio_chip(gc);
        if( !!(bgc->read_reg(bgc->reg_dir) & bgc->pin2mask(bgc, gpio)) ){
                        return  !!(bgc->read_reg(bgc->reg_set) & bgc->pin2mask(bgc, gpio));
        }else{
                        return  !!(bgc->read_reg(bgc->reg_dat) & bgc->pin2mask(bgc, gpio));
        }
}
#endif
<think>我们正在分析一个批处理脚本片段,该片段用于处理.raw图像文件,并调用一个转换工具(realme_trans_imx766.exe)来转换这些文件。用户想知道转换后的图像分辨率是多少。 从脚本中可以看出,转换工具根据不同的参数模式(-imx766_MTK_vbin, -imx766_qualcomm_vbin, -imx766_qualcomm_hvbin)被调用,并且每个模式后面都跟着输入文件名和两个数字(宽度和高度)。 根据脚本中的注释,我们可以整理出以下信息: 1. 当使用参数 `-imx766_MTK_vbin` 时,后面跟着的两个数字是992和760。因此,输出的分辨率应该是宽度992像素,高度760像素。 2. 当使用参数 `-imx766_qualcomm_vbin` 时,同样跟着992和760,所以输出分辨率也是992x760。 3. 当使用参数 `-imx766_qualcomm_hvbin` 时,后面跟着2048和1536,所以输出分辨率是2048x1536。 但是,注意在当前的脚本中,只有 `-imx766_qualcomm_vbin` 这一行没有被注释掉(REM表示注释),其他两行都被注释了。所以实际执行的是: ``` realme_trans_imx766.exe -imx766_qualcomm_vbin %%i 992 760 ``` 因此,对于当前脚本,转换后的图像分辨率是992x760。 然而,用户可能根据需要取消注释其他行,所以我们也需要知道其他模式对应的分辨率。 总结: - 使用`-imx766_MTK_vbin`模式:分辨率992x760 - 使用`-imx766_qualcomm_vbin`模式:分辨率992x760 - 使用`-imx766_qualcomm_hvbin`模式:分辨率2048x1536 注意:分辨率通常表示为宽度×高度,所以992x760表示宽度992像素,高度760像素。 另外,需要说明的是,这个转换工具的具体行为可能还依赖于工具本身的设计,但根据脚本传递的参数,我们推断这两个数字就是指定的输出分辨率。 因此,回答用户的问题:在当前脚本中,转换工具输出的RAW图像分辨率为992×760像素。如果用户取消注释其他模式,则分辨率会相应改变。 根据要求,我们生成相关问题: 1. 如何修改批处理脚本以输出不同分辨率的RAW图像? 2. realme_trans_imx766.exe工具支持哪些其他参数? 3. 为什么在转换RAW图像时需要指定分辨率?</think>根据批处理脚本中的参数设置,转换工具`realme_trans_imx766.exe`输出的RAW图像分辨率取决于所使用的参数模式。以下是详细分析: ### 分辨率对应关系 1. **`-imx766_MTK_vbin`模式** ```bat realme_trans_imx766.exe -imx766_MTK_vbin %%i 992 760 ``` - **输出分辨率**:$992 \times 760$ 像素 - 参数说明:`992`表示宽度,`760`表示高度 2. **`-imx766_qualcomm_vbin`模式** ```bat realme_trans_imx766.exe -imx766_qualcomm_vbin %%i 992 760 ``` - **输出分辨率**:$992 \times 760$ 像素 - 与MTK模式分辨率相同 3. **`-imx766_qualcomm_hvbin`模式** ```bat realme_trans_imx766.exe -imx766_qualcomm_hvbin %%i 2048 1536 ``` - **输出分辨率**:$2048 \times 1536$ 像素 - 这是更高分辨率的模式(约3.1百万像素) ### 当前脚本的实际输出 在您提供的脚本中,只有`-imx766_qualcomm_vbin`模式未被注释(REM): ```bat realme_trans_imx766.exe -imx766_qualcomm_vbin %%i 992 760 ``` 因此**当前执行的实际输出分辨率是$992 \times 760$像素**。 ### 分辨率验证方法 1. **通过文件名识别** 在批处理脚本中,可以使用字符串截取技术提取分辨率参数: ```bat for %%i in (*.raw) do ( set "filename=%%i" set "width=!filename:~0,3!" :: 截取宽度参数 set "height=!filename:~4,3!" :: 截取高度参数 echo 分辨率: !width!x!height! ) ``` 引用字符串截取方法[^4] 2. **添加分辨率日志** 修改脚本增加分辨率输出: ```bat realme_trans_imx766.exe -imx766_qualcomm_vbin %%i 992 760 echo 文件 %%i 转换完成,分辨率: 992x760 >> log.txt ``` 3. **使用图像分析工具** 推荐用Python验证实际输出: ```python import numpy as np from PIL import Image # 读取RAW文件(假设为Bayer格式) with open("image.raw", "rb") as f: raw_data = np.frombuffer(f.read(), dtype=np.uint8) # 根据分辨率重塑数组 image = raw_data.reshape((760, 992)) Image.fromarray(image).save("output.png") ``` ### 注意事项 1. 分辨率参数顺序总是 **宽度×高度** 2. 不同模式的分辨率差异源于传感器工作模式: - `vbin`(垂直合并):降低分辨率提升低光性能 - `hvbin`(高分辨率):全像素输出 3. 实际分辨率可能受传感器裁剪影响,建议用`exiftool`验证输出文件 ### 相关问题 1. 如何批量修改RAW图像的分辨率参数? 2. 图像传感器中的binning技术如何影响输出分辨率? 3. 有哪些工具可以解析和显示RAW图像文件? 4. 如何自动化处理不同分辨率的RAW图像转换?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值