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*)®,.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,®);if(ret){printf("Cannot get priv_data : %d\n",ret);returnret;}printf("0x06 reg: %x\n",reg);ret=i2ctest_i2c_read(i2ctest_priv,0x05,®);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,®);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>