本帖最后由 forlinx2013 于 2014-1-24 09:36 编辑
欢迎大家来到飞凌爱板网专区,对嵌入式技术感兴趣的朋友不妨多多关注一下,我们提供了公司所有开发板的所有资料,也会更新大量技术文章,欢迎大家一块学习提高!!!
配置信息: 移植内核:linux-3.3.5 可以从 http://www.kernel.org/ 下载纯正的版本 编译环境:vmware下ubuntu11.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必须和uboot的ID一致,所修改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")--------------这里跟我们前面配置的Kconfig和mach-types文件中的名字对应,**大小写注意必须一致 ########################################################################################################在当前目录(arch/arm/mach-s3c64xx/)下打开Makefile添加我们的bsp文件 1 obj-$(CONFIG_MACH_OK6410) += mach-ok6410.o ########################################################################################################
修改顶层的Makefile,第195和196行编辑 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。通过tftp在OK6410开发板上运行。 通过Uboot的tftp下载到开发板上 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/ledsgpio.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 我们再次把内核下载到开发板的时候,当你发现ok6410上4盏led灯全亮的时候证明我们移植的led驱动已经成功了。 ################################################################################################################################ 下面来移植一个4.3寸LCD液晶。 首先打开我们的板级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.h和regs-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驱动已经成功移植了
|