• 移植Linux2.6.38到Tiny6410_1GNandflash


      首先说一下为什么要下决心移植Linux内核,本来移植完Uboot后我想先把韦东山第二期的驱动教程看完后在试图移植内核,可是当我跟着教程写好LCD的驱动后,去设置编译友善的内核来测试程序时,我稍微改一点友善的内核配置就编译通不过,最后不得不移植内核来测试我的驱动程序!

    1、修改根目录下的Makefile:指定为交叉编译器

    ARCH        ?= arm
    CROSS_COMPILE    ?= arm-linux-

    2、在s3c6400的配置上进行修改

    #make s3c6400_defconfig

    3、#make menuconfig 进入配置界面其配置可以完全按照友善之臂的配置来做,当中有些不一样的选项可以不管,

    当然在配置的时候可以按H键来查看帮助信息和当前配置项的意义,有些我们不需要用到的可以不要。

      其中要注意的几个选项(要和友善之臂设置的一样)是:

      a.General setup  --->
    
        [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
    
        (scripts/FriendlyARM.cpio) Initramfs source file(s)

    如果不设置这两个选项当通过NFS挂载根文件系统时 会出现 nfs:server is not responding, still trying然后等个1分钟左右才能进入命令行;(复制友善的内核源码scripts/FriendlyARM.cpio文件到自己内核相应目录下

    FriendlyARM.cpio文件是什么?可以参考我转载的一篇文章【转载】Mini6410启动过程

      [*] Networking support  --->
    
        Networking options  --->
    
       Device Drivers  ---> 
    
        [*] Network device support  --->
    
       File systems  --->
    
        [*] Network File Systems  --->

    这三个选项下的设置是挂载NFS上的根文件系统的关键。

    我终于知道为什么加了FriendlyARM.cpio文件后挂载NFS就非常顺畅,不会出现 nfs:server is not responding, still trying

    FriendlyARM.cpio在init文件中看到了这句话:mount -t nfs $NFSROOT /r -o nolock,proto=tcp

    说明友善挂载NFS的时候是用的TCP协议,而不是NFS默认的UDP协议。然后我将启动参数设置为:

    set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=10.10.206.15:/root/nfs/roofs,proto=tcp ip=10.10.206.11:10.10.206.15:10.10.206.254:255.255.255.0:cxd:eth0:off init=/linuxrc lcd=S70

    然后去掉FriendlyARM.cpio文件,照样顺畅挂载NFS根文件系统!哈哈!

    4、对LCD的支持(Tiny6410的LCD的型号是S70)进入配置界面配置这几项:

     Device Drivers  --->
    
        Graphics support  --->
    
          <*> Support for frame buffer devices  --->
    
            <*>   Samsung S3C framebuffer support
    
          Console display driver support  --->
    
            <*> Framebuffer Console support
    
          [*] Bootup logo  --->
    
            [*]   Standard 224-color Linux logo

    这样配置后的内核,开机是屏幕会出现彩条而不是Linux的Logo,原因是内核自带的LCD驱动不支持S70,我们需要修改drviers/video/s3c-fb.c文件;但是内核驱动源码是何等的高大上,哪是我等菜鸟能修改得了的,所以我干脆将我跟着韦东山第二期LCD驱动教程写的驱动程序替换掉了这个s3c-fb.c文件,没想到竟然直接能用(让我欣喜一会),而且我挂载友善的文件系统是可以直接进入到Qt界面,只不过触摸功能没有用。有待进一步修改!

    其实内核自带的LCD驱动能用,只不过我们得修改arch/arm/mach-64xx/mach-mini6410.c将这个数组的数值改成下面的数值(这些数值是参照友善官方的)

    static struct s3c_fb_pd_win mini6410_fb_win[] = {
        {
            .win_mode    = {    // 7.0" 800x480 
                .left_margin    = 36,
                .right_margin    = 80,
                .upper_margin    = 15,    
                .lower_margin    = 22,
                .hsync_len    = 10,
                .vsync_len    = 8,
                
                .xres        = 800,
                .yres        = 480,
            },
            .max_bpp    = 32,
            .default_bpp    = 16,
        },
    };

     但是触摸功能还是不能用!

    5、对USB的支持:(直接参照友善的)

      在没有修改之前会启动内核时会出现错误:

      s3c2410-ohci s3c2410-ohci: init err (00000000 0000)
      ohci_hcd: can't start s3c24xx
      s3c2410-ohci s3c2410-ohci: startup error -75
      s3c2410-ohci s3c2410-ohci: USB bus 1 deregistered
      s3c2410-ohci: probe of s3c2410-ohci failed with error -75

      5.1修改arch/arm/mach-s3c64xx/mach-mini6410.c增加这个函数:

    #ifdef CONFIG_USB_SUPPORT
    /* Initializes OTG Phy. to output 48M clock */
    void s3c_otg_phy_config(int enable) {
        u32 val;
    
        if (enable) {
            __raw_writel(0x0, S3C_PHYPWR);    /* Power up */
    
            val = __raw_readl(S3C_PHYCLK);
            val &= ~S3C_PHYCLK_CLKSEL_MASK;
            __raw_writel(val, S3C_PHYCLK);
    
            __raw_writel(0x1, S3C_RSTCON);
            udelay(5);
            __raw_writel(0x0, S3C_RSTCON);    /* Finish the reset */
            udelay(5);
        } else {
            __raw_writel(0x19, S3C_PHYPWR);    /* Power down */
        }
    }
    EXPORT_SYMBOL(s3c_otg_phy_config);
    #endif

      5.2修改drivers/usb/host/ohci-s3c2410.c

    @@ -25,10 +25,14 @@
    
    #define valid_port(idx) ((idx) == 1 || (idx) == 2)
    
    +#ifdef CONFIG_MACH_MINI6410
    +extern void s3c_otg_phy_config(int enable);
    +#endif
    +
    /* clock device associated with the hcd */
    
    static struct clk *clk;
    -static struct clk *usb_clk;
    +static struct clk *otg_clk, *usb_clk;
    
    /* forward definitions */
    
    @@ -47,6 +51,11 @@
    
         dev_dbg(&dev->dev, "s3c2410_start_hc:
    ");
    
    +    clk_enable(otg_clk);
    +#ifdef CONFIG_MACH_MINI6410
    +    s3c_otg_phy_config(1);
    +#endif
    +
         clk_enable(usb_clk);
         mdelay(2);            /* let the bus clock stabilise */
    
    @@ -79,6 +88,7 @@
    
         clk_disable(clk);
         clk_disable(usb_clk);
    +    clk_disable(otg_clk);
    }
    
    @@ +388 +395,13 @@
    
    +    otg_clk = clk_get(&dev->dev, "otg");
    +    if (IS_ERR(otg_clk)) {
    +        dev_err(&dev->dev, "cannot get otg clock
    ");
    +        retval = -ENOENT;
    +        goto err_otg;
    +    }
    +
         s3c2410_start_hc(dev, hcd);
    
         hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
    
    @@ -417,6 +420,10 @@
      err_ioremap:
         s3c2410_stop_hc(dev);
         iounmap(hcd->regs);
    +
    +    clk_put(otg_clk);
    +
    + err_otg:
         clk_put(usb_clk);
    
      err_clk:

     

    6、对S3C_DEV_RTC的支持

     RTC就是系统启动后会自动读取板子上的RTC时钟作为当前的系统时间,首先内核配置如下:

    Device Drivers  --->
        <*> Real Time Clock  --->
            [*]   Set system time from RTC on startup and resume
            (rtc0)  RTC used to set the system time
            [*]   /sys/class/rtc/rtcN (sysfs)
            [*]   /proc/driver/rtc (procfs for rtc0)
            [*]   /dev/rtcN (character devices)
            <*>   Samsung S3C series SoC RTC

      在arch/arm/mach-s3c64xx/mach-mini6410.c文件的static struct platform_device *mini6410_devices[] __initdata数组中  加入一个&s3c_device_rtc,来申请一个platform_device资源,这样之后编译不会通过,提示找不到s3c_device_rtc函数,  找了半天原来是因为arch/arm/mach-s3c64xx目录下的Kconfig文件中没有将RTC驱动编译进内核,修改如下:

    config MACH_MINI6410
        bool "MINI6410"
        select CPU_S3C6410
        select S3C_DEV_HSMMC
        select S3C_DEV_HSMMC1
        select S3C64XX_SETUP_SDHCI
        select S3C_DEV_USB_HOST
        select S3C_DEV_NAND
        select S3C_DEV_RTC
        select S3C_DEV_FB
        select S3C64XX_SETUP_FB_24BPP
        select SAMSUNG_DEV_ADC
        select SAMSUNG_DEV_TS
        help
          Machine support for the FriendlyARM MINI6410

      加上红色的那一项,编译成功,并且可以读取RTC的时间!

      

    注:通过NFS挂载内核和文件系统:

      启动UBoot后:

    //设置启动参数,注意这是一整行中间不能又换行符,并且空格也是严格规定的,不能随便加
    set bootargs console=ttySAC0,115200 root=/dev/nfs nfsroot=10.10.206.15:/root/nfs/roofs,proto=tcp ip=10.10.206.11:10.10.206.15:10.10.206.254:255.255.255.0:cxd:eth0:off init=/linuxrc lcd=S70
    #save    (保存启动参数到NandFlash中)
    #nfs
    0x50008000 10.10.206.15:/root/nfs/zImage(下载内核到0x50008000内存地址处) #bootm    (启动内核)

    工欲善其事,必先利其器。好的开发环境会大大提高效率,呵呵!(用NFS挂载文件系统实在太方便了,哈哈!)

      

  • 相关阅读:
    鸣人和佐助(OJ 6044)
    Papa的坦克(原BZOJ 1603 打谷机)
    linux基础学习之用户和用户组
    出现log4j:WARN No appenders could be found for logger 解决方法
    myeclipse当中,如何导入或者导出项目
    linux 基础学习之目录与文件处理命令
    linux 基础学习之权限管理命令
    hadoop环境搭建之伪分布集群环境搭建(单节点)
    linux基础学习之各目录的作用
    linux 基础学习之 磁盘,分区,MBR与GPT
  • 原文地址:https://www.cnblogs.com/cxd2014/p/4476290.html
Copyright © 2020-2023  润新知