撰寫日期 | 2018.10.06 |
---|---|
完稿日期 | 2018.10.28 |
最近維護 | 2018.11.18 |
本文做者 | multimicro |
聯繫方式 | multimicro@qq.com |
資料連接 | 百度網盤(提取碼: yimj) |
GitHub | https://github.com/wifialan/ |
小編備註 | 本文首發在CSDN上面 |
環境說明 | 詳細信息 | 備註信息 |
---|---|---|
操做系統 | Ubuntu 18.04.1 LTS | 官網地址 | 清華鏡像 |
操做系統內核版本 | 4.15.0-36-generic | |
編譯器 | arm-linux-gcc-4.4.3 | 下載地址 |
編譯器路徑 | /usr/local/arm/gcc-4.4.3/bin | |
u-boot版本 | u-boot-2014.04.01 | 官網地址 | 百度網盤(提取碼: yimj) |
kernel版本 | linux-3.4.2 | 官網地址 |
busybox版本 | busybox-1.22.1 | 官網地址 |
tslib版本 | tslib-1.4 | 官網地址 |
libiconv版本 | libiconv-1.14 | 官網地址 |
Qt版本 | qt-everywhere-opensource-src-5.6.0 | 官網地址 |
1. 本文所用的編譯器所有爲指定路徑下的絕對路徑,並無把編譯器配入環境變量中去
2. 編譯Qt5.6所用的編譯器是4.4.3版本的,這裏就用4.4.3版本的編譯器從新把u-boot
uImage
從新編譯了一下
3. 打完補丁的linux-3.4.2代碼GitHub地址:linux-3.4.2-JZ2440V3 clone下來後執行兩條命令便可製做出支持4.3LCD,觸屏和網卡的uImage:第一條命令:cp config_ok .config
第二條命令:make uImage CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8
確保修改成你的編譯器路徑
4. 獨立的linux-3.4.2補丁文件在百度網盤裏面,名字爲linux-3.4.2_ok.patch
html
cd u-boot-2012.04.01/ patch -p1 <../u-boot-2012.04.01_100ask.patch
我修改了內核分區大小,將默認的2m改成了4m(打完補丁在進行以如下操做)linux
vim include/configs/smdk2440.h
這是我改後的文件
保存退出後執行如下命令編譯u-bootgit
make CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- smdk2440_config make CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- -j8
編譯完成後經過ls
命令就能夠看到u-boot.bin
文件了
若提示arm-linux-gcc command not found:github
cd linux-3.4.2/ patch -p1 <../linux-3.4.2_100ask.patch cp config_ok .config
接下來把內核所在分區修改成4mubuntu
vim arch/arm/mach-s3c24xx/common-smdk.c
下圖是我修事後的文件
而後在執行如下命令編譯內核uImagevim
make menuconfig CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8 make uImage CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8
內核完成,但不支持網絡和觸摸屏windows
至此上面的內核掛載啓動文件系統後,是不支持網卡的,也就是沒法使用ifconfig
等網絡相關命令,須要修改內核裏面的文件:網絡
進入內核文件夾裏面:arch/arm/mach-s3c24xx/
對比文件mach-mini2440.c和mach-smdk2440.c
下面修改mach-smdk2440.c文件使其支持網卡功能:
(1)增長mini2440裏面的dm9000網卡頭文件工具
#include <linux/dm9000.h>
(2)增長下面這兩個結構體(從mach-mini2440.c裏面複製而後把"mini2440"改成"smdk2440")測試
static struct resource smkd2440_dm9k_resource[]={...}; static struct dm9000_plat_data smdk2440_dm9k_pdata={...};
(3)增長宏定義(從mach-mini2440.c裏面複製而後把"MINI2440"改成"SMDK2440")
#define SMDK_SMDK2440_DM9K_BASE (S3C2410_CS4 + 0x300)
(4)在mach-smdk2440.c的下面結構體中增長一行代碼:
static struct platform_device *smdk2440_devices[] __initdata={...};
加入代碼:
&smdk2440_device_eth,
(5)從新編譯內核後再次燒錄便可
修改後的arch/arm/mach-s3c24xx/mach-smdk2440.c以下,頭文件#include <linux/dm9000.h>
下圖沒截出來,但別忘添加了哦
以下是燒錄支持DM9000網卡後的內核後掛載文件系統後的網絡配置及其掛載信息,此步驟可在成功掛載文件系統後在看
圖片中的掛載命令是做測試用的,真正用來掛載並正常傳輸文件的是下面這個命令
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.1.120:/home/china/work/nfsroot /mnt/nfs/
***
在arch/arm/mach-s3c24xx/
文件夾中,修改裏面的mach-smdk2440.c
文件內容,修改內容就不粘貼了,我把這個改後的文件鏈接粘貼出來直接下載使用便可,文件見上述百度雲盤資料
編譯內核從新燒錄後以下圖:
4.3LCD支持搞定,啓動此內核時,JZ2440V3的4.3寸LCD會顯示一個閃爍光標
首先引用宋寶華《linux設備驅動開發詳解》中P66的一段話
在linux內核中增長程序須要完成如下3項工做。
Step 1
增長的支持觸屏文件s3c2440_ts.c
文件見上述百度雲盤資料
把s3c2440_ts.c拷貝至以下內核文件夾下
Step 2
修改linux-3.4.2/drivers/input/touchscreen/
下的Kconfig
文件
如圖,能夠仿照2410的配置文件撰寫
Step 3
修改linux-3.4.2/drivers/input/touchscreen/
下的Makefile
文件
如圖,能夠仿照2410的配置文件撰寫
下面進入menuconfig
裏面進行配置
熟悉menuconfig
的朋友估計發現了,我在Kconfig中配置2440的信息時,加了一行代碼:default y
,目的就是編譯內核時默認編譯內核中。固然,我麼也能夠進入menuconfig
裏面進行配置或查看:
經過如下命令進入menuconfig
make menuconfig CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8
進入後依次進入:
Device Drivers --->
Input device support
Touchscreens
JZ2440 /generic touchscreen input driver
選擇*
直接編譯入內核中,而後從新編譯內核便可。編譯命名此處再也不粘貼!
編譯完後,燒錄進去的內核會打印出以下信息:
對應的這個觸屏驅動程序會在文件系統的/dev/input/文件夾下建立對應的事件:
以前我沒移植成功JZ2440配套的觸屏驅動程序,就不會出現上圖的input: ...
內核打印信息,文件系統中(移植見下面)也不會自動出現以下圖的event0
和mouse0
兩個事件,本身建立的話若是很差使,根本緣由在於觸屏驅動沒有驅動上! 驅動上了,本身用mknod
命令建立節點也是能夠的。不然就會出現:error: No such file or directory
這樣的信息,記住了哦!
以前不知道是因爲觸屏驅動沒驅動上,一直在那裏傻乎乎的google,直到看到這篇文章後才意識到應該是觸屏驅動沒驅,WTF!驅動上以後果真,解決了。
這個觸屏驅動的正常驅動,是後續使用觸屏的前提!--這好像是句廢話
在windows下經過openJTAG下載吧,或者進Nor-Flash中用老版本的u-boot下載,這個就須要藉助DNW工具了
啓動新加載的u-boot
經過mtdparts
命令能夠看出通過u-boot劃分後的flash分區,其中kernel已經爲修改後的4M大小
1) //經過tftp協議將tftp共享文件夾裏面的uImage文件下載到板內地址爲0x30000000的SDRAM內存中
tftp 0x30000000 uImage
2) //nand erase [clean] [off size] 其下命令表示擦除nand flash內存中偏移0x60000(off)地址後的大小爲0x00400000(size)的flash位置空間 。[clean] 中[ ] 表示其中的命令是可選的
nand erase 0x60000 0x00400000
//下面這種方法不用考慮偏移量offset和擦除大小size,固然,kernel這個名字是要在u-boot中經過mtdparts命令獲取的,見上圖
nand erase.part kernel
3) //其下命令表示將SDRAM中存放在地址爲0x30000000地方的文件下載到flash偏移地址爲0x60000的大小爲$filesize中去
//偏移量0x60000也是經過mtdparts命令獲取得知的,見上圖
nand write.jffs2 0x30000000 0x60000 $filesize
tftp準備工做參考這篇文章:https://blog.csdn.net/multimicro/article/details/82288535 ,燒寫工做看這個就好了
沒準備好的,必定要看上面的文章,特別是在u-boot中配置網絡環境(ip),不要忘了
tftp 0x30000000 uImage nand erase.part kernel nand write.jffs2 0x30000000 0x60000 $filesize
下面第一個藍色框框裏面的數據和上圖紅色框框裏的數據是同樣的哦
而後輸入boot
啓動內核
若內核啓動亂碼,則重啓開發板,在u-boot命令行中輸入
set bootargs console=ttySAC0,115200 save
而後輸入
boot
啓動便可
啓動內核後的打印信息:
沒有修改前的2M分區內核
修改後的4M分區內核
cd busybox-1.22.1/ make menuconfig CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8 make CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8 make CROSS_COMPILE=/usr/local/arm/gcc-4.4.3/bin/arm-linux- ARCH=arm -j8 install COFIG_PREFIX=/home/china/work/nfsroot/busybox
其他暫時參考:https://blog.csdn.net/lizuobin2/article/details/52673494
sudo apt-get install autoconf automake libtool
檢測編譯器裏面的EV_VERSION
數值是否和內核include/linux/input.h
文件的EV_VERSION
所使用的一致,若是不一致,把編譯器的EV_VERSON修改成和內核EV_VERSION一致。
內核 EV_VERSION(標準)
編譯器 EV_VERSION (和內核中數值保持一致)
上圖是我已經修改過的,若不一致,請自行修改!這是防止出現使用觸屏時出現如下錯誤
-selected device is not a touchscreen I understan
(下面的 CC= 和 CXX= 我指定的是編譯器的指定路徑,因此make的時候就不須要指定了)
cd tslib/ ./autogen.sh ./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes CC=/usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-gcc CXX=/usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-g++ -prefix=/home/china/work/jz2440/qt/tslib_root make make install -j8
其他配置步驟暫時參考:https://blog.csdn.net/lizuobin2/article/details/52673494
成功後,用./ts_test
測試。前提是4.3寸的LCD和觸屏驅動移植成功。
對應的JZ2440 4.3寸的LCD顯示爲:
如今觸碰LCD,則會在終端中輸出相關信息,以下圖:
如有其餘錯誤,可根據錯誤信息百度或者google解決,自學能力也是很重要的一種能力哦。
1) 首先須要yaffs2製做工具mkyaffs2image
此文件在韋東山提供的JZ2440配套光盤A盤裏面的tools文件夾下有
2) 或者來到B盤這裏
在此文件夾路徑下終端make
一下,也能出來這個工具
Tips: 執行make clean
生成的文件就消失了
把這個mkyaffs2image工具複製到/usr/local/bin/
目錄下,這樣就能夠直接在終端中使用此工具了
sudo cp mkyaffs2image /usr/local/bin/
找到製做好的busybox文件夾,這個文件夾是本文第5步下的busybox安裝位置
tftp 0x30000000 busybox.yaffs2 nand erase.part rootfs nand write.yaffs 0x30000000 0x460000 $filesize
經過u-boot中的mtdparts
命令打印出的信息,設置offset信息哦
燒寫yaffs2文件系統
此時直接輸入boot
啓動會出現如下信息「root=」下沒有掛載文件系統,看下圖可知文件系統分區在mtdblock3
地方
重啓開發板,在u-boot中執行如下命令掛載文件系統所在分區:
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 init=/linuxrc save boot
能夠看出掛載後的系統了
至此,文件系統燒寫並掛載成功!
注意到上圖一行信息:can't run '/etc/init.d/rcS':Permission denied
這是因爲沒有執行權限的緣由,給下圖這這兩個路徑下的兩個文件加執行權限chmod +x [yourfile]
便可,效果圖以下:
Step 1 準備好Qt5.6源碼包
qt-everywhere-opensource-src-5.6.0.tar.gz
Step 2 解壓Qt5.6源碼包,並創建自動配置腳本文件
tar -zxf qt-everywhere-opensource-src-5.6.0.tar.gz cd qt-everywhere-opensource-src-5.6.0/ touch qt-build.sh vim qt-build.sh
把下面這些粘貼進去
-prefix
後面是編譯好的Qt安裝路徑,提早創建好
-I
後面是編譯安裝好的tslib中include
路徑
-L
後面是編譯安裝好的tslib中lib
路徑
#!/bin/sh ./configure -prefix /home/china/work/jz2440/qt/Qt5.6 \ -v \ -opensource \ -release \ -confirm-license \ -xplatform linux-arm-gnueabi-g++ \ -shared \ -qt-zlib \ -no-gif \ -qt-libjpeg \ -no-nis \ -no-opengl \ -no-cups \ -no-glib \ -no-dbus \ -no-rpath \ -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 \ -no-avx \ -no-openssl \ -nomake tools \ -qreal float \ -qt-libpng \ -tslib \ -nomake examples \ -I /home/china/work/jz2440/qt/tslib_root/include \ -L /home/china/work/jz2440/qt/tslib_root/lib
自動配置腳本文件搞定。
Step 3 配置Qt的平臺信息
執行:
vim qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf
把下面的替換進去
# # qmake configuration for building with arm-linux-gnueabi-g++ # MAKEFILE_GENERATOR = UNIX CONFIG += incremental QMAKE_INCREMENTAL_STYLE = sublib QT_QPA_DEFAULT_PLATFORM = linuxfb QMAKE_CFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t QMAKE_CXXFLAGS += -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g++-unix.conf) include(../common/qws.conf) # modifications to g++.conf QMAKE_CC = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-gcc -lts QMAKE_CXX = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-g++ -lts QMAKE_LINK = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-g++ -lts QMAKE_LINK_SHLIB = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-g++ -lts # modifications to linux.conf QMAKE_AR = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-ar cqs QMAKE_OBJCOPY = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-objcopy QMAKE_NM = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-nm -P QMAKE_STRIP = /usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-strip
Step 4 開始編譯安裝Qt
./qt-build.sh make -j8 make install
Tips:
在執行./qt-build.sh
時,終端會輸出不少error
,但仔細看會發現,一個error
下面會對應一個*** disable
信息,這個推測是根據配置文件禁用了相關功能,只要能產生Makefile
便可,不影響最後的編譯結果!要是其餘error狀況,可自行google哦
Step 5 配置安裝好的Qt以下
Step 6 把編譯安裝好的Qt核心文件複製到板子中
經過nfs
服務,首次使用的可參考此篇文章:https://blog.csdn.net/multimicro/article/details/82288449
僅把上圖中的libs
plugins
兩個文件夾複製至JZ2400開發板便可。
Step 7 在開發板中配置Qt的環境變量
在文件系統 /etc/profile 裏添加
export QTEDIR=/usr/local/Qt5.6 export LD_LIBRARY_PATH=/usr/local/Qt5.6/lib: LD_LIBRARY_PATH export QT_QPA_GENERIC_PLUGINS=tslib export QT_QPA_FONTDIR=$QTEDIR/lib/fonts export QT_QPA_PLATFORM_PLUGIN_PATH=$QTEDIR/plugins export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=480x272:mmsize=480x272:offset=0x0:tty=/dev/tty1 export QT_QPA_FB_TSLIB=1
搞定!
注:上圖中的mmSize
寫錯了,應該是mmsize
文章下面有糾正。
步驟以下
Step 1
Tips:
C++ 對應 arm-none-linux-gnueabi-g++
C 對應 arm-none-linux-gnueabi-gcc
** Step 2
單擊Add
選擇編譯後的Qt中的qmake
文件
Step 3 **
Step 1
在正常流程創建工程時,在選擇編譯器時,選擇本身配置的,其他正常流程。
Step 2
建好工程後
run qmake
build
就是那個錘子logo
字體問題已經於2018.11.18解決
以上錯誤的一個緣由就在於把mmsize
錯寫爲mmSize
了,固然也有後面的參數問題
以下:將mmsize的值修改如下便可
size
指的是屏幕分辨率(480x270)
mmsize
指的是屏幕物理尺寸(95x53),但經測試mmsize
的值爲圖中所示時,字體才顯示比較正常,這個緣由暫時未知,留個坑...
修復這個問題所參考的資料爲:
http://blog.chinaunix.net/uid-26993600-id-4568302.html
http://doc.qt.io/qt-5/embedded-linux.html
效果圖以下:
Step 3 生成可在JZ2440上面執行的程序
執行過qmake
和build
(錘子)後就能生成了:
Step 4 測試驗證
先把上述可執行文件hellojz24401
複製到nfs
服務文件夾下面(圖片沒有截全):
在開發板上掛載nfs服務文件:
開發板中的/mnt/
文件夾下的nfs
文件夾提早創建好
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.1.120:/home/china/work/nfsroot /mnt/nfs/
直接在掛載的nfs
文件夾下執行便可
LCD顯示信息爲,雖然醜,可是能顯示啊,哈哈
搞定!
在測試過程時會出現如下錯誤,雖然在我板子在不影響程序跑通,但爲了不之後的錯誤,如今解決一下:
根據參考資料1文章可知缺乏libiconv
下載解壓後:
--host
編譯爲目標格式文件
--prefix
編譯安裝目標目錄
CC
編譯器中arm-none-linux-gnueabi-gcc
路徑
LDFLAGS
編譯器中/sys-root/lib
路徑
cd libiconv-1.14/ ./configure --host=arm-none-linux-gnueabi --prefix=/home/china/work/jz2440/qt/libiconv CC=/usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi-gcc LDFLAGS="-L/usr/local/arm/gcc-4.4.3/bin/arm-none-linux-gnueabi/sys-root/lib" --enable-static make make install
而後把安裝目錄下的preloadable_libiconv.so
文件複製到文件系統的/usr/lib/
文件下,在/etc/profile
中添加
export LD_PRELOAD=/usr/lib/preloadable_libiconv.so:$TSLIB_ROOT/lib/libts.so
重啓開發板再次運行就沒事了。
維護日期 | 維護內容 |
---|---|
2018.11.18 | 修復Qt程序字體在JZ2440上的顯示問題 |
參考資料: