JZ2440(V3)移植QT5.6--圖文教程

本文嚴禁轉載

本文地址:http://www.javashuo.com/article/p-nbddphui-e.html

文章信息

撰寫日期 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.patchhtml

1.編譯u-boot

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

  1. 指定的編譯器絕對路徑錯誤
  2. 你的Linux系統爲64位的,編譯器爲32位的,參考這裏:https://blog.csdn.net/multimicro/article/details/82665972
  3. 未完待定

2.編譯內核

2.1 按照韋東山的補丁文件進行編譯第一個版本的uImage

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


2.2 內核增長網卡(網絡)功能

至此上面的內核掛載啓動文件系統後,是不支持網卡的,也就是沒法使用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/

在這裏插入圖片描述
***

2.3 增長支持4.3寸LCD

arch/arm/mach-s3c24xx/文件夾中,修改裏面的mach-smdk2440.c文件內容,修改內容就不粘貼了,我把這個改後的文件鏈接粘貼出來直接下載使用便可,文件見上述百度雲盤資料
編譯內核從新燒錄後以下圖:
4.3LCD支持搞定,啓動此內核時,JZ2440V3的4.3寸LCD會顯示一個閃爍光標在這裏插入圖片描述

2.4 增長觸摸屏功能


首先引用宋寶華《linux設備驅動開發詳解》中P66的一段話
在linux內核中增長程序須要完成如下3項工做。

  • 將編寫的源代碼複製到linux內核源代碼的相應目錄中。
  • 在目錄的Kconfig文件中增長關於新源代碼對應項目的編譯配置選項。
  • 在目錄的Makefile文件中增長對新源代碼的編譯條目。

2.4.1 完善觸摸屏相關信息

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的配置文件撰寫
在這裏插入圖片描述

2.4.2 進入menuconfig中開啓s3c2440的觸屏支持

下面進入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: ...內核打印信息,文件系統中(移植見下面)也不會自動出現以下圖的event0mouse0兩個事件,本身建立的話若是很差使,根本緣由在於觸屏驅動沒有驅動上! 驅動上了,本身用mknod命令建立節點也是能夠的。不然就會出現:error: No such file or directory這樣的信息,記住了哦!

以前不知道是因爲觸屏驅動沒驅動上,一直在那裏傻乎乎的google,直到看到這篇文章後才意識到應該是觸屏驅動沒驅,WTF!驅動上以後果真,解決了。

這個觸屏驅動的正常驅動,是後續使用觸屏的前提!--這好像是句廢話
在這裏插入圖片描述

3. 燒寫u-boot

在windows下經過openJTAG下載吧,或者進Nor-Flash中用老版本的u-boot下載,這個就須要藉助DNW工具了
啓動新加載的u-boot
在這裏插入圖片描述

經過mtdparts命令能夠看出通過u-boot劃分後的flash分區,其中kernel已經爲修改後的4M大小

4. 燒寫kernel

4.1 tftp和nand flash命令簡介


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


4.2 用tftp命令燒寫kernel

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分區內核
在這裏插入圖片描述

5.製做busybox

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

6.製做tslib(touch screen lib)

6.1 首先安裝

sudo apt-get install autoconf automake libtool

6.2 而後檢測 EV_VERSION

檢測編譯器裏面的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解決,自學能力也是很重要的一種能力哦。

7. 製做並燒寫yaffs2文件系統

7.1 製做yaffs2文件系統

7.1.2 準備mkyaffs2image工具

1) 首先須要yaffs2製做工具mkyaffs2image此文件在韋東山提供的JZ2440配套光盤A盤裏面的tools文件夾下有
在這裏插入圖片描述
2) 或者來到B盤這裏
在這裏插入圖片描述
在此文件夾路徑下終端make一下,也能出來這個工具
在這裏插入圖片描述
Tips: 執行make clean生成的文件就消失了

把這個mkyaffs2image工具複製到/usr/local/bin/目錄下,這樣就能夠直接在終端中使用此工具了

sudo cp mkyaffs2image /usr/local/bin/

7.1.2 用mkyaffs2image 製做後綴爲.yaffs2的文件系統

找到製做好的busybox文件夾,這個文件夾是本文第5步下的busybox安裝位置
在這裏插入圖片描述
在這裏插入圖片描述

7.2 燒寫文件系統yaffs2

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]便可,效果圖以下:
在這裏插入圖片描述

8. 編譯Embeded Qt5.6

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文章下面有糾正。

9 編譯Embeded Qt5.6 應用程序

9.1 配置桌面版Qt Creator

在這裏插入圖片描述
步驟以下
Step 1
Tips:
C++ 對應 arm-none-linux-gnueabi-g++
C 對應 arm-none-linux-gnueabi-gcc
在這裏插入圖片描述
** Step 2
單擊Add選擇編譯後的Qt中的qmake文件
在這裏插入圖片描述
Step 3 **
在這裏插入圖片描述

9.2 創建Qt界面程序

Step 1
在正常流程創建工程時,在選擇編譯器時,選擇本身配置的,其他正常流程。
在這裏插入圖片描述
Step 2
建好工程後

  1. run qmake
    在這裏插入圖片描述
  2. build就是那個錘子logo
    在這裏插入圖片描述
    解決辦法:僅能保證沒有error,編譯後的應用程序能夠正常執行
    在這裏插入圖片描述
    下面是我設計的UI ,用於測試,字體過大,但顯示起來正常,緣由暫時不作考慮,如今就是測試!

在這裏插入圖片描述
字體問題已經於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上面執行的程序
執行過qmakebuild(錘子)後就能生成了:
在這裏插入圖片描述
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上的顯示問題

參考資料:

  1. 移植QT5.6到嵌入式開發板(史上最詳細的QT移植教程)
  2. 移植QT5.6到韋東山JZ2240嵌入式開發板(史上最最最最最詳細的QT移植教程)
  3. Linux編譯移植Qt5的環境_OMAPL138平臺
  4. linux input 子系統分析 一
  5. 在Linux系統下經過TFTP或NFS燒寫內核
  6. Ubuntu16.04NFS配置與ARM開發板互傳文件_掛載和卸載
  7. Ubuntu16.04NFS配置與ARM開發板互傳文件_掛載和卸載
  8. 爲何在ARM板上qt字體會變小?
  9. Qt for Embedded Linux
相關文章
相關標籤/搜索