吐一下:论坛发帖子有点麻烦,只好采取边发边修改,这样好多了。
软件离不开硬件,软件是硬件的灵魂。小e的功能已经体验过了,烧录的方法也掌握了,是时候该探索小e的核心-固件了,而固件是由源码编译而成。
一:资源(已经下载好了):
官方固件源码:M302I-ESP8266-ROMsource.zip
官方固件:M302I-ESP8266-ROM.zip
1.先解压官方固件
这4个BIN文件小e出厂的时候已经烧录好了。在体验下载的时候已经认识了,但只生成了用户代码。
2.解压官方固件源码
二:源码目录结构
在源码中一共有11个文件。
1.首先看最下面三个文件。
1)README.md
使用过github一定熟悉,是个文档,打开https://github.com/espressif/ESP8266_RTOS_SDK就清楚了。从这也可以看出,小e源码的来龙去脉了。
2)Makefile
linux编程里的一个重要文件。
3)LICENSE
授权文件,在软件中常见到这个文件。
这三个文件都可以使用写字板打开,也可以在github上直接查看。
2. 其次,剩下的文件夹看名字,就能了解个八九不离十了。
. third_party 第三方软件源文件
1)bin
里面有三个文件和固件的一样,固件的另一个在哪,打开upgrade文件夹时空的,其实编译完后共享文件里的upgrade中会出现3个文件。
至于_temp_by_dltool文件,打开后,两个文件名和固件里的bin只是后缀不一样,肯定有关系了。
2)et_app 这里面才是学习的重点。
.Outptut :使用ARM keil工具时候要设置编译、调试输出信息文件。这里的output应该也是这个用途。
不过编译前后对比了一下,貌似没有什么变化。
.driver: 外部设备驱动及相关源文件,里面的函数可以在主程序中调用,l来实现需要的功能。
. Include:driver的头文件和user使用的一些头文件。
.sample_lib:readme.txt里面说明了是简单的工程模板。对我们没什么用处。
.user:用户代码,以后如果添加什么功能,就要在这里实现了。
剩下的文件,在编译工程的时候执行”./gen_misc.sh”。
看着这么多源码,用什么软件打开呢,用惯了Keil、IAR等集成开发环境。到这懵了,群里说使用Source Insight 3。可不熟悉啊,只好硬着头皮使用写字板打开user_main.c 。找到了程序入口。
里面最开始的2条打印语句好熟悉啊,在开发板上电的时候,串口输出的信息。
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void user_init(void)
{
key_gpio_t key;
struct station_config config;
struct ip_info info;
et_uchar result=0;
os_printf("now SDK version:%s\n", system_get_sdk_version());
if(get_fac_norm_mode(&result) != SPI_FLASH_RESULT_OK)
{
os_printf("get_fac_norm_mode error, NORMAL mode\n");
}
if(result == FAC_MODE)
{
os_printf("run in factory mode\n");
uart_init_new_uart1(BIT_RATE_115200);
UART_SetPrintPort(UART1);
uart_init_new(BIT_RATE_9600, result);
return;
}
os_printf("run in normal mode\n");
// show logo
user_show_logo();
if (RETURN_OK != user_get_work_mode(&work_mode))
{
os_printf("get work mode fail !!!\n");
return;
}
if (RETURN_OK != user_init_work_mode(work_mode, result))
{
os_printf("init work mode fail !!!\n");
return;
}
// wifi led control
xTaskCreate(user_wifi_led_control, "wifi_led_control", 256, NULL, 2, NULL);
//wifi event handle
wifi_set_event_handler_cb(et_wifi_event_cb);
memset(&key, 0, sizeof(key_gpio_t));
key.key_gpio_pin = AIRKISS_KEY_IO_PIN;
key.key_num = AIRKISS_KEY_IO_NUM;
airkiss_key_init(&key);
wifi_set_opmode(STATION_MODE);
wifi_reconnect_start_flag = 0;
xTaskCreate(airkiss_key_poll_task, "smartconfig_task", 256, NULL, 2, NULL);
memset(&config, 0, sizeof(struct station_config));
if(wifi_station_get_config_default(&config) == true)
{
os_printf("ssid=%s\n", config.ssid);
wifi_station_set_config_current(&config);
//for static ip set
/*wifi_station_dhcpc_stop();
IP4_ADDR(&info.ip, 192, 168, 1, 43);
IP4_ADDR(&info.gw, 192, 168, 1, 1);
IP4_ADDR(&info.netmask, 255, 255, 255, 0);
wifi_set_ip_info(STATION_IF, &info);*/
}
os_timer_disarm(&test_timer);
os_timer_setfn(&test_timer, (os_timer_func_t *)user_esp_platform_check_ip, NULL);
os_timer_arm(&test_timer, 1000, 0);
}