基于HI3516/HI3518/HI3559内部ADC驱动实现

基于HI3516/HI3518/HI3559内部ADC驱动实现 么得钱钱 2023-12-29 15:07:00 157

前言

最近实际开发中需要实现海思SOC内部自带的一个ADC的驱动,但海思SDK中并未提供相应的软件驱动支持,故需要自己去实现,整体流程也比较简单,不过对于第一次接触海思开发的人来说有一点困难

一、相关资料

(1)开发板配套的海思官方SDK:Hi3516CV500R001C02SPC021.rar,将其解压开来
(2)SOC引脚信息表:00.hardware\chip\Hi3516DV300\Hi3516DV300_PINOUT_CN.xlsx
(3)SOC开发手册:00.hardware\chip\Hi3516DV300\Hi3516DV300专业型Smart IP Camera SoC用户指南.pdf
海思SOC中外设模块的相关寄存器配置在(3)数据手册中可以找到,但是关于GPIO引脚的配置
寄存器一部分在(2)中的excel表格,一部分在(3)中的数据手册

二、实现原理及步骤

1.原理

参考:Hi3516DV300专业型Smart IP Camera SoC用户指南.pdf 12.9章节

LSADC(Low Speed ADC)实现对外部模拟信号转换成一定比例的数字值,从而实现对模拟信号的测量,可应用于电量检测,按键检测等。芯片提供 1 个LSADC, 2 个独立通道;

  • LSADC 具有以下特点:
  • 电源电压 3.3V/1.8V;
  • 扫描频率不能高于 200K/s;
  • 10bit 采样精度, 2 个独立通道;
  • 支持单次扫描和连续扫描模式;
  • 扫描完成自动上报中断。
2.步骤

(1)单次扫描处理流程
在单次读取模式(LSADC_CTRL0 [model_sel]=0), CPU 配置扫描通道号(仅且只能配置一个通道)、扫描模式、键值映射表信息,启动 LSADC 完成一次通道扫描。通道扫描完成后,通过中断通知系统扫描完成, CPU 可以获取转换结果。

(2)连续扫描处理流程
在连续读取模式(LSADC_CTRL0 [model_sel]=1), CPU 根据应用场景设置连续扫描的时间间隔 Tscan、毛刺宽度(Tglitch)、有效通道号(ch_vld),启动 LSADC。
LSADC 在一个时间间隔 Tscan 内完成一个有效通道(配置 LSADC_CTRL0 通道是否有效指示位为有效) 的扫描。在下一个扫描时刻到来时,启动对下一个有效通道的扫描。待完成对所有有效通道的扫描后,启动下一轮对有效通道的扫描, 各通道的轮询如图 12-58 所示。
以使能通道 0、 1 为例, 连续扫描模式下通道轮询扫描示意图如图 12-58 所示。

(3)细节设置

1、滤毛刺流程
滤毛刺电路采用多数判决算法。在滤毛刺窗口 Tglitch 中,如果出现多数次的 ADC 采样值 value,且 value 不为空按键时 ADC 采样值,则认为 value 为一次有效的按键值,否则认为是一个毛刺信号。
在单次读取模式,不进行滤毛刺操作。
在连续扫描模式下,使能虑毛刺功能,需要设置合适的虑毛刺时间窗口 Tglitch。
请参考 LSADC_CTRL1 寄存器的描述。
2、采样精度设置
通过 LSADC_CTRL9 [9:0]可以设置采样精度,可以根据应用需要设置对应的采样精度。
当采样精度设置成 10bit 时,采样结果 10bit 全部有效。
当采样精度设置小于 10bit 时,对应的采样结果高位有效,例如:当采样精度设置成 8bit 时,采样结果的高 8bit 才有效。

注意:当你读取 存储ADC转换结果的寄存器 LSADC_CTRL11的0-9位的值时,不论你设置的精度是什么,每次读出的值都是一样的,需要通过软件的方法进行处理,得到不同精度的结果,详情如上(2、采样精度设置 )所述。

三、代码实现

1、使用通道0/1,以连续扫描的方式进行工作。

2、根据(二、实现原理及步骤)中的流程图进行开发;

3、需要进行LSADC相关寄存器的配置,这两个ADC通道(0/1)对应的GPIO引脚进行配置(ADC模式),开启LSADC时钟配置(这个是最关键的,否则其他都配置正确,ADC也无法工作),此外需找到ADC对应的中断源。

4、软件实现

注意:对于所使用的中断源不可以直接传入中断号给request_irq函数进行申请,在使用了
设备树机制的新版本的内核中,内部会通过传入的物理中断号分配一个虚拟中断号,如
果直接传入数据手册中找到的物理中断号是无法工作的,需通过platform_get_irq获取。

adc_irq = platform_get_irq(dev, 0);
if (0 > adc_irq)
{
    ERROR("platform get irq failed !");
    goto ERR_2;
}
ret = request_threaded_irq(adc_irq, NULL, adc_irq_handler, IRQF_TRIGGER_HIGH | IRQF_ONESHOT, "hisi_adc", NULL);
if (ret)
{
    ERROR("request threaded irq failed !");
    goto ERR_2;
}
对于驱动硬件信息大家可以使用设备树传入获取,也可自己实现一个platform device,注册到内核,我这里使用了设备树,需要修改内核源码中的设备树文件,添加ADC节点

    hisi_adc {
        compatible = "hisi_adc";
        interrupt-parent = <&gic>;
        interrupts = <0 65 4>;
    };

65 + 32 = 97(开发手册中找到的物理中断号),对于设备树关于中断的描述相关知识大家,自行了解,我就不多说了。

该ADC驱动已有开源代码,我把链接提供给大家,大家可在这个基础上进行二次开发,实现自己的功能,我也是基于这个进行开发的(经过验证可用):

https://github.com/Tvirus/hisi_adc_driver

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 1 1 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
么得钱钱
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区