news 2026/6/10 13:56:09

uboot添加一个I2C设备

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
uboot添加一个I2C设备

uboot 添加一个I2C设备 ,简单的测试一下读写,都正常

先添加设备树

&i2c6{status="okay";pinctrl-names="default";pinctrl-0=<&i2c6m2_xfer>;psensor@53{compatible="pesensor_ltr578";reg=<0x53>;pinctrl-names="default";pinctrl-0=<&gpio2_b0>;ltr578_irq_pin=<&gpio2 RK_PB0 GPIO_ACTIVE_LOW>;status="okay";};};

再添加

makefile:obj-$(CONFIG_AXXF_I2CTEST)+=axxf_i2ctest.o Kconfig:config AXXF_I2CTEST bool"AXXF I2C test driver"help Enable the custom I2C test driverforAXXF.Select thisifyou want to use axxf_i2ctest driver._defconfig:CONFIG_AXXF_I2CTEST=y
#include<common.h>#include<clk.h>#include<dm.h>#include<errno.h>#include<fdtdec.h>#include<i2c.h>#include<asm/io.h>#include"axxf_i2ctest.h"#include<asm/gpio.h>structi2ctest_priv_data{structudevice*dev;structgpio_descirq_gpio;};inti2ctest_i2c_write(structi2ctest_priv_data*priv_data,u8 reg,u8 val){intret;u8 buf[2];structi2c_msgmsg;structdm_i2c_chip*chip=dev_get_parent_platdata(priv_data->dev);buf[0]=reg;buf[1]=val;msg.addr=chip->chip_addr;msg.flags=0;msg.len=2;msg.buf=buf;ret=dm_i2c_xfer(priv_data->dev,&msg,1);if(ret){printf("i2ctest i2c write failed: %d\n",ret);returnret;}return0;}inti2ctest_i2c_read(structi2ctest_priv_data*priv_data,u8 reg,u8*val){intret;u8 data;structdm_i2c_chip*chip=dev_get_parent_platdata(priv_data->dev);structi2c_msgmsg[]={{.addr=chip->chip_addr,.flags=0,.buf=(u8*)&reg,.len=1,},{.addr=chip->chip_addr,.flags=I2C_M_RD,.buf=(u8*)&data,.len=1,}};ret=dm_i2c_xfer(priv_data->dev,msg,2);if(ret){printf("i2ctest i2c read failed: %d\n",ret);returnret;}*val=data;return0;}staticintxxf_i2ctest_remove(structudevice*dev){printf("%s---------------------\r\n",__func__);return0;}staticintast_i2c_probe(structudevice*dev){intret;u8 reg;structi2ctest_priv_data*i2ctest_priv=dev_get_priv(dev);printf("%s---------------------\r\n",__func__);i2ctest_priv->dev=dev;ret=gpio_request_by_name(dev,"ltr578_irq_pin",0,&i2ctest_priv->irq_gpio,GPIOD_IS_IN);if(ret){printf("Cannot get irq_gpio GPIO: %d\n",ret);returnret;}ret=dm_gpio_get_value(&i2ctest_priv->irq_gpio);printf("dm_gpio_get_value: %d\n",ret);ret=i2ctest_i2c_read(i2ctest_priv,0x06,&reg);if(ret){printf("Cannot get priv_data : %d\n",ret);returnret;}printf("0x06 reg: %x\n",reg);ret=i2ctest_i2c_read(i2ctest_priv,0x05,&reg);if(ret){printf("Cannot get priv_data : %d\n",ret);returnret;}printf("0x05 reg: %x\n",reg);reg=0x03;ret=i2ctest_i2c_write(i2ctest_priv,0x05,reg);ret=i2ctest_i2c_read(i2ctest_priv,0x05,&reg);if(ret){printf("Cannot get priv_data : %d\n",ret);returnret;}printf("0x05 - 2 reg: %x\n",reg);return0;}staticconststructudevice_idast_i2c_ids[]={{.compatible="pesensor_ltr578"},{},};U_BOOT_DRIVER(axxf_i2ctest)={.name="axxf_i2ctest",.id=UCLASS_I2C_GENERIC,.of_match=ast_i2c_ids,.probe=ast_i2c_probe,.remove=xxf_i2ctest_remove,.priv_auto_alloc_size=sizeof(structi2ctest_priv_data),};

放到board.c board_late_init 里面调用

staticintxxf_i2ctest_func(void){structudevice*bus;intret;ret=uclass_get_device_by_driver(UCLASS_I2C_GENERIC,DM_GET_DRIVER(axxf_i2ctest),&bus);//if(ret){printf("get i2c6 bus failed\n");returnret;}printf("ltr578 device probed\n");return0;}

运行结果如下:

------------------------------------------board_late_init...------------------------------------------setup_download_mode...enter_kernel,time=1000CLK:(uboot.arm:enter1008000KHz,init1008000KHz,kernel0N/A)bpll816000KHz lpll816000KHz vpll594000KHz aupll786432KHz cpll1000000KHz gpll1188000KHz ppll1300000KHz aclk_bus_root396000KHz pclk_bus_root100000KHz hclk_bus_root198000KHz aclk_top786432KHz aclk_top_mid396000KHz pclk_top100000KHz hclk_top200000KHz I2c6 speed:100000Hz ast_i2c_probe---------------------dm_gpio_get_value:00x06reg:b10x05reg:10x05-2reg:3ltr578 device probed Net:Net Initialization Skipped No ethernet found.Hit key to stopautoboot('CTRL+C'):0=><INTERRUPT>=><INTERRUPT>
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 9:25:01

Function Call的原理

一、Function Call 到底是什么&#xff1f; 咱们先抛掉专业定义&#xff0c;用一个生活场景类比&#xff1a;你想知道 “明天北京的天气 推荐适合的穿搭”&#xff0c;但自己不会查天气数据。这时你会&#xff1a;告诉助理 “我要明天北京天气和穿搭建议”&#xff08;提出需求…

作者头像 李华
网站建设 2026/6/10 9:28:41

Windows安装Docker并拉取TensorFlow镜像的完整步骤(清华源版)

Windows 安装 Docker 并拉取 TensorFlow 镜像&#xff08;清华源加速实战&#xff09; 在深度学习项目开发中&#xff0c;最让人头疼的往往不是模型设计本身&#xff0c;而是环境配置——尤其是当团队成员各自“在我机器上能跑”时。TensorFlow 的依赖复杂&#xff0c;涉及 Py…

作者头像 李华
网站建设 2026/6/9 23:35:18

Release 屏障与 Acquire 屏障

最小概念了解&#xff1a;一对“发布&#xff08;publish&#xff09;/订阅&#xff08;consume&#xff09;”规则Release&#xff08;释放 / 发布&#xff09;是什么发生在 写端。语义&#xff1a;Release 之前的所有普通读写&#xff0c;在“对外可见的顺序”上&#xff0c;…

作者头像 李华
网站建设 2026/6/9 19:59:31

Diskinfo下载官网数据监测TensorRT运行时磁盘IO

Diskinfo下载官网数据监测TensorRT运行时磁盘IO 在现代AI系统部署中&#xff0c;一个常被忽视的事实是&#xff1a;模型跑得快&#xff0c;不一定服务响应就快。我们见过太多案例——GPU利用率不到30%&#xff0c;推理延迟却高达数秒。问题出在哪&#xff1f;答案往往藏在“看不…

作者头像 李华
网站建设 2026/6/10 2:16:17

ZigBee:低功耗物联的“网状神经”——成都泽耀

一、什么是ZigBee&#xff1f; ZigBee&#xff0c;也称紫蜂&#xff0c;是一种低速、低功耗、低成本的无线网络协议&#xff0c;其底层基于IEEE 802.15.4标准&#xff0c;专为低数据速率、长时间运行的无线传感与控制网络而设计。它支持大规模节点组网与多种网络拓扑&#xff0…

作者头像 李华
网站建设 2026/6/10 12:31:26

Excalidraw入驻DooTask,开启手绘协作新时代

Excalidraw入驻DooTask&#xff0c;开启手绘协作新时代 当团队会议中的“我意思是……”变成反复澄清的循环&#xff0c;当产品需求在层层转述中逐渐失真——我们不得不承认&#xff1a;纯文本和线性流程&#xff0c;正在扼杀协作的原始生命力。就在这个节点&#xff0c;DooTas…

作者头像 李华