• 基于RT1052 Aworks 支持EEPROM访问(三)


    本文主要是通过迁移的思维,记录本人初次使用周立功的Aworks框架进行BSP开发

    在前几次的开发过程中,向FAE问了很多的问题,主要之前只获得比较少的资料 ,及对Awork缺少一个深入及系统性的认识,可以通过面向AWorks框架和接口的C编程(上).pdf 进行学习。
    在Aworks框架之下,对于外设一般会有对应一个.h文件。在其内部的AWbus-lite总线上,其实就是驱动与设备资源的匹配过程。其Aworks框架支持通过aw_nvram_set、aw_nvram_get接口进行访问,接下来我们来看一下在Awork下需要做何修改以支持EEPROM访问。

    1. 首先阅读原理图

    标准设计,一组I2C总线,及写保护引脚。通过原理图只确认其i2c地址,及设备挂载在哪条总线上。

    2. 使能EEPROM

    2.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  256
    void 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("
    vram_test write error
    ");
    		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("
    vram_test read error
    ");
    		return;
       }
    
       if (strncmp((char *)buf, (char *)test_buf, AT24C02_EEPROM_SIZE) != 0){
    		aw_kprintf("
    vram_test cmp error
    ");
    		return;
       }
       
       aw_kprintf("
    vram_test PASS
    ");
    }
    

    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背后设计的理念之后,了解其为不同的外设设计的适配流程,为后续开发铺开了道路。

  • 相关阅读:
    docker for windows 中挂载文件到容器
    docker for windows 中 镜像 microsoft/donet 的文件结构
    window7下docker toolbox 启用数据卷报错: Error response from daemon: invalid mode:
    无法创建虚拟目录
    docker 内时区和宿主机差8个小时,怎么办?
    多线程之同时更改数据问题--启用lock
    Linux shell Bash的基本功能1
    Linux shell 脚本执行方式
    Linux vim编辑器使用技巧
    Linux vim编辑器命令
  • 原文地址:https://www.cnblogs.com/lianghong881018/p/15169433.html
Copyright © 2020-2023  润新知