compile module with freescale LTIB

上面已經對ltib編譯流程及主要操作做了大致描述,下面分別描述內核修改配置以文件系統添加應用程序和腳本在需要修改內核配置,比如爲內核添加編譯新的模塊功能時,該如何完成,下面以將支持8021Q VLAN協議的模塊編譯進我們需要的內核中爲例來演示:
##首先按照前面所說的簡單快捷的方式,執行命令:
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs
        ## defconfig-min-fs是安裝ltib後的自帶文件,並沒做修改。
        ## 在彈出的對話框中,通過上下鍵移動光標到 Choose your Kernel / kernel (Dont build the Linux kernel) 回車進入內核選擇對話框,移動光標按空格鍵選中我們需要的內核 (X) linux 2.6.13.4,內核配置文件暫不修改,使用默認的。
        ## 爲了能添加我們需要的8021Q支持模塊,需要修改內核的配置,移動光標按空格鍵選中 [*] Configure the kernel,這樣在編譯時可以修改其配置。
         ## 移動光標到Save Configuration to an Alternate File,回車輸入我們想將目前配置保存的文件名爲defconfig-min-fs-modified任何回車。
        ## 左右移動光標到最下面的Exit,彈出對話框詢問是否保存配置文件,選擇'Yes'
## ltib開始根據配置進行工作。
## 很快又會彈出新的對話框 Linux Kernel Configuration
## 下面需要修改內核配置,添加8021Q
        ## 移動光標選中 Networking ---> 回車彈出新的對話框,移動光標到 [*] Networking support 下面一行 Networking options ---> 然後回車,又彈出對話框,向下移動光標,按空格兩次選中<*> 802.1Q VLAN Support 將其編譯進我們需要的內核中。
        ## 然後按兩次ESC回到Linux Kernel Configuration的主界面
        ## 移動光標選中 Save Configuration to an Alternate File 回車輸入當前配置的保存名字 nas_linux-2.6.13.4-mpc8349itx.config-modified
        ## 左右移動光標選中最下面的Exit,彈出對話框詢問是否保存配置文件,選中'Yes'
## ltib調用當前的配置信息編譯內核。
當我們寫好了開發板上的應用程序,並且已經做好了各種測試,需要燒寫到板子,達到上電時應用程序已經在板子上了,甚至是可以開機自動運行,該如何操作呢,下面講述如何向開發板添加應用程序及需要的腳本。以添加VLAN配置模塊vlan.ko和添加VLAN編號並配置ip的腳本vlan_config.sh:
## 首先需要明白config/platform/mpc8349itx/merge/下面的各種文件就是通過編譯後成爲開發板文件系統的一部分,並且此文件夾下的文件就相當於位於開發板的根目錄下。
## 在文件夾config/platform/mpc8349itx/merge/創建一個文件夾ourpro,再將我們之前編譯的VLAN配置模塊vlan.ko以及腳本vlan_config.sh添加到剛纔創建的文件夾config/platform/mpc8349itx/merge/ourpro/下(用命令爲mkdir,cp)
## 在config/platform/mpc8349itx/merge/etc/rc.d/rcS最後添加如下幾句(可用命令vi完成)       
        +++++++++++下面爲添加內容++++++++++++++        if [ $mode = "start" ]         then
            if [ -x /ourpro/vlan_config.sh ]
            then
                /ourpro/vlan_config.sh
            fi         fi
        +++++++++++上面爲添加內容++++++++++++++
        ## 附:vlan_config.sh腳本內容
        ++++++++++++下面爲vlan_config.sh腳本內容++++++++++++++++
        #!/bin/sh
        # This script is used to add vlan configuration module
        # and config eth1 with vlan-id and the relevant ip.
        # date: Wed Aug 6 17:00:18 CST 2008
        echo "Now start to config vlan ,please have patience. ^_^ "
        echo "boot eth1 now"
        ifconfig eth1 up
        sleep 3        echo "insmod /ourpro/vlan.ko "
        if [ -f /ourpro/vlan.ko ]
            then
                insmod /ourpro/vlan.ko
                rmmod /ourpro/vlan.ko
                usleep 100000
                echo "Config vlan-name(1:6) ipaddr & netmask"
                for x in 1 2 3 4 5 6
                do
                    vconfig add eth1 $x
                    ifconfig eth1.$x 192.168.$x.1 netmask 255.255.255.0 up
                    echo eth1.$x 192.168.$x.1 netmask 255.255.255.0 up
                done
                echo "DONE. You can test vlan now. ^_^"
                exit 0
        fi
        echo "Not found /ourpro/vlan.ko"
        exit 0
        ++++++++++++上面爲vlan_config.sh腳本內容++++++++++++++++
        ## 在以上操作中要注意權限的設置
## 要添加的文件和腳本,以及配置做好,可以編譯文件系統了,我們可以使用上面編譯內核所生成的配置defconfig-min-fs-modified
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs-modified
        ## 首先彈出對話框 LTIB: Freescale MPC8349E-mITX board
        ## 若不希望再編譯內核,移動光標到--- Choose your Kernel下面一行 kernel (linux 2.6.13.4) --->,按空格進入,彈出一個新的內核選擇對話框kernel,移動光標並按空格選中 (X) Dont build the Linux kernel 。若希望編譯內核,則跳過此步。
        ## 此次操作我們選擇編譯內核,但不再編譯時配置內核。
        ## 編譯時不再配置內核選項,移動光標按空格去除選項 [ ] Configure the kernel。
        ## 移動光標到(nas_linux-2.6.13.4-mpc8349itx.config) kernel config file回車,輸入我們的內核配置文件nas_linux-2.6.13.4-mpc8349itx.config.dev,確定返回到主對話框
        ## 移動光標到 Save Configuration to an Alternate File,輸入我們想保存爲的文件名defconfig-min-fs-our-final
        ## 左右移動光標到< Exit >回車,然後會彈出是否保存新的配置文件,直接選擇 < Yes > 回車
        ## 然後開始編譯內核和文件系統
## 編譯結束。
        ## 注:上面編譯出的內核已經添加了8021Q內核模塊,文件系統裏也包含vlan.ko和vlan_config.sh,燒進開發板上電會自動執行vlan_config.sh實現添加vlan編號及配置ip信息。
        ## 文件夾rootfs/下的文件就相當於在開發板上看到的全部文件系統
        ## 我們需要的內核文件爲rootfs/boot/uImage,根文件系統文件爲rootfs.ext2.gz.uboot
假如上面編譯出來的內核文件和文件系統文件不小心刪除了,或者文件遭到了破壞,需要重新編譯,而且文件不需要變化的話,這裏有一個比較簡單的辦法,執行如下命令可一次完成滿足要求的內核和文件系統:
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs-our-final --batch
        ## 輸入完這些命令回車就開始編譯了,中間不需要任何操作,完全可以看會電影,或者學學vim...,大約半小時後就可以看到你希望的結果 :)
上面編譯出來的結果怎麼知道一定是對的呢,而且開發板的FLASH燒寫都有次數限制,一般情況下我們不能隨便燒寫內核或文件系統到FLASH中,下面一個方法可以解決這一問題。
## 下面的方法是完全針對8349itx開發板出廠後設置未做修改時來完成的。
## 假如開發主機的ip地址爲59.64.155.150,開發板的ip地址59.64.155.79,網關爲59.64.155.1
## 開發主機上提供了tftp服務(參見另寫的一篇筆記server.txt),其根目錄爲/home/liuby/tftpboot/
## 首先在tftp根目錄下創建一個存放內核文件和根文件系統的目錄down,並將剛纔編譯的結果複製到此文件夾下
$ mkdir -m 777 /home/liuby/tftpboot/down
$ cp rootfs/boot/uImage /home/liuby/tftpboot/down/
$ cp rootfs.ext2.gz.uboot /home/liuby/tftpboot/down/
## 此時開發主機上的工作已經完成了,下面介紹開發板上需要做的工作
## 開發板的uboot默認有3秒的延遲,來讓我們確定是否進入操作系統,在上電後uboot會給出一個提示:Hit any key to stop autoboot: 在這句後面的數字變爲0之前按一下鍵盤。
## 在上一步按下鍵盤後,終端上會出現uboot提示符 '=> '
=> getwayip=59.64.155.1
=> ipaddr=59.64.155.79
=> serverip=59.64.155.150
=> tftp_path=down
=> saveenv                ## 保存uboot環境變量,這樣保存是爲了方便以後不再設置其參量,可不保存
                        ## 一般不要修改uboot環境變量,可參看<<MPC8349ITX_set-uboot-env.txt>>
=> run tftpramboot        ## 下載內核和文件系統鏡像到DDR memory中,然後啓動
## 系統啓動後輸入user id "root",with password "root",可以用ifconfig查看配置已經生效。好玩吧 ?!
## 也可以用"dmesg | grep -i 802"來查看內核是否支持8021Q
經過各種測試,發現已經實現了所需要的功能,我們想把這樣的內核和文件鏡像固化到板子上,上面的辦法顯然不能滿足要求了,那有沒有一個簡單的辦法呢,答案是'有滴',只需要花幾分鐘時間就可以實現。LET'S START:
## 如上面介紹先把內核和文件系統鏡像複製到tftp目錄/home/liuby/tftpboot/down/下
## 下面的操作是在開發板啓動後進入uboot提示符下進行
=> setenv bootdelay 3                ## 啓動延遲3s
=> setenv loadaddr 200000        ## 下載到DDR內存中的起始地址
=> setenv kernaddr fe810000        ## flash中內核分配的起始地址
=> setenv ramdiskaddr fe9a0000        ## flash中文件系統分配的起始地址
=> setenv ipaddr 59.64.155.79
=> setenv netmask 255.255.255.0
=> setenv gatewayip 59.64.155.1
=> setenv serverip 59.64.155.150
=> setenv tftp_path=down        ## 相對根目錄的路徑
                                ## 以上操作都可以不做,保留下來只是想看看以前是多麼菜,時光啊
=> tftpboot $loadaddr $tftp_path/uImage                ## 下載內核鏡像到DDR memory中
=> erase $kernaddr feefffff                        ## 擦除flash中爲內核和文件系統分配的空間(起止地址之間)
=> cp.b $loadaddr $kernaddr $filesize                ## 寫內核到flash中,filesize變量通過tftpboot獲得
=> cmp.b $loadaddr $kernaddr $filesize                ## 確認是否寫錯誤
=> tftpboot $loadaddr $tftp_path/rootfs.ext2.gz.boot        ## 下載小文件系統到DDR memory中
=> cp.b $loadaddr $ramdiskaddr $filesize        ## 寫文件系統到flash中
=> cmp.b $loadaddr $ramdiskaddr $filesize        ## 確認是否寫錯誤
=> imls                        ## 確認寫到flash中的鏡像是否爲有效的u-bootable鏡像
=> boot                        ## 啓動
## 系統上電,發現就是我們想要實現的,再重啓發現仍然是,心裏默默地喊一個OH YEAH.
        ## 附一個常用的uboot命令吧:   help 或者 ?###### 附註:都快寫到吐了,與燒寫有關的不再寫了,請參看<<Readme.txt>>,此文不是一般的強大。
下面再寫一點ltib的常用命令參數吧,雖然覺得對其編譯內核和文件系統流程有了一定了解,但是對其命令參數用過的還不是很多,可以說是不甚瞭解,下面介紹一些,希望有用:
首先一個比較有用的命令參數就是help,一個人忘記命令參數很常見,何況剛開始熟悉這個工具。下面這個命令行可以查看ltib命令的使用幫助:
$ ./ltib --help                        ## 這個等同於 ./ltib -h
在編譯內核和文件系統時,有時忘了我們選了哪些程序包來進行編譯操作,我們可以用下面的命令來查看當前安裝模式下所有可用的程序包,是否被選擇編譯進工程 :
$ ./ltib -m listpkgs                ## 此命令是根據ltib的配置來顯示
查看配置中已選編譯的程序包,如內核版本包,系統工具包:
$ ./ltib -m listpkgs | grep ' y '
如果想看編譯過程產生的信息並把這些信息也保存,以備以後查看,可用以下命令
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs-our-final --batch 2>&1 | tee ltib_log.txt
## 保存編譯過程產生的信息及錯誤信息全部保存到ltib_log.txt文件中
ltib提供了一種shell模式,它直接提供了我們當前配置的交叉編譯工具鏈模式,下面的命令能讓我們進入ltib的shell環境
$ ./ltib -m shell        ## 完成後會給出提示,進入shell模式的提示符 'LTIB>'
                        ## 輸入exit可退出shell模式
## 下面的命令可以看一下這個有什麼用,我直接給出命令,它下面就是這個命令的結果,不再解釋
        LTIB> gcc --version
        powerpc-linux-uclibc-gcc (GCC) 3.4.3
        Copyright (C) 2004 Free Software Foundation, Inc.
        This is free software; see the source for copying conditions. There is NO
        warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
        LTIB>
有時候我們想看一下某些程序包的源碼,比如kernel、uboot等這些看了有益於身心健康的程序源碼,該怎麼辦呢? 還有一種情況就是這些源碼中存放有板子的各種配置文件,比如內存映射分配,也需要看一下源碼文件,其命令格式爲 $ ./ltib -m prep -p <program_package_name>
## 下面這部分我是在large文件夾下操作,所寫路徑也是相對於/usr/local/mpc8349/large/來寫的,而不是mytest文件夾下
## 例如我們要查看MPC8349ITX開發板上vsc7385的內存分配,或查找VSC7385的驅動模塊部分,需要看uboot、內核源碼,以下命令得到內核源碼
$ ./ltib -m prep -p kernel
## 解壓後的內核源碼位於rpm/BUILD/linux-2.6.13/
## 其中vsc7485的驅動是rpm/BUILD/linux-2.6.13/drivers/net/gianfar_phy.c
## 下面操作必須在原來的large文件夾下操作,爲什麼這麼做?自己思考吧。以下命令可以得到uboot源碼
$ ./ltib -m prep -p u-boot
## 解壓後得到的uboot源碼位於rpm/BUILD/u-boot-1.1.3
        ## 其中有關MPC8349MITX板子配置信息的重要文件爲/include/configs/MPC8349ITX.h
        ## 在上面的這個文件中可用看到VSC7385的內存分配基地址信息(#define CFG_VSC7385_BASE     0xF8000000)
        ## 不用uboot命令的話,可參看一下源碼幫助理解。
## 注:上面這段命令操作我之所以選擇在/usr/local/mpc8349/large文件夾下,是因爲要得到某些程序源碼,首先它得編譯過。
上面介紹了一個ltib編譯內核和文件系統比較好用的辦法,當你比較熟悉了ltib工作流程,完全可以自己配置交叉編譯工具鏈,內核和文件系統,然後編譯,可以用下面這個命令行
$ ./ltib --configure
如果想重新產生所有內核和RFS鏡像有以下三個辦法:
## 辦法一: 直接調用配置文件編譯,如果配置文件沒有更新,且編譯過的目標鏡像沒有變化,會不進行編譯。若有任何改動,會執行編譯
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs-our-final --batch
## 辦法二: 如辦法一一樣,但強制重新編譯
$ ./ltib --preconfig config/platform/mpc8349itx/defconfig-min-fs-our-final --batch -f
## 辦法三: 清除所有編譯的程序包,然後重新配置編譯鏡像
$ ./ltib -m distclean                ## 清除ltib工程文件
$ ./ltib --configure                ## 重新配置編譯
假如我們對ltib的配置文件不滿意,想自己通過配置操作來熟悉ltib的各種配置,或者相關工作做完了,甚至是看它不順眼,都可以採用此操作,把LTIB完全卸載,
## 首先執行命令:
$ ./ltib -m distclean                ## 此操作將徹底清除所有當前ltib工程文件
                                ## 此命令不要輕易使用,除非比較熟悉ltib編譯配置過程
## 然後以root身份執行以下操作(注意:此操作將卸載所有的公共文件)
# rm -rf /opt/freescale/pkgs
# rm -rf /opt/freescale/ltib
# rm <install_path>                ## 執行文件ltib的上級目錄
## 另一種更加暴力的辦法是root身份運行rm命令來刪除所有
下面再寫一下外部內核模塊的編譯,假如我們有一個文件夾test(位於主目錄/home/liuby/下),該文件夾包含程序源碼文件test.c和Makefile,這兩個文件的內容附在此段內容的最後。
## 首先我們得到內核源碼,然後再編譯,爲什麼這麼做,我也不懂~~~,有些納悶,以後再解決
$ ./ltib -m prep -p kernel
$ ./ltib -m scbuild -p kernel        ## 編譯的鏡像爲rpm/BUILD/linux/arch/ppc/boot/images/uImage
## 將test文件夾copy到內核的driver文件夾下
$ cp -a ~/test rpm/BUILD/linux/drivers/
## vi修改driver文件夾下的Makefile
$ vi rpm/BUILD/linux/drivers/Makefile
## 可以仿照Makefile裏的內容在最後添加如下一行
ojb-m               += test/                 ## 然後保存退出
## 修改test文件夾下的test.c和Makefile確保其正確無誤。
## 下面的命令是進入ltib的shell環境,然後進入到test目錄,然後編譯
$ ./ltib -m shell
LTIB> cd rpm/BUILD/linux/drivers/test/
LTIB> make V=1 ARCH=ppc

(LTIB> make ARCH=ppc is enough)
## rpm/BUILD/linux/drivers/test/test.ko就是我們想要的module,下載到板子上用insmod test.ko來執行模塊(rmmod test.ko是卸載模塊)
        ++++++++++++++++下面爲test.c程序內容++++++++++++++++++
        #include <linux/init.h>
        #include <linux/module.h>
        #include <asm/mpc83xx.h>
        MODULE_LICENSE("Dual BSD/GPL");
        static int hello_init(void)
        {
            printk(KERN_ALERT "Hello, world\n");
            printk(KERN_ALERT "IMMR virtual address: %X\n", VIRT_IMMRBAR);
            printk(KERN_ALERT "IMMRBAR: %08lX\n", *(unsigned long*)(VIRT_IMMRBAR + 0x00000));
            printk(KERN_ALERT "SPRIDR : %08lX\n", *(unsigned long*)(VIRT_IMMRBAR + 0x00108));
            return 0;
        }
        static void hello_exit(void)
        {
            printk(KERN_ALERT "Goodbye, cruel world\n");
        }
        module_init(hello_init);
        module_exit(hello_exit);
        ++++++++++++++++上面爲test.c程序內容++++++++++++++++++
        +++++++++++++++下面爲Makefile程序內容+++++++++++++++++
        ifneq ($(KERNELRELEASE),)  (can be deleted)
        obj-m := test.o
        else  (can be deleted)
        KDIR := ../..
        PWD := $(shell pwd)
        default:
            $(MAKE) -C $(KDIR) M=$(PWD)
        endif  (can be deleted)
        +++++++++++++++上面爲Makefile程序內容+++++++++++++++++
## 類似地我們可以編譯vlan配置模塊

 

====

http://hi.baidu.com/vivo01/item/67e47a38c6a06ff997f88d5c

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