<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > linux-2.6.35.3內核移植(s3c2440)

          linux-2.6.35.3內核移植(s3c2440)

          作者: 時間:2016-11-20 來源:網絡 收藏
          宿 主機:Fedora13
          目標 機:s3c2440
          交叉 編譯 器:arm-linux-gcc-3.4.1
          交叉編譯器路徑:/usr/local/arm/3.4.1
          要移植 的內核 版本:linux-2.6.35.3
          文件 系統(tǒng) 類型: yaffs2

          一、準備工作

          1、下載 解壓內核
          從官網上下載linux-2.6.35的內核, ftp://ftp.kernel.org/pub/linux/kernel/v2.6/ ,文件不大,約85M。
          新建一個工作目錄s3c2440,將內核源碼包拷貝至工作目錄下,再解壓。
          2、移植yaffs2驅動
          下載最新的驅動http://www.aleph1.co.uk/cgi-bin/ ... fs2.tar.gz?view=tar 解壓在工作目錄s3c2440下
          進入yaffs2: cd yaffs2
          給內核打補?。?./patch-ker.sh c ../linux-2.6.34
          成功后打印信息: Updating /file/fl/linux-2.6.34/fs/Kconfig
          Updating /file/fl/linux-2.6.34/fs/Makefile
          ?問題:
          1、什么是補???
          一個補丁就是一個文本文檔,這個文檔包含了在兩個不同版本的源代碼樹之間的變化。補丁是通
          過diff應用程序來創(chuàng)建的。 為了正確地打上一個補丁,你需要知道這個補丁是從哪個基礎版本產
          生出來的以及這個補丁將要把目前的源代碼樹變化到什么新的版本。這些信息 或者會出現(xiàn)在補丁
          文件的原數(shù)據(jù)中,或者可能從文件名中推斷出來。
          2、為什么要給內核打補???
          因為該內核暫不支持yaff2的文件系統(tǒng),打上補丁使之支持。
          3、安裝交叉編譯環(huán)境
          從http://www.handhelds.org/download/projects/toolchain/ 下載arm-linux-gcc-3.4.1.tar.bz2
          解壓之,su
          tar vxjf arm-linux-gcc-3.4.1.tar.bz2
          將交叉編譯器安裝到/usr/local/下。 值得注意的是:該/usr/local目錄并不是Fedora系統(tǒng)根
          錄下的/usr/local,而是剛剛生成的/usr/local目錄。這個一點要注意,否則浪費了時間不說,
          也破壞了Linux系統(tǒng)。

          二、移植

          本文引用地址:http://www.ex-cimer.com/article/201611/318849.htm
          ??1、修改機器碼
          飛凌開發(fā)板的bootloader默認的機器碼是193,所以我們在使用smdk2440機器的時候,需要修
          改機器碼。修改內核2.6.35.3中的arch/arm /tools/mach-types。
          ?? 刪掉
          s3c2410 ARCH_S3C2410 S3C2410 182
          然后將
          s3c2440 ARCH_S3C2440 S3C2440 362
          修改為
          s3c2440 ARCH_S3C2440 S3C2440 193
          2、指定目標板machine、編譯器和編譯器路徑
          ?修改linux-2.6.35.3/Makefile,將
          ARCH ?= $(SUBARCH)
          CROSS_COMPILE ?=
          修改成ARCH ?= arm
          CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
          注意:CROSS_COMPILE是指交叉編譯器的路徑,該路徑一定要完整,比如本人的是:/home/kelvin /usr
          /local/arm/3.4.1/bin/arm-linux- 這個/home/kelvin就不能少,否則最后make zImage時提示文件不存在。

          3、增加devfs文件管理器的支持

          我們所用的文件系統(tǒng)使用的是devfs文件管理器。修改fs/Kconfig,

          找到

          menu "Pseudo filesystems"

          添加如下語句:

          config DEVFS_FS

          bool "/dev file system support (OBSOLETE)"

          default y

          config DEVFS_MOUNT

          bool "Automatically mount at boot"

          default y

          depends on DEVFS_FS

          幫助理解:Kconfig就是對應著內核的配置菜單。假如要想添加新的驅動到內核的源碼中,能夠修改Kconfig,

          這樣就能夠選擇這個驅動,假如想使這個驅動被編譯,要修改Makefile。

          4、修改晶振頻率(可解決打印信息亂碼問題)

          文件:arch/arm/mach-s3c2440/mach-smdk2440.c

          /*s3c24xx_init_clocks(16934400);*/s3c24xx_init_clocks(12000000);

          5、修改MTD分區(qū)

          文件:arch/arm/plat-s3c24xx/common-smdk.c
          需要和bootloader中的分區(qū)信息相同(256M),否則,啟動時出錯。

          static struct mtd_partition smdk_default_nand_part[] = {

          [0] = {

          .name = "boot",

          .size = 0x00020000,

          .offset = 0

          },

          [1] = {

          .name = "MyApp",

          .size = 0x00380000,

          .offset = 0x00180000,

          },

          [2] = {

          .name = "Kernel",

          .size = 0x00300000,

          .offset = 0x00500000,

          },

          [3] = {

          .name = "fs_yaffs",

          .size = 0x07800000,

          .offset = 0x00800000,

          }

          };

          問題:什么是MTD?

          MTD(memory technology device內存技術設備)是用于訪問memory設備(ROM、flash)的Linux的子系統(tǒng)。

          MTD的主要目的是為了使新的memory設備的驅動更加簡單,為此它在硬件和上層之間提供了一個抽象的接口。

          有幾點需要注意:

          a、此信息需根據(jù)自己的實際分區(qū)信息修改

          b、這里文件系統(tǒng)所在的分區(qū)標號必須與板子上root_fs的號碼相同,否則啟動會出錯。因此這里不需要將所有

          的分區(qū)信息都寫進來,只要位置對應即可!

          6、關閉ECC校驗

          文件:drivers/mtd/nand/s3c2410.c
          函數(shù):s3c2410_nand_init_chip

          /*chip->ecc.mode = NAND_ECC_SOFT; */chip->ecc.mode = NAND_ECC_NONE;

          問題:關于ECC:ECC是“Error Correcting Code”的簡寫,中文名稱是“錯誤檢查和糾正”。ECC是一種能夠實現(xiàn)

          “錯誤檢查和糾正”的技術,ECC內存就是應用了這種技術的內存,一般多應用在服務器及圖形工作站上,這將使整個

          電腦系統(tǒng)在工作時更趨于安全穩(wěn)定。此處為避免容易出錯,將ECC關閉。

          7、修改nandflash驅動,支持K9F1G08的nandflash

          修改drivers/mtd/nand下面的nand_bbt.c文件:

          static struct nand_bbt_descr largepage_memorybased = {

          .options = 0,

          .offs = 0,

          .len = 1, //原數(shù)值為2,支持2K每頁的flash修改為1。K9F1G08,K9F2G08是2k每頁的flash

          .pattern = scan_ff_pattern

          };

          static struct nand_bbt_descr largepage_flashbased = {

          .options = NAND_BBT_SCAN2NDPAGE,

          .offs = 0,

          .len = 1, //原數(shù)值為2,支持2K每頁的flash修改為1。K9F1G08,K9F2G08是2k每頁的flash

          .pattern = scan_ff_pattern

          };

          8、下面,開始配置內核。

          進入linux-2.6.35目錄,把s3c2410的默認配置寫入config文件。

          make s3c2410_defconfig

          make menuconfig

          配置文件系統(tǒng)選項
          配置yaffs2文件系統(tǒng)
          修改配置如下:

          File systems --->

          [*] Miscellaneous filesystems --->

          <*> YAFFS2 file system support

          -*- 512 byte / page devices

          -*- 2048 byte (or larger) / page devices

          [*] Autoselect yaffs2 format

          [*] Cache short names in RAM

          配置cpu相關選項
          修改配置如下:

          System Type --->

          S3C2440 Machines --->

          [*] SMDK2440

          [*] SMDK2440 with S3C2440 CPU module

          去掉S3C2400 Machines、S3C2410 Machines、S3C2412 Machines、S3C2442 Machines的所有選項,

          否則會報錯。如果現(xiàn)在編譯內核,下載到開發(fā)板中,內核就可以正常啟動了.有了雛形,繼續(xù)移植設備驅動。

          這里,內核選項*代表編譯至內核,M代表編譯為模塊。

          9、移植USB host驅動

          在這個版本的linux內核,已經對USB驅動進行來很好的支持,僅僅需要修改配置。

          Device Drivers --->

          [*] USB support --->

          {*} Support for Host-side USB

          [*] USB device filesystem (DEPRECATED)

          [*] USB device class-devices (DEPRECATED)

          <*> OHCI HCD support

          <*> USB Mass Storage support

          [*] HID Devices --->

          {*} Generic HID support

          [*] /dev/hidraw raw HID device support

          SCSI device support --->

          <*> SCSI device support

          [*] legacy /proc/scsi/ support

          <*> SCSI disk support

          <*> SCSI tape support

          10、移植RTC驅動

          在這個版本的linux內核,已經對RTC驅動進行來很好的支持,不需要修改配置。相應配置如下

          Device Drivers --->

          <*> Real Time Clock --->

          [*] Set system time from RTC on startup and resume

          (rtc0) RTC used to set the system time

          [ ] RTC debug support

          *** RTC interfaces ***

          [*] /sys/class/rtc/rtcN (sysfs)

          [*] /proc/driver/rtc (procfs for rtc0)

          [*] /dev/rtcN (character devices)

          <*> Samsung S3C series SoC RTC

          然后添加對設備的支持
          打開arch/arm/mach-s3c2440/mach-smdk2440.c,添加設備,代碼如下:

          static struct platform_device *smdk2440_devices[] __initdata = {

          &s3c_device_ohci,

          &s3c_device_lcd,

          &s3c_device_wdt,

          &s3c_device_i2c0,

          &s3c_device_iis,

          &s3c_device_rtc,

          };

          11、移植UDA1341驅動

          在平臺上添加和配置UDA1341:

          修改arch/arm/mach-s3c2440/mach-smdk2440.c,在開始添加頭文件

          #include

          #include

          添加設備配置

          static struct s3c24xx_uda134x_platform_data s3c24xx_uda134x_data = {

          .l3_clk = S3C2410_GPB(4),

          .l3_data = S3C2410_GPB(3),

          .l3_mode = S3C2410_GPB(2),

          .model = UDA134X_UDA1341,

          };

          static struct platform_device s3c24xx_uda134x = {

          .name = "s3c24xx_uda134x",

          .dev = {

          .platform_data = &s3c24xx_uda134x_data,

          }

          };

          把設備添加到平臺當中

          static struct platform_device *smdk2440_devices[] __initdata = {

          &s3c_device_ohci,

          &s3c_device_lcd,

          &s3c_device_wdt,

          &s3c_device_i2c0,

          &s3c_device_iis,

          &s3c_device_rtc,

          &s3c24xx_uda134x,

          };

          內核配置如下

          Device Drivers --->

          <*> Sound card support --->

          <*> Advanced Linux Sound Architecture --->

          <*> OSS Mixer API

          <*> OSS PCM (digital audio) API

          [*] OSS PCM (digital audio) API - Include plugin system

          [*] Support old ALSA API

          [*] Verbose procfs contents

          [*] Verbose printk

          [*] Generic sound devices --->

          <*> ALSA for SoC audio support --->

          <*> SoC Audio for the Samsung S3C24XX chips

          <*> SoC I2S Audio support UDA134X wired to a S3C24XX

          12、移植DM9000驅動

          a、修改drivers/net/dm9000.c文件:
          頭文件增加:

          #include

          #include

          #include

          在dm9000_probe函數(shù)開始增加:

          unsigned char ne_def_eth_mac_addr[]={0x00,0x12,0x34,0x56,0x80,0x49};

          static void *bwscon;

          static void *gpfcon;

          static void *extint0;

          static void *intmsk;

          #define BWSCON (0x48000000)

          #define GPFCON (0x56000050)

          #define EXTINT0 (0x56000088)

          #define INTMSK (0x4A000008)

          bwscon=ioremap_nocache(BWSCON,0x0000004);

          gpfcon=ioremap_nocache(GPFCON,0x0000004);

          extint0=ioremap_nocache(EXTINT0,0x0000004);

          intmsk=ioremap_nocache(INTMSK,0x0000004);

          writel(readl(bwscon)|0xc0000,bwscon);

          writel( (readl(gpfcon) & ~(0x3 << 14)) | (0x2 << 14), gpfcon);

          writel( readl(gpfcon) | (0x1 << 7), gpfcon); // Disable pull-up

          writel( (readl(extint0) & ~(0xf << 28)) | (0x4 << 28), extint0); //rising edge

          writel( (readl(intmsk)) & ~0x80, intmsk);

          在這個函數(shù)的最后需要修改:

          if (!is_valid_ether_addr(ndev->dev_addr)) {

          /* try reading from mac */

          mac_src = "chip";

          for (i = 0; i < 6; i++)

          //ndev->dev_addr[i] = ior(db, i+DM9000_PAR);

          ndev->dev_addr[i] = ne_def_eth_mac_addr[i];

          }

          b、修改arch/arm/mach-s3c2440/mach-smdk2440.c,添加設備

          static struct platform_device *smdk2440_devices[] __initdata = {

          &s3c_device_ohci,

          &s3c_device_lcd,

          &s3c_device_wdt,

          &s3c_device_i2c0,

          &s3c_device_iis,

          &s3c_device_rtc,

          &s3c24xx_uda134x,

          &s3c_device_dm9000,

          };

          c、修改arch/arm/plat-s3c24xx/devs.c
          添加頭文件

          #include

          添加以下代碼

          static struct resource s3c_dm9000_resource[] = {

          [0] = {

          .start = S3C24XX_PA_DM9000,

          .end = S3C24XX_PA_DM9000+ 0x3,

          .flags = IORESOURCE_MEM

          },

          [1]={

          .start = S3C24XX_PA_DM9000 + 0x4, //CMD pin is A2

          .end = S3C24XX_PA_DM9000 + 0x4 + 0x7c,

          .flags = IORESOURCE_MEM

          },

          [2] = {

          .start = IRQ_EINT7,

          .end = IRQ_EINT7,

          .flags = IORESOURCE_IRQ

          },

          };

          static struct dm9000_plat_data s3c_device_dm9000_platdata = {

          .flags= DM9000_PLATF_16BITONLY,

          };

          struct platform_device s3c_device_dm9000 = {

          .name= "dm9000",

          .id= 0,

          .num_resources= ARRAY_SIZE(s3c_dm9000_resource),

          .resource= s3c_dm9000_resource,

          .dev= {

          .platform_data = &s3c_device_dm9000_platdata,

          }

          };

          EXPORT_SYMBOL(s3c_device_dm9000);

          d、修改arch/arm/plat-sumsung/include/plat/devs.h 45行附近,添加

          extern struct platform_device s3c_device_dm9000;

          e、修改arch/arm/mach-s3c2410/include/mach/map.h文件

          /* DM9000 */

          #define S3C24XX_PA_DM9000 0x20000300

          #define S3C24XX_VA_DM9000 0xE0000000

          13、啟動畫面顯示小企鵝的方法

          配置內核,下面是必選項

          Device Drivers--->

          Graphics support --->

          <*> Support for frame buffer devices

          <*> S3C2410 LCD framebuffer support ,multi support!

          Console display driver support --->

          <*> Framebuffer Console support

          Logo configuration --->

          [*] Bootup logo

          [*] Standard 224-color Linux logo

          14、3.5寸LCD顯示的移植

          2.6.34內核中已經支持

          15、修改uart2為普通串口以及測試程序

          修改arch/arm/mach-s3c2440/mach-smdk2440.c中的uart2的配置,修改后如下:

          static struct s3c2410_uartcfg smdk2440_uartcfgs[] __initdata = {

          [0] = {

          .hwport = 0,

          .flags = 0,

          .ucon = 0x3c5,

          .ulcon = 0x03,

          .ufcon = 0x51,

          },

          [1] = {

          .hwport = 1,

          .flags = 0,

          .ucon = 0x3c5,

          .ulcon = 0x03,

          .ufcon = 0x51,

          },

          /* IR port */

          [2] = {

          .hwport = 2,

          .flags = 0,

          .ucon = 0x3c5,

          .ulcon = 0x03,/*fatfish 0x43*/

          .ufcon = 0x51,

          }

          };

          在drivers/serial/samsung.c中添加對uart2控制器的配置,配置為普通串口。

          添加頭文件:

          #include

          #include

          在static int s3c24xx_serial_startup(struct uart_port *port)函數(shù)中,添加

          if (port->line == 2) {

          s3c2410_gpio_cfgpin(S3C2410_GPH(6), S3C2410_GPH6_TXD2);

          s3c2410_gpio_pullup(S3C2410_GPH(6), 1);

          s3c2410_gpio_cfgpin(S3C2410_GPH(7), S3C2410_GPH7_RXD2);

          s3c2410_gpio_pullup(S3C2410_GPH(7), 1);

          }

          測試方法:
          在linux內核源碼中drivers/serial/samsung.c中

          .dev_name = "ttySAC",

          寫明在開發(fā)板/dev目錄下生成的ttySACx為串口設備結點。
          使用命令:

          getty 115200 /dev/ttySAC2

          將終端交給com2,這樣可以在com2中收到波特率為115200的終端信息。
          這三個針的順序:最靠近底板絲印層“com2”字樣的針腳是com2的發(fā)送腳(需要接pc串口的接收腳),中間的

          是com2的接收腳(接pc串口的發(fā)送腳),剩下的那個是地(接pc串口的地)。

          16、移植看門狗

          修改配置

          Device Drivers --->

          [*] Watchdog Timer Support --->

          <*> S3C2410 Watchdog

          最后:make zImage

          最后編譯出來的zImage就2.0M左右。

          /*

          如果想清除之前的所有配置,還原內核樹,可以使用

          make mrproper

          如果僅僅是想清楚配置文件,使用

          make clean

          即可

          */




          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();