日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當前位置:首頁 > 嵌入式 > 嵌入式大雜燴
[導讀]關注「嵌入式大雜燴」,選擇「星標公眾號」一起進步!01修改與編譯內核前面小哥主要是跟大家講解了uboot的燒錄、使用等等,而對于嵌入式Linux環(huán)境而言其實主要是分為三大塊:uboot,LinuxKernel(內核),文件系統(tǒng),當然高版本的內核存在設備樹文件等等,不過感覺還不足以...

關注「嵌入式大雜燴」,選擇「星標公眾號」一起進步!


01

修改與編譯內核

前面小哥主要是跟大家講解了uboot的燒錄、使用等等,而對于嵌入式Linux環(huán)境而言其實主要是分為三大塊 : uboot,Linux Kernel(內核),文件系統(tǒng),當然高版本的內核存在設備樹文件等等,不過感覺還不足以認為是一大塊,只能說是驅動的一部分。那么本文就主要是通過uboot把Linux系統(tǒng)運行起來,而掛載根文件系統(tǒng)并進入終端命令行估計得到下一篇文章了。如果大家手上有已經移植或制作OK的Linux內核image和文件系統(tǒng),只需要將他們燒錄到板子上的對應存儲位置上,然后設置uboot中的一些啟動參數(shù)即可完成整個Linux系統(tǒng)的啟動。然而每塊開發(fā)板的外設總會存在或多或少的差異,這樣就需要開發(fā)人員修改相應的與硬件交互的代碼(Linux驅動),或者調整各部分在內存分布的大小與地址等,以適應新的硬件平臺,這個過程就叫做移植。看起來移植很高大上,相對Linux內核這么龐大的代碼而言還是小部分,畢竟Linux系統(tǒng)在開發(fā)過程中都會考慮與硬件相關部分進行的分離,并且大部分開發(fā)板都會參考官方發(fā)布的單板來進行布局。好了,那么小哥就大致講解一下這個過程。02

移植與燒錄內核

這里使用的是百問網科技超級老的jz2440開發(fā)板,他們提供了對應內核版本的適配其開發(fā)板的移植補丁,也就是說在Linux-3.4.2原始的內核源碼上通過提供的補丁包自動化的進行代碼的修改以適應當前開發(fā)板,從單片機的角度看來就是修改一些引腳,配置驅動等等。然而小哥手頭板子的NandFlash上存在壞塊,uboot,內核、文件系統(tǒng)等都會燒錄到NandFlash上,你可以認為就是單片機的Flash,不過單片機的Flash大部分為NorFlash,而由于存在壞塊所以對相關的分區(qū)進行調整,否則壞塊會導致相應的燒錄文件不完整而啟動失敗。由于后面打算移植QT,而之前拿到的補丁包沒有移植好觸摸驅動和網卡驅動,即使打了之前拿到的補丁還需要繼續(xù)進行相關代碼上的移植,那慢慢來,先把一些適配的補丁打上:1tar?jxvf?linux-3.4.2.tar.bz2
2cd?linux-3.4.2/
3patch?-p1?<../linux-3.4.2_100ask.patch

Linux-3.4.2_100ask.patch就是百問網提供的補丁包,所謂的補丁包不是什么高級東西,就是通過patch命令根據(jù).patch文件的修改描述,直接添加和修改內核中文件的內容,與我們手動修改本質上是一樣的。

不過它把所有的差異都整理成了一個文件,實現(xiàn)了一種一鍵修改源文件工程的目的,因為內核源碼官方都可以獲取,而我們只需要一個補丁包就可以通過打補丁把官方源碼改成適配自己單板的源碼,美滋滋~

03

內核分區(qū)修改

前面uboot也存在這樣的一個默認分區(qū)表kernel部分分了36M,同樣內核中的默認分區(qū)表中的內核區(qū)域也分配了36M。


很多人該問了為什么有兩個默認的分區(qū)表?

前面小哥講解了存儲地址與運行地址,Linux內核中的相關操作都是基于Linux內核中的分區(qū)表,比如uboot向Linux內核的傳參中:

就是告訴內核加載文件系統(tǒng)需要在MTD的第三個區(qū)分進行加載,那么uboot在進行文件系統(tǒng)燒錄的時候就需要把燒錄文件放到第三個分區(qū)地址區(qū)域,且與內核中的分區(qū)地址一致,不然Linux內核掛載文件失敗。其實對于uboot中的分區(qū),僅僅只是為了部署Linux環(huán)境而設置的,一旦啟動內核了uboot的生命周期就結束了,比如之前我們在uboot中使用nand write 源地址 目的地址 長度,我們也可以直接簡化為對對應分區(qū)的操作:nand write 0x30000000 kernel。從上圖中uboot的環(huán)境變量bootcmd中使用的kernel,也是類似的使用方法。那為什么要把Linux內核分區(qū)設置36M呢?其實我當前編譯的Linux內核映像也才幾M的大小,主要是Linux內核中這種分區(qū)方式是連續(xù)的,前一個區(qū)的結束地址是后一個分區(qū)的起始地址,然而經過小哥測試,剛好文件系統(tǒng)分區(qū)前面一部分NandFlash存在壞塊,這樣會導致文件系統(tǒng)不完整,后期掛載會失敗,所以這樣通過加載內核分區(qū)以使得文件系統(tǒng)分區(qū)地址后移的方式來規(guī)避掉這些壞塊,同時對于內核部分由于其燒錄文件不大,有效文件不會燒錄到壞塊部分,算是一個捷徑。03

網卡驅動修改

uboot雖然可以進行TFTP網絡服務,但是并不意味著Linux內核也可以正常使用,他們兩個驅動是分開的,一旦uboot成功啟動內核以后uboot的生命周期就結束了。Linux內核也必須擁有正確的網卡驅動才能夠使用相應的網絡服務,其實這跟我們windows系統(tǒng)是一樣的,當我們電腦沒有相應的驅動,相應的硬件也是無法使用的,比如最好用的網絡文件系統(tǒng)NFS。

由于我們使用的是dm9000網卡,且mini2440單板已經得到很好的支持,所以我們參考直接移植過來即可,主要是填充相應的平臺設備結構體以描述dm9000網卡資源并注冊與驅動匹配。

首先要包含dm9000網卡的頭文件,以便使用到其頭文件中的宏定義或者數(shù)據(jù),然后使用resource結構體描述dm9000網卡的一些資源,包括IO資源和中斷資源,并且使用平臺設備platformdevice來描述dm9000網卡,以便后續(xù)總線上device與driver匹配在,這樣也就實現(xiàn)了設備與驅動的分離。

最后把平臺設備作為smdk2440眾多設備初始化中的一員加入到initdata中,以便系統(tǒng)啟動的時候便加載設備和匹配驅動。

有了以上移植,基本上單板的網卡驅動就搞定了,相應的網絡相關的服務就可以使用了,不像單片機那樣你還要直接移植相應的網絡協(xié)議棧等等,一旦搞定了驅動,基本上跟windows系統(tǒng)上面開發(fā)應用程序大同小異~

04

LCD驅動程序修改

對于LCD的支持其實與前面網卡驅動修改其實是類似的,還是采用Linux設備與驅動分開的思想,基本上驅動部分不用太多修改,僅僅只需要把驅動部分根據(jù)Linux提供的框架進行相應的描述填充即可,說得直白一點就是填充再賦值結構體,你可以認為這些都是固定的套路吧~這里小哥使用的是4.3寸的屏幕,所以進行如下填充與配置:

同樣因為2440是自帶LCD控制器的,唯一要做的就是把LCD控制這塊以及LCD屏幕的屬性描述清楚,如上面各個結構體設置所選擇LCD的相關屬性,比如尺寸,刷新時序等等,最后把整個結構體填充好并注冊。同時記得確認一下menconfig里面是否已經選擇了LCD_FB,并選擇編譯到Linux內核,執(zhí)行命令:
1make?menuconfig?CROSS_COMPILE=/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-?ARCH=arm?-j8

1Device?Drivers??--->?
2??Graphics?support??--->?
3????Support?for?frame?buffer?devices??--->?
4??????S3C2410?LCD?framebuffer?support??

配置好以后,記得save到對應的.config即可,這樣編譯前的配置才能夠生效。

05

觸摸驅動編譯與移植

玩單片機的小伙伴都知道電阻觸摸屏,就是通過獲得屏幕橫縱的AD采樣值最終來定位屏幕上的位置,而S3C2440也是存在觸摸屏的外設接口的,我們通過配置觸摸屏外設接口,即可驅動觸摸屏獲得相應的ADC值最終定位到屏幕上所點擊的位置。

在Linux中對于鼠標、觸摸等等都屬于輸入設備,所以這類驅動都可以歸為輸入子系統(tǒng)input,那么我們只需要注冊一個輸入子系統(tǒng)即完成了觸摸屏驅動。

觸摸驅動程序主要分為這樣幾步,首先獲得一個輸入設備結構體,然后根據(jù)觸摸的特性進行相關的事件的配置,因為輸入系統(tǒng)都是以事件的方式上報給系統(tǒng),不同的事件當然配置也就不同,配置好了以后就把輸入設備結構體注冊到系統(tǒng),以便設備識別。而當所配置的事件一旦條件觸發(fā),就會把觸發(fā)信號和數(shù)據(jù)通過input_report上報給系統(tǒng),供系統(tǒng)使用,所以單片機你想做得通用化,也可以直接這么玩,不過考慮到單片機的簡潔,還是慎重考慮~雖然我們可以直接把該驅動程序編譯成.ko驅動程序,可是這樣需要每次內核啟動完成以后就需要重新加載驅動,有點麻煩,所以考慮把它編譯到Linux內核中。要把驅動程序添加到內核需要做三件事:1)添加源碼到相應目錄;2)在相應的Kconfig文件中增加編譯選項;3)在makefile中增加相應的編譯項。前面我們大致編寫了源碼并且放到了相應的目錄,這里就只需要完成后面的兩項,這兩項可能相應的語法規(guī)則剛開始并不是很熟,不過可以查閱相應的知識補充,也可以直接照著其他touch驅動類似編寫即可。
比如s3c2410的Kconfig如下編寫:于是我們可以模仿著把S3C2440類似的添加到后面:


第二步完成,接下來在當前目錄的Makefile添加編譯項目:


照著S3C2410的來即可。雖然我們完成上面的三步,但只是完成了能夠提供選擇的是否編譯進內核的驅動選項,在menuconfig菜單中你可以看到,而到底最終是否編譯到內核,還需要在menconfig菜單中進行配置選擇并保存到config中。1Device?Drivers??--->?
2??Input?device?support??--->??
3????Touchscreens??--->

至此,觸摸的驅動就編寫并添加到了內核中。06

內核的編譯與燒錄

一切準備就緒,那就是編譯內核了,編譯內核的目的就是為了獲得Linux kernel映像文件,最終燒錄到板子上的內容。如下是我使用的編譯命令,由于沒有把相應的路徑放到環(huán)境變量,所以這里就制定了編譯器路徑,比較長。1make?uImage?CROSS_COMPILE=/home/book/WorkSpace/Qt/src/arm-linux-gcc-4.4.3/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-?ARCH=arm?-j8

如果編譯過程中遇到什么不理解的error,基本上都是根據(jù)所報錯誤的提示,進行網絡查找,一般都可以得到解決,因為大家都遇到過~最后順利編譯內核成功,如下是編譯結果:以上的輸出信息,我們也可以了解到想要的uImage所在路徑,以及文件的大小,類型和入口地址等。


我們借助uboot直接通過TFTP服務把uImage先下載到SDRAM中,然后在使用NandFlash命令燒錄到Flash中對應的分區(qū)即可。其實燒錄過程在往期的uboot中已經說得很詳細了,這里主要提兩點:1)由于uboot是一個單任務的裸機程序,所以連接好網線以后,你的電腦網絡狀態(tài)還是沒有連接的,所以需要uboot主動發(fā)起網絡,電腦端就會有網絡鏈接狀態(tài)顯示了。


2)在進行網絡通信過程中,要記得關掉電腦主機的防火墻,以便鏈接失敗。我們使用TFTP服務,需要設置好服務器IP,也就是我們的電腦主機IP地址,然后通過TFTP命令獲得相應的內核文件,實驗結果如下:
這樣我們就把uimage下載到了SDRAM的0x30000000的位置,接下來我們需要把他燒錄到對應的NandFlash的Kernel分區(qū)上,使用如下命令:

1nand?erase.part?kernel
2nand?write?0x30000000?kernel

重新啟動開發(fā)板,即可看到成功啟動了內核:但是最終由于我們還沒有為Linux系統(tǒng)構建文件系統(tǒng),系統(tǒng)啟動還需要一些必備的啟動文件和工具,最終會報錯。



不過我們今天的目標達到,Linux內核得到了啟動,并且移植好了我們想要的一些驅動。

最? 后?


這里小哥就介紹了一下Linux內核的移植、燒錄、相關驅動的相關知識,希望本文能夠對你有幫助,下期帶來文件系統(tǒng)的構建過程~

往期干貨:

往期推薦



嵌入式項目生成器,了解一下!

一個清晰的LCD驅動編寫思路(附代碼分析)

RT-Thread和Freertos的區(qū)別?

程序如何運行?編譯、鏈接、裝入?


本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: 驅動電源

在工業(yè)自動化蓬勃發(fā)展的當下,工業(yè)電機作為核心動力設備,其驅動電源的性能直接關系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護是驅動電源設計中至關重要的兩個環(huán)節(jié),集成化方案的設計成為提升電機驅動性能的關鍵。

關鍵字: 工業(yè)電機 驅動電源

LED 驅動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設備的使用壽命。然而,在實際應用中,LED 驅動電源易損壞的問題卻十分常見,不僅增加了維護成本,還影響了用戶體驗。要解決這一問題,需從設計、生...

關鍵字: 驅動電源 照明系統(tǒng) 散熱

根據(jù)LED驅動電源的公式,電感內電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關鍵字: LED 設計 驅動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產業(yè)的重要發(fā)展方向。電動汽車的核心技術之一是電機驅動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機驅動系統(tǒng)中的關鍵元件,其性能直接影響到電動汽車的動力性能和...

關鍵字: 電動汽車 新能源 驅動電源

在現(xiàn)代城市建設中,街道及停車場照明作為基礎設施的重要組成部分,其質量和效率直接關系到城市的公共安全、居民生活質量和能源利用效率。隨著科技的進步,高亮度白光發(fā)光二極管(LED)因其獨特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關鍵字: 發(fā)光二極管 驅動電源 LED

LED通用照明設計工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關鍵字: LED 驅動電源 功率因數(shù)校正

在LED照明技術日益普及的今天,LED驅動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關鍵字: LED照明技術 電磁干擾 驅動電源

開關電源具有效率高的特性,而且開關電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機重量也有所下降,所以,現(xiàn)在的LED驅動電源

關鍵字: LED 驅動電源 開關電源

LED驅動電源是把電源供應轉換為特定的電壓電流以驅動LED發(fā)光的電壓轉換器,通常情況下:LED驅動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關鍵字: LED 隧道燈 驅動電源
關閉