回答

收藏

[原创] OK6410 开发板内核移植教程

飞凌嵌入式 飞凌嵌入式 3775 人阅读 | 0 人回复 | 2014-01-22

本帖最后由 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驱动已经成功移植了



分享到:
回复

使用道具 举报

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

本版积分规则

关闭

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