查看: 3241|回复: 0

[Linux技术] OK6410 开发板内核移植教程

[复制链接]
  • TA的每日心情

    2014-4-10 13:56
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2014-1-22 13:38:05 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 forlinx2013 于 2014-1-24 09:36 编辑

    欢迎大家来到飞凌爱板网专区,对嵌入式技术感兴趣的朋友不妨多多关注一下,我们提供了公司所有开发板的所有资料,也会更新大量技术文章,欢迎大家一块学习提高!!!

    配置信息:
    移植内核:linux-3.3.5 可以从  http://www.kernel.org/ 下载纯正的版本   
    编译环境:vmwareubuntu11.04
    交叉编译版本:4.3.2
    准备工作:
    一块OK6410开发板,交叉网线,串口线一根。
    ubuntu根目录下创建forlinx文件,将内核拷贝至该目录下。
    确保你的ubuntu已经安装libncures5-dev(安装方法 #sudo apt-get install libncurses5-dev)。
    由于移植内核工作要频繁的测试所编译的内核运行情况,所以最好配置NFS服务和使用带有tftp网络功能的uboot
    http://download.csdn.net/detail/laoylhuli/4520015本人测试可以在OK6410上使用tftp下载
    移植步骤:
    解压内核
    root@ubuntu:/forlinx# tar zxvf linux-3.3.5.tar.gz
    ########################################################################################################
    arch/arm/mach-s3c64xx/目录下的mach-smdk6410.c 复制一份在当前文件下命名为mach-ok6410.c
    1 root@ubuntu:/forlinx/linux-3.3.5/arch/arm/mach-s3c64xx# cp mach-smdk6410.c mach-ok6410.c  
    ########################################################################################################
    有了OK6410开发板的bsp文件之后,修改当前目录下的Kconfig文件,将我们的bsp文件添加到内核配置中
    1 root@ubuntu:/forlinx/linux-3.3.5/arch/arm/mach-s3c64xx# gedit Kconfig  
    找到
    1 config MACH_SMDK6410  
    2     bool "SMDK6410"  
    3     select CPU_S3C6410  
    4     select SAMSUNG_DEV_ADC  
    5     select S3C_DEV_HSMMC  
    6     select S3C_DEV_HSMMC1  
    7     select S3C_DEV_I2C1  
    8     select SAMSUNG_DEV_IDE  
    9     select S3C_DEV_FB  
    10     select S3C_DEV_RTC  
    11     select SAMSUNG_DEV_TS  
    12     select S3C_DEV_USB_HOST  
    13     select S3C_DEV_USB_HSOTG  
    14     select S3C_DEV_WDT  
    15     select SAMSUNG_DEV_BACKLIGHT  
    16     select SAMSUNG_DEV_KEYPAD  
    17     select SAMSUNG_DEV_PWM  
    18     select HAVE_S3C2410_WATCHDOG if WATCHDOG  
    19     select S3C64XX_SETUP_SDHCI  
    20     select S3C64XX_SETUP_I2C1  
    21     select S3C64XX_SETUP_IDE  
    22     select S3C64XX_SETUP_FB_24BPP  
    23     select S3C64XX_SETUP_KEYPAD  
    24     help  
    25       Machine support for the Samsung SMDK6410  
    复制一下,创建OK6410配置
    1 config MACH_OK6410  
    2     bool "OK6410"--------------------------此处注意大小写                           
    3     select CPU_S3C6410  
    4     select SAMSUNG_DEV_ADC  
    5     select S3C_DEV_HSMMC  
    6     select S3C_DEV_HSMMC1  
    7     select S3C_DEV_I2C1  
    8     select SAMSUNG_DEV_IDE  
    9     select S3C_DEV_FB  
    10     select S3C_DEV_RTC  
    11     select SAMSUNG_DEV_TS  
    12     select S3C_DEV_USB_HOST  
    13     select S3C_DEV_USB_HSOTG  
    14     select S3C_DEV_WDT  
    15     select SAMSUNG_DEV_BACKLIGHT  
    16     select SAMSUNG_DEV_KEYPAD  
    17     select SAMSUNG_DEV_PWM  
    18     select HAVE_S3C2410_WATCHDOG if WATCHDOG  
    19     select S3C64XX_SETUP_SDHCI  
    20     select S3C64XX_SETUP_I2C1  
    21     select S3C64XX_SETUP_IDE  
    22     select S3C64XX_SETUP_FB_24BPP  
    23     select S3C64XX_SETUP_KEYPAD  
    24     help  
    25       Machine support for the Forlinx OK6410  
    保存退出
    ########################################################################################################
    由于机器码ID必须和ubootID一致,所修改arch/arm/tools/mach-types文件,283行找到
    1 smdk6410        MACH_SMDK6410       SMDK6410        1626  
    把它改成
    1 ok6410          MACH_OK6410     OK6410          1626  
    保存退出
    ########################################################################################################
    修改BSP文件,
    1 root@ubuntu:/forlinx/linux-3.3.5/arch/arm/mach-s3c64xx# gedit mach-ok6410.c   
    使用gedit工具的search-->replace把文件中所有的smdk6410改成ok6410
    700行处找到
    1 MACHINE_START(ok6410, "ok6410")  
    把他改成
    1 MACHINE_START(OK6410, "OK6410")--------------这里跟我们前面配置的Kconfigmach-types文件中的名字对应,**大小写注意必须一致  
    ########################################################################################################在当前目录(arch/arm/mach-s3c64xx/)下打开Makefile添加我们的bsp文件
    1 obj-$(CONFIG_MACH_OK6410)         += mach-ok6410.o  
    ########################################################################################################
    修改顶层的Makefile,第195196行编辑
    1 ARCH       ?= arm          ***************这里禁止在arm后出现空格或其它符号   
    2 CROSS_COMPILE   ?= /usr/local/arm/4.3.2/bin/arm-linux-       ********你的交叉编译器的路径  
    ########################################################################################################
    arch/arm/configs/s3c6400-defconfig配置文件复制到顶层然后保存为 .config
    1 root@ubuntu:/forlinx/linux-3.3.5# cp arch/arm/configs/s3c6400_defconfig .config  
    ########################################################################################################
    执行make menuconfig对内核进行配置

    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-26261.png
    打开内核的EABI
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-8118.png
    选择自己的板极为OK6410  
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-14777.png
    把自己的交叉编译器的路径输进去
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-29930.png
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-23388.png
    配置打印串口为芯片的串口0
    ########################################################################################################
    可以开始编译了

    1 root@ubuntu:/forlinx/linux-3.3.5# make uImage  
    几分钟后最初的内核已经编译完成了在arch/arm/boot下可以看到我们编译完成的内核了uImage。通过tftpOK6410开发板上运行。
    通过Uboottftp下载到开发板上
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-1257.png
    开始运行3.3.5内核
    file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps_clip_image-17098.png
    前面已经把内核给跑起来的,现在要做的就是各种驱动的移植了,首先来移植简单的led
            在linux内核中drivers/leds/leds­gpio.c已经写好了一个与系统结构无关的LED驱动,我们只要修改BSP板极文件将它注册到platform上就行。
    arch/arm/mach-s3c64xx/目录下打开mach-ok6410.c板级文件
    1 root@ubuntu:/forlinx/linux-3.3.5/arch/arm/mach-s3c64xx# gedit mach-ok6410.c  
    在板级文件下添加对应的如下信息
    1 static struct gpio_led ok6410_leds[] ={  
    2     [0]= {  
    3         .name = "LED1",  
    4         .gpio = S3C64XX_GPM(0),  
    5         },  
    6     [1]= {  
    7         .name = "LED2",  
    8         .gpio = S3C64XX_GPM(1),  
    9         },  
    10     [2]= {  
    11         .name = "LED3",  
    12         .gpio = S3C64XX_GPM(2),  
    13         },  
    14     [3]= {  
    15         .name = "LED4",  
    16         .gpio = S3C64XX_GPM(3),  
    17         },      
    18 };  
    19   
    20 static struct gpio_led_platform_data ok6410_gpio_led_pdata ={  
    21     .num_leds    = ARRAY_SIZE(ok6410_leds),  
    22     .leds         =ok6410_leds,  
    23 };  
    24   
    25 static struct platform_device ok6410_device_led ={  
    26     .name    = "leds-gpio",  
    27     .id        = -1,  
    28     .dev    ={  
    29     .platform_data = &ok6410_gpio_led_pdata,  
    30     },  
    31 };  
    在板级文件的设备初始化static struct platform_device *my6410_devices[] __initdata结构体中添加我们的LED配置
    1 &ok6410_device_led,  
    最后配置内核,使我们的led在启动的时候加载。
    Device Drivers --->
        LED Class Support --->     
            <*> LED Support for GPIO connected LEDs
    我们再次把内核下载到开发板的时候,当你发现ok64104led灯全亮的时候证明我们移植的led驱动已经成功了。
    ################################################################################################################################
      下面来移植一个4.3LCD液晶。
    首先打开我们的板级BSP文件,修改里面的fb部分代码,即液晶配置部分代码
    1 root@ubuntu:/forlinx/linux-3.3.5/arch/arm/mach-s3c64xx# gedit mach-ok6410.c  
    找到static struct s3c_fb_pd_win ok6410_fb_win0这个结构体
    1 修改成
    2 static struct s3c_fb_pd_win ok6410_fb_win0 = {  
    3     /* this is to ensure we use win0 */  
    4     .win_mode    = {  
    5         .left_margin    = 2,  
    6         .right_margin    = 2,  
    7         .upper_margin    = 2,  
    8         .lower_margin    = 2,  
    9         .hsync_len    = 41,  
    10         .vsync_len    = 10,  
    11         .xres        = 480,  
    12         .yres        = 272,  
    13     },  
    14     .max_bpp    = 32,  
    15     .default_bpp    = 16,  
    16 };   
    不同的液晶对应的配置会不同,具体查看对应液晶的手册。
    继续寻找,找到
    1 static struct map_desc ok6410_iodesc[] = {};  
    上面这个结构体是空的,我们修改为
    1 static struct map_desc ok6410_iodesc[] = {  
    2     {  
    3         .virtual = (unsigned long)S3C_VA_LCD,  
    4         .pfn = __phys_to_pfn(S3C_PA_FB),  
    5         .length = SZ_16K,  
    6         .type = MT_DEVICE,  
    7     },  
    8 };   
    将飞凌3.0.1内核(或其它内核)中的drviers/video/下的samsung目录拷贝我们对应的目录中来。
    修改drviers/video/Kconfig文件,在文件的最后添加
    1 source "drivers/video/samsung/Kconfig"  
    修改drviers/video/Makefie文件,把我们添加进来的文件进行内核编译时同时编译,再最后一行添加:
    obj-$(CONFIG_FB_S3C_EXT) += samsung/
    #################################################################################################
    arch/arm/plat-samsung/include/plat/map-base.h里面添加
    1 #define S3C_VA_LCD  S3C_ADDR(0x01100000)     /* LCD */  
    include/generated/atuoconfig.h文件最后添加
    1 #define CONFIG_FB_S3C_EXT_NUM 4  
    drivers/video/samsung/s3cfb_fimd4x.c文件中的
    3.0中的对应1438
    1 s3c6410_pm_do_save(s3c_lcd_save, ARRAY_SIZE(s3c_lcd_save));  
    修改成
    1 s3c_pm_do_save(s3c_lcd_save, ARRAY_SIZE(s3c_lcd_save));  

    1459行,
    1 s3c6410_pm_do_restore(s3c_lcd_save, ARRAY_SIZE(s3c_lcd_save));  
    修改成
    1 s3c_pm_do_restore(s3c_lcd_save, ARRAY_SIZE(s3c_lcd_save));  
    保存。
    #################################################################################################
    飞凌linux源码中的arch\arm\mach-s3c64xx\include\mach下的regs-fb.hregs-lcd.h拷贝到我们对应的目录。
    配置内核
    Device Drivers --->
    Graphics support --->
    <*> Support for frame buffer devices ---> (里面的都空选)
    <*> Support for frame buffer devices --->
    [ ] Backlight & LCD device support --->
    <*> S3C Framebuffer Support (eXtended)(修改Kconfig之后才有这个选)
    Select LCD Type (4.3 inch 480x272 TFT LCD) --->
    (X) 4.3 inch 480x272 TFT LCD
    <*> Advanced options for S3C Framebuffer
    Select BPP(Bits Per Pixel) (16 BPP) --->
    (4) Number of Framebuffers
    [ ] Enable Virtual Screen
    Enable Double Buffering
    Console display driver support --->
    <*> Framebuffer Console support
    Bootup logo --->(显示小企鹅)
    Standard 224-color Linux logo
    #################################################################################
    又可以开始编译了把内核下载到开发板后,启动的时候会出现一只企鹅就是linux
    启动部分出现
    S3C_LCD clock got enabled :: 133.000 Mhz
    LCD TYPE :: LTE480WV will be initialized
    Window[0] - FB1: map_video_memory: clear ffd80000:0007f800
                FB1: map_video_memory: dma=5f900000 cpu=ffd80000 size=0007f800
    Window[0] - FB2: map_video_memory: clear ffdbfc00:0003fc00
                FB2: map_video_memory: dma=5f93fc00 cpu=ffdbfc00 size=0003fc00
    Console: switching to colour frame buffer device 60x34
    fb0: s3cfb frame buffer device
    Window[1] - FB1: map_video_memory: clear ffd00000:0007f800
                FB1: map_video_memory: dma=5f980000 cpu=ffd00000 size=0007f800
    Window[1] - FB2: map_video_memory: clear ffd3fc00:0003fc00
                FB2: map_video_memory: dma=5f9bfc00 cpu=ffd3fc00 size=0003fc00
    fb1: s3cfb frame buffer device
    Window[2] - FB1: map_video_memory: clear ffcc0000:0003fc00
                FB1: map_video_memory: dma=5fa00000 cpu=ffcc0000 size=0003fc00
    fb2: s3cfb frame buffer device
    Window[3] - FB1: map_video_memory: clear ffc80000:0003fc00
                FB1: map_video_memory: dma=5fa40000 cpu=ffc80000 size=0003fc00
    fb3: s3cfb frame buffer device
    证明你的LCD驱动已经成功移植了



    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 04:21 , Processed in 0.114156 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.