話說,開發板的資料目錄亂得讓人頭皮發麻,最后發現 \開發板資料\百問網精智JZ2440開發板4.3寸LCD版使用手冊.pdf
是關鍵
網頁資料:http://wiki.100ask.net/分類:ARM裸機加強版
驅動安裝
驅動文件目錄路徑別太長,否則windows會報錯:系統找不到指定的文件
百問網的新版 Jz2440 v3.0,插上電源線
Windows:
- OpenJTAG{禁用驅動簽名}
排線口
(被識別成 兩個USB<=>JTAG&RS232
+一個USB Serial Port
)
micro USB Serial 串口
的Prolific USB-to-Serial Comm Port
會被系統自動更新安裝micro USB Devices 設備開機模式
下的DNW驅動SEC S3C2410X Test B/D
找了很久,最后發現可以直接用開源工具 Zadig 全部一鍵安裝。這里附上2.5版本zadig-2.5.zip
附上:
VMware的三種網絡模式
驅動安裝完成
排線是三個 OPENJTAG設備(USB Serial Port
+ 100ASK JTAG
+ 100ASK Serial Port
)
靠近網線口的是 micro USB Serial 串口 Prolific USB-to-Serial Comm Port
在usb串口旁邊的是 Micro USB Devices SEC S3C2410X Test B/D
,這個設備偶爾會報錯, 且會受VMware的影響,重開開發板/虛擬機就可以了(最好是插線開機后再開虛擬機)
可以調整COM端口號,雙擊設備,端口設置-高級,設置為COM1
編譯 Bootloader 和操作系統
Bootloader選用 U-Boot,操作系統選用 Linux-arm
arm交叉編譯器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi區別
交叉編譯ARM版的U-Boot,及插樁打補丁
因為虛擬網卡出了問題,又剛好有個分區沒用到,所以直接放uboot等源碼文件並映射成虛擬磁盤給VMware用了。
注意:如果按任意鍵召喚不了uboot菜單,那么建議斷開usb,先插電開機再串口調試,按開發板的RESET鍵重啟
准備交叉編譯環境
推薦做完以下步驟后,試試自己搭建交叉編譯環境 https://crosstool-ng.github.io/docs/ 及其 GithubRepos
鑒於國內垃圾 GFW網絡,在此提供官網下的無修改壓縮包 crosstool-ng-1.24.0.zip
用資料提供的古老的ubuntu9.10.......,當然我在評論區放了Ubuntu18.04的使用方案
把這個arm-linux-gcc包解壓到根目錄,然后編輯環境變量
sudo tar -xjf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C /opt
sudo vi /etc/profile
在末尾添加如下
export PATH=$PATH:/opt/gcc-3.4.5-glibc-2.3.6/bin
按ESC
,輸入:wq
保存退出
刷新環境變量配置
source /etc/profile
**注: ** 如果之前使用了其他版本的gcc,那么應該關閉終端窗口后重新打開,並source /etc/profile,否則make里的gcc變量依然是之前的版本
如果希望自定義交叉編譯環境,可以用export 設置僅在當然終端窗口生效的臨時全局變量,或者在原 make 命令后接上如 CROSS_COMPILE=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux- 用於指定編譯器路徑及其前綴
插樁編譯 Uboot
tar xjf u-boot-1.1.6.tar.bz2
cd u-boot-1.1.6/
patch -p1 < ../u-boot-1.1.6_jz2440.patch
使用配置並一鍵編譯
make 100ask24x0_config
make
或者指定交叉編譯工具鏈前綴路徑變量
make ARCH=arm CROSS_COMPILE=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux- 100ask24x0_config
make CROSS_COMPILE=/opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-
插樁編譯 Linux2.6
tar xjf linux-2.6.22.6.tar.bz2
cd linux-2.6.22.6
patch -p1 < ../linux-2.6.22.6_jz2440.patch
make s3c2410_defconfig #如果不想用現成的config_ok,可以基於uboot提供的2410自己修改(方案1)
cp config_ok .config #直接使用100ask官方做好的配置(方案2)
make menuconfig #配置菜單(可選)
make uImage
燒寫開發板
- 用 oflash 燒寫工具將
U-boot.bin
寫入開發板的 Nor Flash (通過 OpenJTAG 排線接口) - 通過
USB 串口
用終端命令和開發板交互(數字電路原理:信息本質都是通過電信號傳輸的,所以和網絡ssh本質上也沒有差別,和ssh一樣操作命令就行) 記得設置波特率為115200並關閉流控(Flow Control),然后重開終端窗口 可以通過串口操作Uboot,利用Uboot提供的[k]Download linux kernel uImage
來將嵌入式操作系統如Linux2.6
寫入開發板
接上兩根usb,用 終端工具 Mobaxterm新建串口終端,
,將開發板開機,在uboot 倒計時間內按空格鍵
進入uboot菜單,選[k]Download linux kernel uImage
,然后打開 dnw_100ask.exe ,在標題顯示USB:OK
時點 USB Port->Transmit選擇編譯好的uImage燒寫即可。
附上官方說明:
在uboot進入接收文件模式后,應注意如下
附上:jz2440在u-boot中通過網絡方式燒錄鏡像的幾種方法
- [b]Boot the system.
然后選b啟動系統,會打印出Linux啟動日志,最后的Linux日志還有報錯Panic,開發板的屏幕也是花屏的,但至少成功寫入系統了,后面再修修補補應該就可以了。
根據報錯日志,初步懷疑是寫入的yaffs2文件系統有問題
再搞搞,把開發板資料里提供的二進制文件 fs_mini.yaffs2 通過DNW協議燒寫進去
可以看到成功進入Linux命令行了,說明我自己做的文件系統還有問題,那么,就暫時用開發板資料提供的吧
參考:【內核配置】一、從標准linux-2.6.22.6系統到ARM平台JZ2440開發板的linux系統的修改攻略
VMware網絡配置
設置兩個網卡(一個NAT,一個橋接)
編輯-虛擬網絡編輯器,為NAT分配IP段,為橋接設置自動選擇物理網卡
NAT固定IP參考:https://www.cnblogs.com/telwanggs/p/10882369.html
完善Linux環境
現在只刷入了一個內核,其他什么都沒有。啟動不了終端,也敲不了 ls 之類的命令
- 根文件系統、 添加 busybox 工具鏈及 libc 編程運行支持庫
- 內核只提供了內存文件系統等少量東西,如果沒有實際的文件系統和運行庫,那么就像Windows只有內核文件·C:\Windows\system32\NTOSKRNL.EXE·及其最相關的幾個文件,而沒有C盤其他文件一樣,連cmd都打不開。
- BusyBox是一個適合嵌入式的 Linux 常用命令的精簡集,提供了如 ls cp tar 等命令。
- libc 是支持C語言運行的標准支持庫,沒有這個,連 printf 函數都用不了。(常見的libc有 glibc uClibc等)
參考:構造嵌入式Linux最小根文件系統及其 Busybox、libc運行庫
配置NF
- NFS 基於網絡協議的文件系統(方便操作,不必每次都燒寫文件系統)
服務端(虛擬機系統)操作:
安裝NFS服務
sudo apt-get install nfs-kernel-server
編輯配置sudo vi /etc/exports
並添加如下
/work/nfs_root *(rw,sync,no_root_squash)
/home/xx/myCode *(rw,sync,no_root_squash)
重新生效配置
##或者重新讀取配置(如果有已掛載了NFS的客戶端,請使用這個)
## exportfs來自nfs-utils包
exportfs -arv
##或者重啟NFS服務器以生效配置(如果有已掛載了NFS的客戶端,就不能重啟服務,而只能重新讀取配置)
sudo service nfs-kernel-server restart
客戶端(開發板)操作:
修改初始化腳本 (/etc/profile 或 /etc/init.d/rcS 之類的,修改其中一個即可)
增加開機靜態ip地址,如加上
ifconfig 192.168.123.9 up
(以下 192.168.123.74 是虛擬機系統橋接網卡模式下的IP,路由器列表里可以找到,也可以用 ip a
命令查看)
- 樹莓派掛載NFS目錄
## mount -t nfs [虛擬機IP地址]:[需掛載目錄] [要掛載到開發板哪個路徑] -v
mount -t nfs 192.168.123.74:/home/xx/myCode/pi/driver/out /mnt -v
- JZ2440作為客戶端掛載NFS目錄(JZ2440 比較舊,所以加些參數向下兼容)
## mount -t nfs -o intr,nolock,rsize=1024,wsize=1024,vers=3 [虛擬機IP地址]:[需掛載目錄] [要掛載到開發板哪個路徑] -v
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024,vers=3 192.168.123.74:/home/xx/myCode/devices/out /mnt -v
ps: -v
是日志參數,便於人工排錯
也可修改/etc/fstab使其開機自動掛載
如果修改了fstab,那么可以使其馬上生效,命令:
## v是信息; a(all)掛載/etc/fstab里的全部
sudo mount -va
編程
- 給U-boot添加命令
uboot1.1.6為例:在common目錄下新建cmd_hi.c
並把 cmd_console.c 的內容復制進去再依樣畫葫蘆地修改,記得去掉#ifdef CONFIG_CMD_CONSOLE
之類的宏定義。
修改 common 目錄下的 Makefile文件,在 COBJS 的定義后面增加一行COBJS+= cmd_hi.o
然后編譯燒寫即可
測試:在u-boot啟動時按任意鍵阻止uboot啟動操作系統,然后按q退出菜單。在OPENJtag>
的命令框里輸入hi
,即可看到程序執行的結果。
源碼 common/cmd_yu.c
/*
* @Author: yu
* copy based on cmd_display.c
*/
#include <common.h>
#include <command.h>
#if (CONFIG_COMMANDS )// & CFG_CMD_YU)
// #undef DEBUG_DISP
// extern void _do_yu (void);
int do_yu (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
if (argc == 0)
printf("Hello World, Yu!!!\n");
else
printf("Hello World, %s!\n", argv);
printf("More Message print: \n");
printf("=======================\n");
printf("Flag is %d\n", flag);
printf("Argc is %d\n", argc);
printf("Argv are %s\n", argv?argv:"");
return 0;
}
/***************************************************/
U_BOOT_CMD(
yu, 2, 1, do_yu,
"yu- a demo for print Hello World\n",
"[<string>]\n"
" - with <string> argument: print \"Hello World, <string>!\" \n"
" - without arguments: print \"Hello World, Yu!!!\" \n"
);
#endif
/* CFG_CMD_YU */
記得改一下 common目錄下的 Makefile 文件
串口使用
串口占用問題
強制關閉被占用串口的方法,如關閉 COM3
任務管理器-性能-(左下角)資源監視器
或者設備管理器-右擊COM3-屬性-端口設置-高級
修改端口
然后確定,串口就會被強制關閉並被系統修改端口
配置開發板的串口文件傳輸工具 sz/rz
(sz/rz)是Z-Modem 串口文件傳輸協議的支持工具
sz 是 send zmodem file ,即發送文件(基於zmodem協議)
rz 是 recevice zmodem file ,即接收文件(基於zmodem協議)
這種協議比 rx 支持的 X-Modem 協議要快很多
把Z-Modem協議的支持工具發到開發板上
即下載並解壓出 sz 和 rz 程序到電腦,然后通過 ARM開發板內置的 rx 命令把這兩個發送到開發板
zmodem_tools3.4.8.zip
然后復制到/bin目錄,並賦權限 777
cp ./rz /bin/
cp ./sz /bin/
chmod 777 /bin/rz
chmod 777 /bin/sz
以后通過串口傳輸文件只需要如下步驟即可:
MobaXterm 通過串口發送文件到 嵌入式 Linux 下位機
開發板輸入命令
# rz
然后按住Shift鍵右擊,通過 Zmodem 協議發送文件即可
MobaXterm 其他常用使用技巧
復制:只需要按住鼠標左鍵選中文字,即可自動復制。
粘貼:右擊粘貼文字
傳輸文件:在側邊欄選 SCP 或 FTP,然后就可以看到了,支持拖拽。側邊欄上方的按鈕也請多留意。
FTP 等服務器程序:
甚至還能掃端口...
VSCode Remote SSH 遠程開發
VSCode+Remote SSH 插件
VMware + Ubuntu18+
MobaXterm 遠程終端(支持串口和SSH等)
STC12C5A60s2 系列屬於 8051 單片機
使用 Ubuntu18.04LTS x64 代替古老的ubuntu9
原因: Ubuntu9太老了,VSCode Remote SSH 不支持
換USTC軟件源
安裝ssh服務端(默認自啟動)
sudo apt install openssh-server
關閉圖形界面
sudo systemctl set-default multi-user.target # 關閉用戶圖形界面
sudo reboot
sudo systemctl start gdm3.service #臨時開啟圖形界面
sudo systemctl stop gdm3.service #臨時關閉圖形界面,只在注銷用戶后才生效
32位支持庫注意
64位的Linux執行32位軟件是需要安裝32位庫的,否則如光盤附帶的 arm-linux-gcc(即arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2里的gcc)會報錯
-bash: /opt/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc: No such file or directory
安裝32位庫
sudo apt install lib32ncurses5 lib32z1 lib32stdc++6
解決vi方向鍵打出字母的問題
sudo apt remove vim-common
sudo apt install vim
復制交叉編譯工具
把對方提供的虛擬機系統(如ubunu12)里的 交叉編譯工具壓縮成 tar.gz 后,放到你自己的虛擬機系統(如 Ubuntu18,記得安裝32位庫)
然后配置環境變量(參考上面多編譯環境的配置)
注 which arm-linux-gcc 可以得到工具的安裝路徑
將arm-linux交叉編譯環境加入臨時系統變量
sudo nano /etc/profile #然后在文件末尾加入
export GCC_S3C=/opt/gcc-3.4.5-glibc-2.3.6/bin
export PATH=$PATH:$GCC_S3C # 如果需要多版本gcc就不要把這個加入環境變量配置文件里,而只在使用make的那個窗口執行一下,等於提供臨時變量,非常適合多版本gcc的使用
配置虛擬網卡
設置2個虛擬機網卡,但要記得都配置DNS
地址
一個NAT模式,固定IP地址不隨網段變化(固定IP且通外網,但被NAT隔離只能在本地和虛擬機內訪問,局域網不可見)
一個橋接模式,IP地址隨着宿主機網段變化(用於局域網連接,相當於新建一個網卡直接連接到當前局域網內)
也可使用 NAT 端口轉發
將虛擬機里的端口轉發到本地系統上。這樣外部就可以訪問該虛擬機端口了
使用VSCode Remote SSH 進行遠程開發
VSCode安裝Remote SSH插件,然后連接到虛擬機ubuntu進行遠程開發,並為虛擬機ubuntu安裝vscode遠程C/C++插件,一切都舒服了!!!
SSH 免密登錄(適用VSCode)
make CROSS_COMPILE=$GCC_S3C/arm-linux- 100ask24x0_config
make CROSS_COMPILE=$GCC_S3C/arm-linux- #如果你還嫌不夠方便,可以安裝 VSCode的 Code Runner 插件並把這個命令加入其插件的Custom Command配置里,按F1選Run Custom Command(或輸入Ctrl+Alt+K)執行
或者根據 VS Code 安裝與配置(使用MSYS2環境與mingw-w64 編譯環境)(12089) 配置那你的 arm-linux-gcc 編譯腳本
也可以把 SEC S3C2410X Test B/D
連接到虛擬機系統里變成一個VMware USB Device
。把linux版的 dnw
、oflash
、mkyaffsimage
、mkyaffs2image
等工具 放進ubuntu
然后直接在Windows操作串口,在ubuntu里編譯出u-boot.bin
后用Linux版的dnw 文件名
寫入即可。
使用ubuntu16.04配置linux內核和busybox出現錯誤的解決方法總結
修復變量爆紅(頭文件Include路徑問題)
arm-linux-gcc -v -x c -E /dev/null
然后把#include <...> search starts here:下面的內容,都加入 VSCode 遠程安裝的 C/C++插件配置里的 includePath
/opt/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/include
/opt/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/../../../../arm-linux/sys-include
/opt/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/../../../../arm-linux/include
另外內核驅動開發,還需要 __KERNEL__
MODULE
以及 linux/autoconf.h 里的宏定義,用 KEY=val 表示。見:https://blog.csdn.net/Ningjianwen/article/details/88075042
VSCode常用快捷鍵
右擊變量 更多功能
Ctrl+鼠標左擊 查看函數/變量定義
ALT+左右方向鍵 前進后退
VSCode 開發 STM32 等單片機
另外,如果你還需要開發單片機程序,那么VSCode有個替代Keil的插件: EIDE
生成開發板系統對應的man手冊
到 https://mirrors.edge.kernel.org/pub/linux/kernel/ 下載Linux源碼(如 https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/linux-3.4.39.tar.gz ),安裝編譯手冊所需要的工具man和xmlto,然后在下載的Linux源碼目錄
make mandocs
編譯后輸出目錄為 內核源碼/Documentation/DocBook/man
然后安裝到 man 手冊資料路徑下(會安裝到內核條目 /usr/local/man/man9/,並不會覆蓋原來的 man 1~8)
sudo make installmandocs
然后測試一下
man 9 printk