• 全志V853开发板开发进阶——GPADC


    以下内容转自全志在线V853在线文档:https://v853.docs.aw-ol.com/soft/dev_gpadc/

    GPADC

    GPADC(General Purpose Analog to Digital Converter)是指高精度数模转换模块,拥有12bit分辨率,8位采集精度。模拟输入范围0~1.8V,最高采样率1MHz。

    V853 GPADC驱动路径:

    tina/lichee/linux-4.9/drivers/input/sensor/sunxi_gpadc.c
    tina/lichee/linux-4.9/drivers/input/sensor/sunxi_gpadc.h
    
    • 1
    • 2

    GPADC硬件介绍

    GPADC在线文档:GPADV 853–DOC
    在这里插入图片描述

    AVCC 为 1.8V 电源供电,通过一个电阻串联到GPADC的按键组。按键通过不同阻值的电阻相连接,按下不同的按键,GPADC0 口的电压不同,CPU 通过对这个电压的采样来决定具体是哪一个按键被按下。上图按键与电压的对应关系如下表所示:

    0.21V0.41V0.59V0.75V0.88V
    VOL+VOL-MENUENTERHOME

    当按键按下时,会触发 GPADC 模块的中断,CPU 会采集 GPADC 的数据,采集到的数据转换成相应的键值之后通过 input 子系统上传到 /dev/input/event节点,程序便可以从相应的节点获取数据。

    GPADC软件介绍

    设备树配置

    GPADC 的设备树配置分为两个部分:

    第一部分包括基础的寄存器配置、设备驱动绑定配置和时钟中断配置。这一部分的配置位于 kernel/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi 文件内。这一部分通常不需要修改。

    gpadc:gpadc@2009000 {
    	compatible = "allwinner,sunxi-gpadc";         // 用于驱动和设备的绑定
    	reg = <0x0 0x02009000 0x0 0x400>;             // 设备使用的寄存器地址
    	interrupts = ;      // 设备使用的中断
    	clocks = <&clk_gpadc>;                        // 设备使用的时钟
    	status = "disabled";                          // 配置默认不启用GPADC
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第二部分包括采样相关的配置,键值,电压数据等等,在 device/config/chips/v853/configs/vision/board.dts 文件内

    &gpadc {
    	channel_num = <1>;                        // 使用1通道
    	channel_select = <0x01>;                  // 选择 0x01 通道
    	channel_data_select = <0>;                // 启用数据通道
    	channel_compare_select = <0x01>;          // 启用通道比较功能
    	channel_cld_select = <0x01>;              // 启用数据小于比较功能
    	channel_chd_select = <0>;                 // 启用数据大于比较功能
    	channel0_compare_lowdata = <1700000>;     // 小于这个值触发中断
    	channel0_compare_higdata = <1200000>;     // 大于这个值触发中断
    	channel1_compare_lowdata = <460000>;      // 小于这个值触发中断
    	channel1_compare_higdata = <1200000>;     // 大于这个值触发中断
    	key_cnt = <5>;                            // 按键数量
    	key0_vol = <210>;                         // 按键电压,单位mv
    	key0_val = <115>;                         // 按下按键的键值
    	key1_vol = <410>;                         // 按键电压,单位mv
    	key1_val = <114>;                         // 按下按键的键值
    	key2_vol = <590>;                         // 按键电压,单位mv
    	key2_val = <139>;                         // 按下按键的键值
    	key3_vol = <750>;                         // 按键电压,单位mv
    	key3_val = <28>;                          // 按下按键的键值
    	key4_vol = <880>;                         // 按键电压,单位mv
    	key4_val = <102>;                         // 按下按键的键值
    	status = "okay";                          // 启用GPADC
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    内核驱动配置

    内核驱动配置参考:kernel by allwienner V853

    make kernel_menuconfig 进入内核配置界面,找到Device Drivers,进入。

    在这里插入图片描述

    找到 Input device support ,进入。

    在这里插入图片描述

    找到 Sensors 空格勾选并进入。

    在这里插入图片描述

    空格选中 <*> SUNXI GPADC ,保存并退出配置页面。

    在这里插入图片描述

    之后编译内核,打包烧录即可

    测试 GPADC

    make menuconfig 进入 openWrt 配置页面,找到 getevent 软件包。

    Utilities  --->
    	<*> getevent.................................... getevent for Android Toolbox
    
    • 1
    • 2

    之后编译打包烧录到开发板上,运行 getevent,可以看到sunxi-gpadc

    在这里插入图片描述

    此时按下按键,可以看到按键键值显示出来了

    在这里插入图片描述

    编写一个程序

    程序源码:source code

    测试完成设备正常使用后,可以尝试编写一个程序测试GPADC。

    以下demo程序用来读取 GPADC 模块用于 KEY 的按键上报事件,其循环10次读取按键上报事件输入,并且显示出相应按键的值。

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define DEV_PATH "/dev/input/event3"   //查看上节sunxi-gpadc的event号,是event3
    static int gpadc_fd = 0;
    
    unsigned int test_gpadc(const char * event_file)
    {
    	int code = 0, i;
    
    	struct input_event data;
    
    	gpadc_fd = open(DEV_PATH, O_RDONLY);
    
    	if(gpadc_fd <= 0)
    	{
    		printf("open %s error!\n", DEV_PATH);
    		return -1;
    	}
    
    	for(i = 0; i < 10; i++) //读10次
    	{
    		read(gpadc_fd, &data, sizeof(data));
    		if(data.value == 1)
    		{
    			printf("key %d pressed\n", data.code);
    		}
    		else if(data.value == 0)
    		{
    			printf("key %d releaseed\n", data.code);
    		}
    	}
    	close(gpadc_fd);
    	return 0;
    }
    
    int main(int argc,const char *argv[])
    {
        int rang_low = 0, rang_high = 0;
    	return test_gpadc(DEV_PATH);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    编译后将demo adb push到开发板中,执行demo并按下对应按键,将会有响应的按键反馈输出:

    在这里插入图片描述
    原文链接:https://bbs.aw-ol.com/topic/1774/

  • 相关阅读:
    linux学习总结
    RHCSA认证考试---4.创建用户
    如何轻松部署快解析 + WAMP
    kafkaStream实时流式计算
    c# 图书管理系统
    aix操作系统管子san存储卷
    【算法|贪心算法系列No.2】leetcode2208. 将数组和减半的最少操作次数
    view事件传递汇总
    【Java实战】工作中如何规范控制语句
    SQL表的创建
  • 原文地址:https://blog.csdn.net/weixin_43094346/article/details/126579641