news 2026/7/7 8:13:30

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/7/5 17:29:37

WSLg-Ubuntu-Desktop

文章目录极简说明详细说明极简说明 模式&#xff1a;Wslg gnome-shell wayland 该方式采用gnome-shell来嵌入式显示桌面内容&#xff0c;gnome-shell又将通过WSLg&#xff08;Windows扩展的显示组件&#xff09;&#xff0c;在Windows系统内弹出一个窗口来操作gnome-shell。 …

作者头像 李华
网站建设 2026/7/8 0:16:50

鸿蒙开发-如何将C++侧接收的PixelMap转换成cv::mat格式

目录1. 解决措施2. 示例代码3. 将arraybuffer转换成cv::mat4. 使用OH_PixelMap_AccessPixels获取PixelMap的内存地址&#xff0c;将这个内存地址中的数据转换为cv::mat的1. 解决措施 将PixelMap转换成cv::mat有两种方法&#xff1a; 将PixelMap的arraybuffer转换成cv::mat。使…

作者头像 李华
网站建设 2026/7/1 15:58:19

四天学会一本书的厦门服务机构是哪家

四天学会一本书&#xff1a;厦门诺辰教育如何助力高效学习在快节奏的现代生活中&#xff0c;高效学习已成为许多人追求的目标。尤其是在知识更新迅速的时代&#xff0c;如何在短时间内掌握一本书的核心内容变得尤为重要。厦门诺辰教育作为一家专注于高效学习方法培训的服务机构…

作者头像 李华
网站建设 2026/7/3 11:11:40

AI在HR数字化中的应用:简历筛选与人才匹配的技术实现

摘要&#xff1a;在HR数字化转型进程中&#xff0c;简历筛选与人才匹配是招聘全流程的核心痛点。传统人工筛选模式效率低下、主观性强&#xff0c;难以适应大规模招聘需求。AI技术的融入为该场景提供了高效解决方案&#xff0c;通过OCR识别、自然语言处理&#xff08;NLP&#…

作者头像 李华
网站建设 2026/7/7 4:36:51

anything-llm Docker本地部署与源码问答指南

anything-llm Docker本地部署与源码问答指南 在现代软件开发中&#xff0c;面对动辄数百万行的代码库&#xff0c;如何快速理解系统架构、定位关键逻辑、掌握模块交互&#xff0c;已成为开发者日常效率的核心瓶颈。尤其像 Android AOSP、Linux 内核这类大型项目&#xff0c;仅…

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

LobeChat Docker镜像使用技巧:环境变量配置大全

LobeChat Docker镜像使用技巧&#xff1a;环境变量配置大全 在构建现代 AI 聊天应用的实践中&#xff0c;一个常见痛点是&#xff1a;如何快速、安全地将前端界面与后端大模型服务对接&#xff0c;同时兼顾部署灵活性和访问控制&#xff1f;开源项目 LobeChat 正是为解决这一问…

作者头像 李华