jz2440裸板移植內核驅動,實現uvc攝像頭驅動中經驗總結

0:移植最重要的概念是參考,參考內核中已經成熟 的代碼。

0.0 將沒有的宏去掉或者換成新內核中定義的宏

0.1 將沒有的頭文件去掉。更加錯誤信息添加新的頭文件路徑

0.2 將沒有的函數去掉或者換成內核新定義的函數

1 uboot的燒寫

注意事項:jlink 不能燒寫nandflash,   pc機是ping不通uboot的,只能從uboot ping主機

移植linux3.2.0到jz2440

1.1  內核配置s3c2410_defconfig  生成uImage 串口出現亂碼。。。 開發板的時鐘配置不整錯

需要修改的地方:時鐘爲12000000 和mtd 分區

1.2 不支持dm9000網卡,內核中已經有dm9000的驅動。只是smdk2440的板級文件中爲添加platform平臺信息

2 nand  命令讀寫錯誤nand_write_ecc: Attempt to write not page aligned data

原因 nand讀寫需要頁對齊...可以加上nand write.jffs2  則不不要頁對齊了

nand write.yaffs則燒寫不講ecc校驗碼寫入nand的oob,因爲yaffs文件系統自己包含ecc校驗碼

3內核讀取Verifying Checksum ... Bad Data CRC  原因內核的實際大小 大於你的分區大小、重新設置內核分區arch/arm/plat-s3c24xx/common_sdk.c中修改

4 uboot中的環境變量 有默認的 也有從nandflash中讀取,初始化時候使用config/100ask2440.h中配置的環境變量,具體環境變量存在哪裏,從哪裏讀取到內存,則根據

一下幾個配置選項

//#define CFG_ENV_IS_IN_FLASH1
#define CFG_ENV_IS_IN_NAND  1
#define CFG_ENV_OFFSET      0x40000
#define CFG_ENV_SIZE 0x20000/* Total Size of Environment

5 根文件系統存放的位置 則根據內核mtd分區的設置 進行讀取 rootfs=/dev/mtdblock3   就會根據commom_smdk24xx中的mtd_partion結構體重定義

6.掛載根文件系統出現Kernel panic - not syncing: Attempted to kill init!。原因是用了gnueabi的接口編譯文件系統,所以內核也得選上

選上還是出現錯誤,用readelf查看 vmlinux  busybox ..原來編譯鏈的架構出現錯誤。。。具體參考http://buildroot-busybox.2317881.n4.nabble.com/Kernel-panic-not-syncing-Attempted-to-kill-init-td21689.html

7.其他板子上可以執行的程序,用在自己製作的文件系統出現錯誤 line 1: syntax error: unexpected word (expecting ")")。。這種語法錯誤,是因爲使用的交叉工具鏈不相同。。因爲自己製作的文件系統中庫文件 可能不包含某些頭文件。

8.lcd驅動移植中遇到的錯誤與解決方法

8.1    'l' has incomplete type 問題原因結構體重包含有未定義的類型

8.2    two or more data types in declaration specifiers 定義結構體時末尾未加分號

8.3  Starting kernel ...


Uncompressing Linux... done, booting the kernel.後系統停止啓動

原因 1 機器id不匹配

         2  控制檯初試化失敗

         3  最容易忽視的 是  自己驅動的問題,,出現了 segent faut  段錯誤oop,內核停止在初始化控制檯之前,所以很多信息未打印出來

         解決:寫出模塊  加載,根據oob信息找到pc終止的地址,,用objdum 反彙編後找到錯誤代碼,,本次失敗原因是linux3.2內核宏定義的bug

      #define S3C2410_LCDREG(x) (x),而2,.26內核中定義爲#define S3C2410_LCDREG(x) ((x) + S3C24XX_VA_LCD)

9 lcd驅動的移植。

9.1  lcd不顯示 原因背光燈沒有打開。可以在驅動中設置管腳將背光打開

9.2 lcd圖像顯示錯誤 初始化參數 有問題     本次移植的問題是將3.5的參數用在了4.3的屏幕上 。尷尬

9.3 1 / vclk = pixclk / 10^12

10 tslib的移植

selected device is not a touchscreen I understand
 因爲內核的輸入系統版本和tslib的input輸入系統 不一致。。。

修改交叉工具鏈的頭文件中的EV_VERSION

11

到目前爲止,我們已經花了好多篇幅在LCD上,但還有一個問題,那就是LCD在開機10分鐘後會自動關閉。

 

在Vt.c文件(drivers/tty/vt目錄下)的第179行,定義了blankinterval變量:

static int blankinterval = 10*60;

 

通過改變blankinterval的值,可以修改LCD關閉的時間,如果我們不想讓LCD關閉,則只要把該變量設置爲零即可。

11 qt移植中遇到的問題

使用的版本是qt4.8.5...

11.1配置中出現

The specified system/compiler is not supported
用export看下自己的環境變量 可能被污染了。。

11.2tslib的路徑不識別,no such file or directly  原因可能是配置命令中有回車

 11.3    

The tslib functionality test failed!

 

  原因有二。一 在如下路徑中修改用哪個版本的交叉編譯器。
# Vim qt-everywhere-opensource-src-4.8.5/mkspecs/qws/linux-arm-g++/qmake.conf    

二 你可以去到config.test/unix/tslib目錄下,查看一下里面的Makefile文件,看看裏面的關於tslib的路徑是不是你自己的安裝路徑。如果不是,直接在這裏更改即可,然後在回到qtarm-build目錄。重新配置,即可通過。

   

錯誤:qtconcurrentiteratekernel.cpp:(.text+0x3c): undefined reference to `clock_gettime'

修改:vim src/corelib/Makefile 加上-lrt

LIBS          = $(SUBLIBS)  -L/opt/qt-everywhere-opensource-src-4.8.4/lib -lpthread -lm -ldl -lrt

12 QWSSocket::connectToLocalFile could not connect:: No such file or directory

因爲qt程序需要一個服務程序。所以需要加上-qws將當前的qt程序作爲qt服務程序

13

設置環境變量的語句貌似只有添加在etc/profile文件的後面,系統啓動後才能生效,而單獨把它們保存到一 個shell腳本(可執行),然後丟到bin目錄下,並且在etc/init.d/rcS文件中也添加了執行該腳本的語句,奇怪的是這樣做系統啓動後環境 變量並沒有成功設置,這是我遇到的一個說小不小說大不大的問題(因爲這個問題折騰了不少時間)。

解決:這個環境變量只在子shell中有效,所以需要把需要執行的程序也放在這個shell腳本中,就可以了

ps:我現在大概明白爲什麼了,估計是子shell中設置的環境變量影響不到父shell。需要用source命令來執行腳本。環境變量就保存在當前shell中了。

14 qt編程總結

在Qt中如何調用外部程序呢? 最近遇到這個問題,解決方法如下:
用QProcess類解決這個問題:
如執行a.exe, 帶兩個參數爲 -z20,-q85
第一種方法:使用QProcess類靜態函數QProcess::startDetached(const QString &program, constQStringList &argument)或者QProcess::execute(const QString &program, const QStringList &argument);
startDetached 函數不會阻止進程, execute會阻止,即等到這個外部程序運行結束才繼續執行本進程。
QStringList  list;
list<<"-q85"<<"-q85";
QProcess::startDetached("a.exe",list); 或 QProcess::execute("a.exe",list);
注意:由於使用execute會阻止進程,所以界面的刷新 會等到外部程序執行結束!!

14.2 

 改變Qt中QLineEdit中顯示內容的大小:

        QLineEdit *lineEdit = new QLineEdit();

        lineEdit->setStyleSheet("font-size : 16px");

        也可以在主函數中添加語句:

         qApp->setStyleSheet("QLineEdit { font: 16px; });


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章