基於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("\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背後設計的理念之後,瞭解其為不同的外設設計的適配流程,為後續開發鋪開了道路。