本文章基於 WhyCan Forum(哇酷開發者社群)
https://whycan.com/t_4149.html
https://whycan.com/t_5870.html
整理而成。為了尊重原作者和其他貢獻者,所以該篇涉及到的部分程式碼和資料只提供原貼資源連結。
前言
前幾次我們一起完成了那個小小開發板的設計,並且成功執行自己移植的Linux系統,但是,那個小板並沒有什麼用,接下來這幾篇我們一起來做點有意思的事情吧。
首先改變一下電路設計,隨著小板的完成,我需要新增各種功能,但是因為每種功能設計的時候都心裡沒底,需要做專門的驗證板來進行實驗,那我就不得不將soc以及電源相關的容阻器件進行重新焊接,不但費時費力,還容易造成相關元件損壞(別問我怎麼知道的)。所以這裡依然借(bai)鑑(piao)大佬們的思路,分為核心板和底板兩部分。
核心板主要承載soc以及核心供電相關的一些元件,通過M.2介面引出除了TV部分codec之外的大部分引腳,原理圖如下:
核心板的pcb使用4層設計,尺寸大概是2.2mm*4mm,效果圖如下:
為啥起名叫SnailCard的呢,因為這個板子用的核心確實很慢就像蝸牛一樣,還因為我們家那個小祖宗喜歡蝸牛^_^
底板的原理圖如下
底板使用兩層設計,我們看到底板的資源十分豐富,除了本篇講的ESP-12F(esp8266的模組)無線網路卡,還有TFT螢幕、使用FE8.1擴充套件的usb介面、音訊介面等,後續的文章會以此進行說明,另外供電與串列埠部分改為了Type-C 口,與時俱進嘛。
效果如如下:
需要注意的是,ESP12-F的鐵皮外殼和裡面的Flash晶片我們到時候會去掉,這裡的WIFI天線部分處理並不符合要求,所以訊號會有影響。
實物如下:
核心板、底板硬體資料下載:
https://files.cnblogs.com/files/twzy/SnailCard%E7%A1%AC%E4%BB%B6.zip
需要注意一下:
1. 核心板中各兩個json檔案分別對應原理圖和pcb圖,底板因為原來的PCB圖改動過,所以只給出了原理圖;
2. zip檔案為最終生成的Gerber檔案,該檔案可以直接提供給廠家生產pcb;
3. 核心板打樣一定選擇厚度為0.8mm
測試映象檔案:
連結:https://pan.baidu.com/s/1qTTgBndBvmssCdeqXHI3Pg
提取碼:fw52
現在嘉立創、捷配等一系列PCB廠商都開啟了免費打樣並且包郵的活動,所以還在等什麼。
1. 硬體設計
1.1 接線表
F1C200S | ESP8266Ex | ESP-12F |
---|---|---|
SPI-MOSI | SDIO_CMD(GPIO 11) | ESP_CS |
SPI-MISO | SDIO_DATA_0(GPIO 7) | ESP_MISO |
SPI-CS | SDIO_DATA_3(GPIO 10) | ESP_GPIO10 |
WIFI_INT(PE8) | SDIO_DATA_1(GPIO 8) | ESP_MOSI |
SPI-CLK | SDIO_CLK(GPIO 6) | ESP_CLK |
WIFI_RESET(PE7) | CHOP_PU | ESP_EN(RST) |
1. 如果是用是Exp8266晶片,請參考第一列和第二列,使用ESP-12F模組請參考第一列和第三例
2. 如果使用ESP-12F模組,請務必去掉模組中的Flash晶片
1.2 電位
該圖來源於驅動參考文件,另外不同於nodeMCU模組,這裡的GPIO15 需要拉高,GPIO2需要拉低
1.3 個人接線圖
F1c100s/F1c200s 引腳圖(注意此圖中元件為自制的核心板,所以引腳標號與原始標號不一致,使用對應元件名稱即可。)
SOC引腳
核心板引腳
使用SPI0作為通訊介面
使用PE7引腳作為復位引腳
使用PE8引腳作為中斷引腳
ESP12-F引腳
這裡使用ESP-12F 重置使用使能引腳(EN)來控制(官網推薦)。
這是其中某次的成品圖(後來這部分無論核心板還底板都有過調整,但是軟體部分都是一樣的)
2. 驅動配置
esp8089-spi的驅動程式碼地址
https://github.com/notabucketofspam/ESP8089-SPI/
如果無法現在可以通過這個網址下載:
https://whycan.cn/files/members/3907/ESP8089-SPI_20200509.7z
【注意:這部分程式碼是編譯成獨立的驅動檔案,手動載入才能執行,如果想直接整合在核心可以直接下載 3節的程式碼】
專案說明文件中說,可以使用ESP8266或者ESP8089都是可以的。只不過ESP8266需要把SPI flash拆掉。
2.1 編譯配置
接下來修改驅動專案的KBUILD
,指向 Linux-5.7.1核心原始碼目錄。
2.2 處理核心不支援警告
使用
make ARCH=arm CROSS_COMPILE=arm-linux-
編譯驅動時候出現這個警告需要處理一下命令進行編譯,得來如下結果:
#make ARCH=arm CROSS_COMPILE=arm-linux- *** WARNING: This kernel lacks wireless extensions. Wireless drivers will not work properly. make -C /home/twzy/linuxCard/kernel/linux-5.7.1/ M=/home/twzy/linuxCard/Driver/ESP8089-SPI make[1]: 進入目錄“/home/twzy/linuxCard/kernel/linux-5.7.1” CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/spi_sif_esp.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_main.o In file included from ./include/linux/mm_types.h:12:0, from ./include/linux/mmzone.h:21, from ./include/linux/gfp.h:6, from ./include/linux/slab.h:15, from ./include/linux/crypto.h:19, from ./include/crypto/hash.h:11, from ./include/linux/uio.h:10, from ./include/linux/socket.h:8, from ./include/linux/compat.h:15, from ./include/linux/ethtool.h:17, from ./include/linux/netdevice.h:37, from /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_main.c:17: /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_main.c: 在函式‘esp_pub_init_all’中: ./include/linux/completion.h:54:2: 警告: ISO C90 不允許混合使用宣告和程式碼 [-Wdeclaration-after-statement]
先分析一下這部分警告資訊
*** WARNING: This kernel lacks wireless extensions.
Wireless drivers will not work properly.
那麼我們就去搜一下。進行分析。
檢視esp8089-spi的Makefile,發現這麼一句話,
config_check: @if [ -z "$(CONFIG_WIRELESS_EXT)$(CONFIG_NET_RADIO)" ]; then \ echo; echo; \ echo "*** WARNING: This kernel lacks wireless extensions."; \ echo "Wireless drivers will not work properly."; \ echo; echo; \ fi
在核心目錄使用
make ARCH=arm CROSS_COMPILE=arm-linux-
然後按下/鍵,進行搜尋CONFIG_WIRELESS_EXT,
找到
Symbol: WIRELESS_EXT [=n ] │ Type : bool │ Defined at net/wireless/Kconfig:2 │ Depends on: NET [=y] && WIRELESS [=y]
然後在kernel/net/wireless/Kconfig
中找WIRELESS_EXT
config WIRELESS_EXT bool
更改為
config WIRELESS_EXT
def_bool y
再次編譯:
$ make ARCH=arm CROSS_COMPILE=arm-linux- make -C /home/twzy/DVPM_linux-5.2/linux-nano-5.2-tf M=/home/twzy/linuxCard/Driver/ESP8089-SPI make[1]: Entering directory '/home/twzy/DVPM_linux-5.2/linux-nano-5.2-tf' CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_debug.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/sdio_sif_esp.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/spi_sif_esp.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_io.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_file.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_main.o In file included from ./include/linux/mm_types.h:12:0, from ./include/linux/mmzone.h:21, from ./include/linux/gfp.h:6, from ./include/linux/slab.h:15, from ./include/linux/crypto.h:19, from ./include/crypto/hash.h:11, from ./include/linux/uio.h:10, from ./include/linux/socket.h:8, from ./include/linux/compat.h:15, from ./include/linux/ethtool.h:17, from ./include/linux/netdevice.h:37, from /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_main.c:17: /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_main.c: In function ‘esp_pub_init_all’: ./include/linux/completion.h:54:2: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] struct completion work = COMPLETION_INITIALIZER(work) ^ ./include/linux/completion.h:74:43: note: in expansion of macro ‘DECLARE_COMPLETION’ # define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work) ^~~~~~~~~~~~~~~~~~ /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_main.c:81:2: note: in expansion of macro ‘DECLARE_COMPLETION_ONSTACK’ DECLARE_COMPLETION_ONSTACK(complete); ^~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_main.c:221:0: /home/twzy/linuxCard/Driver/ESP8089-SPI/eagle_fw1.h: In function ‘esp_download_fw’: /home/twzy/linuxCard/Driver/ESP8089-SPI/eagle_fw1.h:8:1: warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement] static u8 eagle_fw1[] = ^~~~~~ CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_sip.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_ext.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_ctrl.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_mac80211.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_utils.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp_pm.o CC [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/testmode.o LD [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp8089-spi.o Building modules, stage 2. MODPOST 1 modules CC /home/twzy/linuxCard/Driver/ESP8089-SPI/esp8089-spi.mod.o LD [M] /home/twzy/linuxCard/Driver/ESP8089-SPI/esp8089-spi.ko make[1]: Leaving directory '/home/twzy/DVPM_linux-5.2/linux-nano-5.2-tf'
沒有剛才的提示資訊了就OK了,
其他的警告都是不在最開始宣告變數的警告,可以忽略。
需要注意處理完成這個後核心也需要同步更新
2.3 修改裝置樹
找到裝置樹
suniv-f1c100s.dtsi檔案
在pio分組新增
spi0_pc_pins: spi0-pc-pins { pins = "PC0","PC1","PC2","PC3"; function = "spi0"; };
在soc分組下新增
spi0: spi@1c05000 { compatible = "allwinner,suniv-spi", "allwinner,sun8i-h3-spi"; reg = <0x01c05000 0x1000>; interrupts = <10>; clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_BUS_SPI0>; clock-names = "ahb", "mod"; resets = <&ccu RST_BUS_SPI0>; status = "disabled"; #address-cells = <1>; #size-cells = <0>; };
在suniv-f1c100s-licheepi-nano.dts檔案下新增
&spi0 { pinctrl-names = "default"; pinctrl-0 = <&spi0_pc_pins>; status = "okay"; };
2.4 處理驅動載入問題
將生成的 esp8089-spi.ko驅動檔案放置到 TF卡rootfs 分割槽 /lib/modules/5.7.1資料夾下,如果沒有需要手動mkdir建立了資料夾,另外將重新編譯過的Linux核心zImage與裝置樹dtb檔案也更新一下
執行開發板,進入/lib/modules/5.7.1資料夾,如果將esp8089-spi.ko放置到其他資料夾下執行會報如下類似的錯誤,最後的數字是Linux核心版本,根據提示建立對應資料夾即可
執行modprobe esp8089-spi.ko 命令載入驅動
# modprobe esp8089-spi.ko modprobe: can't change directory to '5.7.1': No such file or directory
將驅動放入對應的資料夾下
再次modprobe esp8089-spi.ko
# modprobe esp8089-spi.ko modprobe: can't open 'modules.dep': No such file or directory
這裡需要我們重新取編譯編譯檔案系統
處理方法如下:
https://www.cnblogs.com/twzy/p/15126656.html
載入depmod
# cd /lib/modules/5.7.1/ # ls esp8089-spi.ko # depmod # ls esp8089-spi.ko modules.alias modules.dep modules.symbols
載入驅動
# modprobe esp8089-spi.ko [ 59.630001] esp8089_spi: loading out-of-tree module taints kernel. [ 59.682075] esp8089_spi: EAGLE DRIVER VER bdf5087c3deb [ 60.305428] esp8089_spi: FAILED to find master [ 60.328536] esp8089_spi: FAILED to create slave [ 60.351455] Unable to handle kernel NULL pointer dereference at virtual address 000001a8 [ 60.396146] pgd = (ptrval) [ 60.417170] [000001a8] *pgd=83254831, *pte=00000000, *ppte=00000000 [ 60.460005] Internal error: Oops: 17 [#1] ARM [ 60.482718] Modules linked in: esp8089_spi(O+) [ 60.505401] CPU: 0 PID: 122 Comm: modprobe Tainted: G O 5.7.1 [ 60.550047] Hardware name: Allwinner suniv Family [ 60.572839] PC is at spi_setup+0x4/0x164 [ 60.594988] LR is at sif_platform_new_device+0x38/0x88 [esp8089_spi] [ 60.636851] pc : [<c0423420>] lr : [<bf00023c>] psr: 60000013 ………… [ 61.895790] [<c0423420>] (spi_setup) from [<00000000>] (0x0) [ 61.940327] Code: ebff0d15 eafffff9 c080caa4 e92d4030 (e59031a8) [ 61.985796] ---[ end trace b39325ed7e1d8da4 ]--- Segmentation fault
日誌中我們發現
[ 60.305428] esp8089_spi: FAILED to find master [ 60.328536] esp8089_spi: FAILED to create slave
所以我們要找到註冊master 和 slave 的位置。
2.5 驅動修改適配
當我們通過日誌內容找到檔案 spi_stub.c
後,
一起來修改吧:
struct spi_device* sif_platform_new_device(void) { master = spi_busnum_to_master(esp_board_spi_devices[0].bus_num); spi = spi_new_device( master, esp_board_spi_devices ); if(!spi) printk("esp8089_spi: FAILED to create slave\n"); if(spi_setup(spi)) printk("esp8089_spi: FAILED to setup slave\n"); return spi; }
知道註冊函式,以及註冊結構體
master = spi_busnum_to_master(esp_board_spi_devices[0].bus_num);
其中,esp_board_spi_devices[]為程式碼前面定義的結構體
static struct spi_board_info esp_board_spi_devices[] = { { .modalias = "ESP8089_0", .max_speed_hz = MAX_SPEED_HZ, .bus_num = 1, .chip_select = 0, .mode = 0, }, };
bus_num就是1
spi_busnum_to_master(1)研究一下
每個master都對應一個bus num。
註冊spi slave裝置,由dts解析得到,dts會指定spi slave 掛載在哪個bus num下,由bus num就可以得到對應的spi master 了
因為我們使用的spi0
所以將bus_num改為0之後(此處不知這種解釋是否符合理)
# modprobe esp8089-spi [ 11.554796] esp8089_spi: loading out-of-tree module taints kernel. [ 11.606600] esp8089_spi: EAGLE DRIVER VER bdf5087c3deb [ 12.230317] esp8089_spi: esp_spi_dummy_probe enter [ 12.254156] sun6i-spi 1c05000.spi: chipselect 0 already in use [ 12.296718] esp8089_spi: FAILED to create slave [ 12.342262] Unable to handle kernel NULL pointer dereference at virtual addre ss 000001a8 [ 12.387280] pgd = (ptrval)
可見spi_master已經註冊成功了,但是chipselect 0 already in use,說明當前配置SPI0,中片選為0的地址已經被使用,實時上我們並未連結其他裝置,所以懷疑是其他問題,我們還要改動一下這裡,
通過查詢資料
SPI通訊模式分為4中模式,經過逐一測試發現 SPI_MODE_3
也就是(4) 可用:
修改如下:
static struct spi_board_info esp_board_spi_devices[] = { { .modalias = "ESP8089_0", .max_speed_hz = MAX_SPEED_HZ, .bus_num = 0, //fix here .chip_select = 0, .mode = SPI_MODE_3, //fix here }, };
另外我們順便修改一下頻率,改為30Mhz:
//#define SPI_FREQ (10000000) //#define SPI_FREQ (20000000) // 1. 22.5Mhz 2. 45Mhz #define SPI_FREQ (30000000) // 1. 22.5Mhz 2. 45Mhz
另外還要修改中斷腳、復位腳,還是在spi_stub.c
檔案中:
中斷腳
復位腳
2.6 核心編譯配置
再修改核心編譯檔案.config,用於啟用相關SPI功能。
CONFIG_SPI=y CONFIG_SPI_MASTER=y CONFIG_SPI_SUN4I=y CONFIG_SPI_SPIDEV=y CONFIG_SPI_SUN6I=y
執行結果如下,
# cd /lib/modules/5.7.1/ # modprobe esp8089-spi [ 29.008363] esp8089_spi: loading out-of-tree module taints kernel. [ 29.025084] esp8089_spi: EAGLE DRIVER VER bdf5087c3deb [ 29.631516] esp8089_spi: try to use 0 [ 29.637763] esp8089_spi: esp_spi_dummy_probe enter [ 29.644630] esp8089_spi: register board OK [ 29.650529] esp8089_spi: sem_timeout = 0 [ 29.872020] esp8089_spi: ESP8089 power up OK [ 29.878555] esp8089_spi: esp_spi_probe ENTER [ 29.884786] esp8089_spi: esp_setup_spi [ 29.890336] esp8089_spi: sif_spi_protocol_init [ 29.896621] esp8089_spi: /home/twzy/linuxCard/Driver/ESP8089-SPI/spi_sif_esp.c, 1559 [ 29.907012] esp8089_spi: fail_count = 0 [ 30.024997] rx:[0xff],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff] [ 30.135388] esp8089_spi: /home/twzy/linuxCard/Driver/ESP8089-SPI/spi_sif_esp.c, 1559 [ 30.145770] esp8089_spi: fail_count = 1 [ 30.265689] rx:[0xff],[0x09],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff] [ 30.376023] esp8089_spi: /home/twzy/linuxCard/Driver/ESP8089-SPI/spi_sif_esp.c, 1559 [ 30.386385] esp8089_spi: fail_count = 2 [ 30.507530] rx:[0xff],[0xff],[0x01],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff] [ 31.116845] esp8089_spi: /home/twzy/linuxCard/Driver/ESP8089-SPI/spi_sif_esp.c, 1578 [ 31.143207] rx:[0xff],[0xff],[0x01],[0x10],[0xff],[0xff],[0x00],[0xff],[0xff],[0xff] ……………… [ 38.628868] rx:[0xff],[0x00],[0x01],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff],[0xff] [ 39.659517] esp8089_spi: esp_pub_init_all [ 39.665431] esp8089_spi: esp_download_fw [ 40.095380] esp8089_spi: sif_platform_irq_init enter [ 50.402011] resetting event timeout [ 50.407306] esp8089_spi: esp_init_all failed: -110 [ 50.413944] esp8089_spi: first error exit [ 50.419686] esp8089_spi: esp_spi_probe EXIT [ 50.425909] esp8089_spi: sem_timeout = 0 [ 50.431610] esp8089_spi: esp_spi_init err 0 #
通過日誌發現,Esp8266韌體已經下載進去了,但是出現了重置超時問題。
2.7 處理重置超時檢測
這裡使用這種方式暫時遮蔽超時檢測
修改esp_sip.c
檔案
在宣告變數:
extern struct task_struct *sif_irq_thread;
修改sip_poll_bootup_event
函式
sip_poll_bootup_event(struct esp_sip *sip) { int ret = 0; esp_dbg(ESP_DBG_TRACE, "polling bootup event... \n"); if (gl_bootup_cplx) ret = wait_for_completion_timeout(gl_bootup_cplx, 2 * HZ); esp_dbg(ESP_DBG_TRACE, "******time remain****** = [%d]\n", ret); if (ret <= 0) { esp_dbg(ESP_DBG_ERROR, "bootup event timeout\n"); //修改了一下程式碼 //return -ETIMEDOUT; sip->epub->wait_reset = 0; wake_up_process(sif_irq_thread); esp_dbg(ESP_DBG_ERROR, "for unknow reason,we may not be informed the boot/rst complete event, assume it completed and continue here\n"); msleep(50); } if(sif_get_ate_config() == 0){ ret = esp_register_mac80211(sip->epub); } #ifdef TEST_MODE ret = test_init_netlink(sip); if (ret < 0) { esp_sip_dbg(ESP_DBG_TRACE, "esp_sdio: failed initializing netlink\n"); return ret; } #endif atomic_set(&sip->state, SIP_RUN); esp_dbg(ESP_DBG_TRACE, "target booted up\n"); return ret; }
修改sip_poll_resetting_event
函式
sip_poll_resetting_event(struct esp_sip *sip) { int ret = 0; esp_dbg(ESP_DBG_TRACE, "polling resetting event... \n"); if (gl_bootup_cplx) ret = wait_for_completion_timeout(gl_bootup_cplx, 10 * HZ); esp_dbg(ESP_DBG_TRACE, "******time remain****** = [%d]\n", ret); if (ret <= 0) { esp_dbg(ESP_DBG_ERROR, "resetting event timeout\n"); //修改了一下程式碼 //return -ETIMEDOUT; sip->epub->wait_reset = 0; wake_up_process(sif_irq_thread); esp_dbg(ESP_DBG_ERROR, "for unknow reason,we may not be informed the boot/rst complete event, assume it completed and continue here\n"); msleep(50); } esp_dbg(ESP_DBG_TRACE, "target resetting %d %p\n", ret, gl_bootup_cplx); return 0; }
2.8 載入驅動
完成編寫後,重新載入驅動
使用命令:
ifconfig wlan0 up
啟動網路卡
使用
ifconfig
命令即可看到wlan0已經成功啟動
此時可以使用iw
相關wifi工具連線網路進行測試。
但是iw
在連線有密碼的wifi太不好操作了。
3. 將程式碼編譯到核心
通過上面的方式我們完成了驅動的開發,本節將我們通過另外一片帖子提供的程式碼,進行修改後打包到我們的系統中。
下載可以打包到Linux核心的ESP8266驅動包
https://whycan.com/files/members/5526/esp8089.zip
這裡修改了部分配置資訊,以便於打包進入核心
把該檔案解壓到核心原始碼/driver/staging/
下
修改核心原始碼/driver/staging/
下的Kconfig
檔案,新增:
source "drivers/staging/esp8089/Kconfig"
修改核心原始碼/driver/staging/
下的Makefile
obj-$(CONFIG_ESP8089) += esp8089/
接著返回核心原始碼所在目錄,輸入:
make menuconfig #(buildroot請輸入 make linux-menuconfig)
然後選中ESP8089,裡面選中SPI編譯即可。
[Device Drivers] ->[Staging drivers] ->[<*> Extend for NetWork Using ESP_8266EX/8089] ->[<*> Compile SPI-Mode-ESP_8266EX/8089 module in kernel]
此時我們還需要修改裝置樹,
配置如下:
suniv-f1c100s.dtsi
spi0:spi@1c05000 { compatible = "allwinner,suniv-spi", "allwinner,sun8i-h3-spi"; reg = <0x01c05000 0x1000>; interrupts = <10>; clocks = <&ccu CLK_BUS_SPI0>, <&ccu CLK_BUS_SPI0>; clock-names = "ahb", "mod"; resets = <&ccu RST_BUS_SPI0>; status = "disabled"; #address-cells = <1>; #size-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&spi0_pins>; };
suniv-f1c100s-licheepi-nano.dts
&spi0 { status = "okay"; esp8089@0 { status = "okay"; compatible = "boss,esp8089"; spi-cpol; spi-cpha; reg = <0>; spi-max-frequency = <30000000>; reset= <135>; //PE7 interrupt= <136>; //PE8 debug= <0>; }; };
請根據實際情況進行修改reset和interrupt。
更新核心檔案和裝置樹,
編譯後在載入過程中出現一些第2節遇到的問題,可以返回去修改當前程式碼即可(比如那個重啟超時處理的程式碼)
這樣就不用再手動modprobe
4. 連線網際網路
核心驅動部分已經完成了,那麼開始安裝應用層的軟體吧。進入buildroot,我們需要重新制作檔案系統,增加網路相關元件。
進入根目錄執行
make menuconfig
進入如下選單:
Target packages -> Networking applications
選中
- wireless tools --無線管理工具
- wpa_supplicant --連線無線網路
- dhcpcd --獲取IP地址
等軟體
選中對應選項後,退出配置介面進行編譯檔案系統寫入TF卡,最後開發板上電以後進入系統,
我們首先看看wlan0是否已經被建立,使用如下命令:
ifconfig
然後用以下命令配置WIFI的SSID和密碼
vi /etc/wpa_supplicant.conf
輸入內容:
network={ ssid="我的熱點" psk="我的密碼" }
退出vi回到命令列,後執行如下命令連線wifi
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
此處表示WIFI已經正確連入路由器,那接下來啟動dhcp自動獲取IP吧:
udhcpc -i wlan0
已經獲取到IP地址了,那麼現在開始愉快的玩啥吧。
聯網成功。
總結
本篇存在多次製作驅動、核心以及檔案系統的操作,通篇下來不是很連貫,而且細節部分過於分散,這是因為本篇是在作者在除錯網路卡過程中不斷輸出的,所以出現多次返工的問題。還望讀者海涵諒解。
到目前為止網路卡驅動已經制作完成,並且已經成功啟動網路卡,並且連線了網路,但是因為Buildroot軟體生成的最小檔案系統元件太少了,我們還沒發使用apt、ssh等元件(當然可以直接在Buildroot中構建),這樣距離當一個真正的小電腦還有點遠,所以下一篇我們來一起移植Debian吧。