前言:
目前姐妹们对“周立功 ifconfig看不到can口”可能比较关切,我们都需要了解一些“周立功 ifconfig看不到can口”的相关文章。那么小编同时在网络上汇集了一些对于“周立功 ifconfig看不到can口””的相关知识,希望姐妹们能喜欢,你们快快来了解一下吧!本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发
在前几次的开发过程中,向FAE问了很多的问题,主要之前只获得比较少的资料 ,及对Awork缺少一个深入及系统性的认识,可以通过面向AWorks框架和接口的C编程(上).pdf 进行学习。
在Aworks框架之下,对于外设一般会有对应一个.h文件。在其内部的AWbus-lite总线上,其实就是驱动与设备资源的匹配过程。其Aworks框架支持通过aw_nvram_set、aw_nvram_get接口进行访问,接下来我们来看一下在Awork下需要做何修改以支持EEPROM访问。
1. 首先阅读原理图
标准设计,一组I2C总线及写保护引脚。通过原理图只确认其i2c地址,及设备挂载在哪条总线上。
2. 使能EEPROM2.1 首先注册资源
增加一个awbl_hwconf_eeprom_at24c02.h文件,该文件定义其相关的资源,i2c地址,所在I2C总线编号,驱动名称,我们可以理解成Linux下的dts文件。内部还对EEPROM进行分区,我们还定义了一个宏 AWBL_HWCONF_EEPROM_AT24C02,后续会用到。
/******************************************************************************* EEPROM AT24C02 ÅäÖÃÐÅÏ¢*******************************************************************************/#ifndef __AWBL_HWCONF_EEPROM_AT24C02_H#define __AWBL_HWCONF_EEPROM_AT24C02_H#ifdef AW_DRV_EEPROM_AT24C02#include "driver/nvram/awbl_ep24cxx.h"aw_local aw_const struct awbl_nvram_segment __g_ep24cxx_seglst[] = { {"at24c02", 0, 0, 256}, };aw_local aw_const struct awbl_ep24cxx_devinfo __g_ep24cxx_devinfo = { 0x50, AWBL_EP24CXX_EP24C02, &__g_ep24cxx_seglst[0], AW_NELEMENTS(__g_ep24cxx_seglst) };aw_local struct awbl_ep24cxx_dev __g_ep24cxx_dev;#define AWBL_HWCONF_EEPROM_AT24C02 \ { \ AWBL_EP24CXX_NAME, \ 0, \ AWBL_BUSID_I2C, \ IMX1050_LPI2C1_BUSID, \ (struct awbl_dev *)&__g_ep24cxx_dev, \ &__g_ep24cxx_devinfo \ }, #else#define AWBL_HWCONF_EEPROM_AT24C02#endif /*AW_DRV_EEPROM_AT24C02*/#endif /*_AWBL_HWCONF_EEPROM_AT24C02_H*/
将AWBL_HWCONF_EEPROM_AT24C02该宏会注册到其硬件设备列表当中g_awbl_devhcf_list。有了设备资源之后,我们需要注册设备驱动。
Index: awbus_lite_hwconf_usrcfg.c===================================================================--- awbus_lite_hwconf_usrcfg.c (revision 1)+++ awbus_lite_hwconf_usrcfg.c (revision 49)@@ -332,6 +337,9 @@ /* timestamp */ AWBL_HWCONF_IMX1050_TIMESTAMP+ + /* Eeprom AT24C02*/+ AWBL_HWCONF_EEPROM_AT24C02 };2.2 注册设备驱动
在Aworks框架下,其驱动的注册在 aw_prj_config.c 如下所示
Index: aw_prj_config.c===================================================================--- aw_prj_config.c (revision 1)+++ aw_prj_config.c (revision 49)@@ -25,6 +25,7 @@ #include "driver/sensor/awbl_hts221.h" #include "driver/sensor/awbl_shtc1.h" #include "driver/sensor/awbl_lis3mdl.h"+#include "driver/nvram/awbl_ep24cxx.h" /* including c source files */ #include "all/aworks_startup.c"@@ -395,6 +396,11 @@ extern void awbl_imx1050_timestamp_drv_register(void); awbl_imx1050_timestamp_drv_register(); #endif++#ifdef AW_DRV_EEPROM_AT24C02+ extern void awbl_ep24cxx_drv_register();+ awbl_ep24cxx_drv_register();+#endif } void aw_prj_early_init (void)
至此我们预留了注册EEPROM的宏开关AW_DRV_EEPROM_AT24C02。
2.3 设备宏开关
在前面描写使能看门狗的文章当中,我们定义了AW_DEV_IMX1050_WDT1就可以使用CPU内置的看门狗,就是因为定义了该宏之后,其设备资源不再为空,其相关驱动也会被编译。此时我们只需要使能
AW_DRV_EEPROM_AT24C02即可
Index: aw_prj_params.h===================================================================--- aw_prj_params.h (revision 1)+++ aw_prj_params.h (revision 49)+#define AW_DRV_EEPROM_AT24C02
需要注意的是EEPROM是挂载在I2C BUS1下面的,所以做如下修改
Index: aw_prj_param_auto_cfg.h===================================================================--- aw_prj_param_auto_cfg.h (revision 1)+++ aw_prj_param_auto_cfg.h (revision 49)@@ -144,6 +144,18 @@ /** @} */ /**+ * name AT24C02设备+ */+#if defined AW_DEV_AT24C02 || \+ defined AW_DRV_EEPROM_AT24C02+ +#ifndef AW_DEV_IMX1050_LPI2C1+#define AW_DEV_IMX1050_LPI2C1+#endif++#endif++/**3. 如何测试
如下为基于aw_nvram接口对EEPROM进行读写的测试样例。
#define AT24C02_EEPROM_SIZE 256void nvram_test(){ unsigned char buf[AT24C02_EEPROM_SIZE] ={0}; unsigned char test_buf[AT24C02_EEPROM_SIZE] ={0}; //int size = AT24C02_EEPROM_SIZE; int i, result; for(i=0; i < AT24C02_EEPROM_SIZE; i++){ buf[i] = i; } // write all chip eeprom context aw_led_off(0); result = aw_nvram_set("at24c02", 0, (char *)&buf[0], 0, AT24C02_EEPROM_SIZE); if (result != AW_OK ){ aw_led_on(0); aw_kprintf("\r\nvram_test write error\r\n"); return; } // read all chip eeprom context result = aw_nvram_get("at24c02", 0, (char *)&test_buf[0], 0, AT24C02_EEPROM_SIZE); if (result != AW_OK ){ aw_kprintf("\r\nvram_test read error\r\n"); return; } if (strncmp((char *)buf, (char *)test_buf, AT24C02_EEPROM_SIZE) != 0){ aw_kprintf("\r\nvram_test cmp error\r\n"); return; } aw_kprintf("\r\nvram_test PASS\r\n");}4. 总结
第一:在这个注册的过程当中还有一个函数未提有说明awbl_ep24cxx_drv_register,该函数在awbl_ep24cxx.c。其实SDK自带的文件,我们可以理解成为linux内核当中drivers/misc/eeprom/at24.c文件,我们前面所有的工作都只是一个适配的过程而已,有点像linux下增加dts配置及通过make menuconfig 选中相关驱动的过程。
第二:我们在初始化struct awbl_ee24cxx_devinfo 结构体时,使用AWBL_EP24CXX_EP24C02,该宏也是Aworks封装好的,用于指定特定的EEPROM型号。至此我们对Awork的了解更进一步了。唯一需要深入学习的就是写一个自已的驱动,基于AWbus-lite.
aw_local aw_const struct awbl_ep24cxx_devinfo __g_ep24cxx_devinfo = { 0x50, AWBL_EP24CXX_EP24C02, &__g_ep24cxx_seglst[0], AW_NELEMENTS(__g_ep24cxx_seglst) };
第三:经过此次初探Aworks背后设计的理念之后,了解其为不同的外设设计的适配流程,为后续开发铺开了道路。
标签: #周立功 ifconfig看不到can口