死磕QNX ADC配置一

最开始尝试在安卓下直接配置,可以看到可以出测试节点,但是会出现测试失败。
--- a/arch/arm64/configs/vendor/autogvm_QGKI.config
+++ b/arch/arm64/configs/vendor/autogvm_QGKI.config
@@ -159,3 +159,7 @@ CONFIG_CHSC5XXX_TOUCHPANEL_DRIVER=m
 #add for ghk
 CONFIG_NET_VENDOR_RTL8125=m
 CONFIG_ETHERNET=y
+
+#add for smic
+CONFIG_QCOM_SPMI_ADC5=y

diff --git a/drivers/iio/adc/qcom-spmi-adc5.c b/drivers/iio/adc/qcom-spmi-adc5.c
index 5c671b017c17..24eef3ff098b 100644
--- a/drivers/iio/adc/qcom-spmi-adc5.c
+++ b/drivers/iio/adc/qcom-spmi-adc5.c@@ -971,26 +988,78 @@ static const struct adc5_channels adc5_chans_pmic[ADC5_MAX_CHANNEL] = {
                                        SCALE_HW_CALIB_BATT_THERM_400K)
        [ADC5_BAT_ID_100K_PU]   = ADC5_CHAN_TEMP("bat_id", 0,
                                        SCALE_HW_CALIB_DEFAULT)
-       [ADC5_AMUX_THM1_100K_PU] = ADC5_CHAN_TEMP("amux_thm1_100k_pu", 0,
-                                       SCALE_HW_CALIB_THERM_100K_PULLUP)
-       [ADC5_AMUX_THM2_100K_PU] = ADC5_CHAN_TEMP("amux_thm2_100k_pu", 0,
-                                       SCALE_HW_CALIB_THERM_100K_PULLUP)
+       //[ADC5_AMUX_THM1_100K_PU] = ADC5_CHAN_TEMP("amux_thm1_100k_pu", 0, SCALE_HW_CALIB_THERM_100K_PULLUP)
+       [ADC5_AMUX_THM1]        = ADC5_CHAN_VOLT("amux_thm1", 0, SCALE_HW_CALIB_DEFAULT)
+       //[ADC5_AMUX_THM2_100K_PU] = ADC5_CHAN_TEMP("amux_thm2_100k_pu", 0, SCALE_HW_CALIB_THERM_100K_PULLUP)
+       [ADC5_AMUX_THM2]        = ADC5_CHAN_VOLT("amux_thm2", 0, SCALE_HW_CALIB_DEFAULT)
        [ADC5_AMUX_THM3_100K_PU] = ADC5_CHAN_TEMP("amux_thm3_100k_pu", 0,
                                        SCALE_HW_CALIB_THERM_100K_PULLUP)
        [ADC5_AMUX_THM4_100K_PU] = ADC5_CHAN_TEMP("amux_thm4_100k_pu", 0,
                                        SCALE_HW_CALIB_THERM_100K_PULLUP)
-       [ADC5_AMUX_THM2]        = ADC5_CHAN_TEMP("amux_thm2", 0,
-                                       SCALE_HW_CALIB_PM5_SMB_TEMP)
+       //[ADC5_AMUX_THM2]      = ADC5_CHAN_TEMP("amux_thm2", 0, SCALE_HW_CALIB_PM5_SMB_TEMP)
        [ADC5_PARALLEL_ISENSE]  = ADC5_CHAN_VOLT("parallel_isense", 0,
                                        SCALE_HW_CALIB_PM5_CUR)
-       [ADC5_GPIO1_100K_PU]    = ADC5_CHAN_TEMP("gpio1_100k_pu", 0,
-                                       SCALE_HW_CALIB_THERM_100K_PULLUP)
+       //[ADC5_GPIO1_100K_PU]  = ADC5_CHAN_TEMP("gpio1_100k_pu", 0, SCALE_HW_CALIB_THERM_100K_PULLUP)
+       [ADC5_GPIO1]    = ADC5_CHAN_VOLT("gpio1", 0, SCALE_HW_CALIB_DEFAULT)
        [ADC5_GPIO2_100K_PU]    = ADC5_CHAN_TEMP("gpio2_100k_pu", 0,
                                        SCALE_HW_CALIB_THERM_100K_PULLUP)
        [ADC5_GPIO3_100K_PU]    = ADC5_CHAN_TEMP("gpio3_100k_pu", 0,
                                        SCALE_HW_CALIB_THERM_100K_PULLUP)
-       [ADC5_GPIO4_100K_PU]    = ADC5_CHAN_TEMP("gpio4_100k_pu", 0,
+       //[ADC5_GPIO4_100K_PU]  = ADC5_CHAN_TEMP("gpio4_100k_pu", 0, SCALE_HW_CALIB_THERM_100K_PULLUP)
+       [ADC5_GPIO4]    = ADC5_CHAN_VOLT("gpio4", 0, SCALE_HW_CALIB_DEFAULT)
+};

--- a/devicetree/qcom/pm8150-vm.dtsi
+++ b/devicetree/qcom/pm8150-vm.dtsi

@@ -18,6 +18,61 @@
                        interrupt-controller;
                        #interrupt-cells = <2>;
                };
+               pm8150_vadc: vadc@3100 {
+                       compatible = "qcom,spmi-adc5";
+                       reg = <0x3100>;
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       interrupts = <0x0 0x31 0x0 IRQ_TYPE_EDGE_RISING>;
+                       interrupt-names = "eoc-int-en-set";
+                       #io-channel-cells = <1>;
+                       io-channel-ranges;
+
+                       /* Channel node */
+                       pm8150_amux1_vol {
+                               reg = <ADC5_AMUX_THM1>;//0x0d
+                               label = "pm8150_amux1_vol";
+                               qcom,pre-scaling = <1 1>;
+                       };
+                       pm8150_amux2_vol {
+                               reg = <ADC5_AMUX_THM2>;//0x0e
+                               label = "pm8150_amux2_vol";
+                               qcom,pre-scaling = <1 1>;
+                       };
+                       pm8150_gpio2_vol {
+                               reg = <ADC5_GPIO4>;//0x15
+                               label = "pm8150_gpio2_vol";
+                               qcom,pre-scaling = <1 1>;
+                       };
+                       pm8150_gpio3_vol {
+                               reg = <ADC5_GPIO1>;//0x12
+                               label = "pm8150_gpio3_vol";
+                               qcom,pre-scaling = <1 1>;
+                       };
+               };
        };

以上代码修改后,可以出测试节点如下:

cat /sys/bus/spmi/devices/spmi0-00/1c800000.virtio-spmi:qcom,pm8150@0:vadc@3100/iio:device0/in_voltage_PMIC_GPIPO2_input
cat /sys/bus/spmi/devices/spmi0-00/1c800000.virtio-spmi:qcom,pm8150@0:vadc@3100/iio:device0/in_voltage_PMIC_GPIPO3_input
cat /sys/bus/spmi/devices/spmi0-00/1c800000.virtio-spmi:qcom,pm8150@0:vadc@3100/iio:device0/in_voltage_PMIC_THERM1_input
cat /sys/bus/spmi/devices/spmi0-00/1c800000.virtio-spmi:qcom,pm8150@0:vadc@3100/iio:device0/in_voltage_PMIC_THERM2_input

但是实测会有以下问题:

读adc节点时报错:
[  174.157064] qcom-spmi-adc5>>>adc5_read: adc read to register 0x42 of length:6 succeed, ret=0
[  174.157352] qcom-spmi-adc5>>>adc5_write: adc write to register 0x42 of length:6 failed, ret=1
[  174.157499] ADC configure failed with 1
[  174.157665] qcom-spmi-adc5>>>adc5_read: adc read to register 0x42 of length:6 succeed, ret=0
[  174.157891] qcom-spmi-adc5>>>adc5_write: adc write to register 0x42 of length:6 failed, ret=1
[  174.158080] ADC configure failed with 1
[  174.158262] qcom-spmi-adc5>>>adc5_read: adc read to register 0x42 of length:6 succeed, ret=0
[  174.158485] qcom-spmi-adc5>>>adc5_write: adc write to register 0x42 of length:6 failed, ret=1
[  174.158648] ADC configure failed with 1
[  174.158850] qcom-spmi-adc5>>>adc5_read: adc read to register 0x42 of length:6 succeed, ret=0
[  174.159099] qcom-spmi-adc5>>>adc5_write: adc write to register 0x42 of length:6 failed, ret=1
[  174.159384] ADC configure failed with 1
 

另外cat /d/gpio看到引脚状态也不符合预设配置:

gpiochip1: GPIOs 326-335, parent: platform/1c800000.virtio-spmi:qcom,pm8150@0:pinctrl@c000, 1c800000.virtio-spmi:qcom,pm8150@0:pinctrl@c000:
 gpio1 : in   low  normal  vin-0 pull-down 10uA              push-pull  high    atest-1 dtest-0
 gpio2 : ---
 gpio3 : in   low  normal  vin-0 no pull                     push-pull  high    atest-1 dtest-0
 gpio4 : in   low  normal  vin-0 pull-up 1.5uA               push-pull  high    atest-1 dtest-0
 gpio5 : ---
 gpio6 : in   low  normal  vin-0 pull-down 10uA              push-pull  high    atest-1 dtest-0
 gpio7 : ---
 gpio8 : ---
 gpio9 : out  high normal  vin-1 no pull                     push-pull  low     atest-1 dtest-0
 gpio10: in   low  normal  vin-0 pull-down 10uA              push-pull  high    atest-1 dtest-0

后续更新QNX下adc配置调试记录

### 配置QNX系统中的GCC编译器 在QNX Neutrino实时操作系统中,配置GCC编译器是个重要的步骤,尤其是在涉及嵌入式系统的开发时。以下是关于如何在QNX环境中设置和使用GCC的相关信息。 #### 安装QNX工具链 QNX SDK自带了套完整的工具链,其中包括GCC编译器。如果尚未安装SDK,则需要先下载并安装适合操作系统的版本[^1]。通常情况下,在完成安装之后,可以通过命令行访问`qcc`(这是QNX封装过的GCC),也可以直接调用标准的GNU `gcc`命令来编译C/C++源文件。 #### 设置环境变量 为了使GCC能够正常工作,必须正确地设定些必要的环境变量。这些变量包括但不限于`QNX_TARGET`、`QNX_HOST`以及路径相关的变量。通过运行以下脚本可以初始化所需的环境: ```bash source /path/to/qnx_sdpx_env.sh ``` 此脚本会自动调整PATH和其他重要参数以便于后续构建过程顺利执行。 #### 编写Makefile或项目配置文件 当准备好了基础环境后,下步就是编写用于管理项目的Makefile或者利用IDE内置的支持功能来自动生成所需的目标二进制文件。对于简单的例子来说,可以直接指定输入源码文件名给gcc/g++: ```makefile CC = qcc CFLAGS += -Vgcc_ntox86_64 # 这里选择目标平台架构选项 all: program program: main.o other_module.o $(CC) $^ -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ ``` 上述示例展示了基本的Makefile结构,并指定了特定于QNX的目标体系结构标志(-V)。 #### 使用POSIX线程与互斥锁 除了常规的应用程序之外,有时还需要处理多线程应用程序的设计。正如之前提到过的个简单案例那样,我们可以看到静态初始化mutex的方式被展示出来。然而实际应用当中可能还会涉及到动态分配资源的情况以及其他更复杂的场景下的同步机制实现[^2]。 ```cpp #include <pthread.h> #include "errors.h" typedef struct my_struct_tag { pthread_mutex_t mutex; int value; } my_struct_t; my_struct_t* create_data() { my_struct_t *data = (my_struct_t*)malloc(sizeof(my_struct_t)); if (!data) return NULL; pthread_mutex_init(&data->mutex, NULL); data->value = 0; return data; } void destroy_data(my_struct_t* data){ pthread_mutex_destroy(&data->mutex); free(data); } ``` 以上代码片段扩展了原始的例子,增加了内存管理和错误检查的部分。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值