tiny6410 linux移植

Linux内核移植

  1. 环境

  2. 开发板

Tiny6410  NAND:2G RAM:256M MLC

  1. 操作系统

Fedora10

  1. 交叉编译器

arm-linux-gcc-4.5.1(linux自带)

  1. 内核版本

Linux-2.6.38

  • 准备

配置交叉编译器

 

  • 下载内核

www.kernel.org

  • 解压内核

#tar  -jxvf linux-2.6.38.tar.bz2  -C 路径

  1. NAND Flash移植

  2. 修改根下的Makefile

#vim  Makefile

将约191行修改为:

ARCH        ?=(空格)arm

CROSS_COMPILE   ?= arm-linux-

  1. 执行下面命令生成默认配置文件

# cp  arch/arm/configs/s3c6400_defconfig  .config

如省略这个操作的话,后面会找不到System Type

 

  1. 运行配置菜单,做基本配置

#make  menuconfig

Generalsetup->(/usr/4.5.1/bin/arm-linux-) Cross-compiler tool prefix    

上面的设置可以通过修改内核根下的Makefiel中的如下行实现:

CROSS_COMPILE   ?= arm-linux-

然后再选择如下项目:

SystemType  --->

ARM systemtype (ARM Ltd. Versatile family)  --->

( X)Samsung S3C64XX  

返回上述菜单后,选择:

                System Type->[*] MINI6410  

上面这个选项,首先选上,其他的可以去掉,不确定的可以参考友善之臂的

 

  1. 拷贝友善配套光盘的NAND Flash驱动

drivers/mtd/nand/s3c_nand.c

arch/arm/plat-samsung/include/plat/regs-nand.h

    drivers/mtd/nand/s3c_nand_mlc.fo

drivers/mtd/nand/nand_base.c  

drivers/mtd/nand/Kconfig

drivers/mtd/nand/Makefile

  1. 再次配置nand驱动

#make  menuconfig

做如下选择

        Device Drivers---> 

                <*> Memory Technology Device (MTD) support  --->

                        [*]   MTD partitioning support

                        [*]     Command line partition table parsing 

                        <*>   Direct char device access to MTD devices 

                        <*>   Caching block device access to MTD devices

                        <*>   NAND Device Support  --->

                            <>   NAND Flash supportfor Samsung S3C SoCs  

                                    <*>   NAND Flash support for S3C SoC  

                                 [*]     S3C NAND Hardware ECC

                        上面红色的不配置,UBIFS配置将无效!

 

  1. 执行编译

#make

成功后后面几行出下如下内容

SYSMAP  System.map

  SYSMAP .tmp_System.map

  OBJCOPY arch/arm/boot/Image

  Kernel: arch/arm/boot/Image is ready

  AS     arch/arm/boot/compressed/head.o

  GZIP   arch/arm/boot/compressed/piggy.gzip

  AS     arch/arm/boot/compressed/piggy.gzip.o

  CC     arch/arm/boot/compressed/misc.o

  CC     arch/arm/boot/compressed/decompress.o

  SHIPPED arch/arm/boot/compressed/lib1funcs.S

  AS     arch/arm/boot/compressed/lib1funcs.o

  LD     arch/arm/boot/compressed/vmlinux

  OBJCOPY arch/arm/boot/zImage  内核就是这个

  Kernel: arch/arm/boot/zImage is ready

  Building modules, stage 2.

  MODPOST 16 modules

  1. UBIFS驱动移植

  2. 配置内核支持UBIFS

DeviceDrivers --->

Memory TechnologyDevice (MTD) support --->

UBI - Unsortedblock images --->

Enable UBI

  1. 配置MTD支持UBI接口

File systems --->

Miscellaneous filesystems --->

UBIFS filesystem support

  1. #make

  2. 下载测试

UBIFS: recovery needed

UBIFS: recovery completed

UBIFS: mounted UBI device0, volume 0, name "FriendlyARM-root"

UBIFS: file systemsize:   2066448384 bytes (2018016 KiB,1970 MiB, 2002 LEBs)

UBIFS: journal size:       12517376 bytes (12224 KiB, 11 MiB, 13LEBs)

UBIFS: media format:       w4/r0 (latest is w4/r0)

UBIFS: default compressor:lzo

UBIFS: reserved forroot:  0 bytes (0 KiB)

成功后出现以上内容。

  1. 网卡(DM9000)移植

  2. 修改DM9000网卡头文件

#vi  include/linux/dm9000.h

28行增加

unsigned char    param_addr[6];

 

  1. 修改驱动文件

#vi drivers/net/dm9000.c

大概1586行增加

if (!is_valid_ether_addr(ndev->dev_addr)&& pdata != NULL) {

             mac_src = "param data";

                           memcpy(ndev->dev_addr,pdata->param_addr, 6);

       }

  1. 配置内核

#make  menuconfig

[*] Networking support  ---> 

                Networking options  ---> 

               <*> Packet socket                                               

                 <*> Unix domain sockets  

                [*] TCP/IP networking 

                  [*]   IP: kernel level autoconfiguration                       

                  [*]  IP: DHCP support                                        

                  [*]  IP: BOOTP support                                        

                  [*]  IP: RARP support 

    Device Drivers  --->

        [*] Network device support  ---> 

            [*]   Ethernet (10 or 100Mbit)  --->

                 <*>   DM9000 support  

                [ ]   Ethernet (1000 Mbit)  --->  去掉

  1. Make编译

#make

  1. LCD移植

  2. 修改文件vi arch/arm/plat-samsung/include/plat/map-base.h

#vi arch/arm/plat-samsung/include/plat/map-base.h

第39行增加如下代码:

#define  S3C_VA_LCD   S3C_ADDR(0x01100000)      /*  LCD  */

  1. 复制友善原内核中的arch/arm/mach-s3c64xx/include/mach/regs-lcd.h

#cp ../linux-2.6.38/arch/arm/mach-s3c64xx/include/mach/regs-lcd.h  arch/arm/mach-s3c64xx/include/mach/regs-lcd.h

  1. 将友善原内核的drivers/video/samsung整个文件夹拷贝过来

#cp -arf ../linux-2.6.38/drivers/video/samsung drivers/video/samsung

  1. 修改文件drivers/video/Kconfig

第2068行增加source "drivers/video/samsung/Kconfig"

#vi   drivers/video/Kconfig

  1. 修改文件vi drivers/video/Makefile

#vi drivers/video/Makefile

120行增加

obj-$(CONFIG_FB_S3C_EXT)  += samsung/

  1. 修改文件vi arch/arm/mach-s3c64xx/mach-mini6410.c

#vi arch/arm/mach-s3c64xx/mach-mini6410.c

48行增加

#include  <linux/delay.h>

 

136行mini6410_lcd_power_set函数里的内容改成

if  (power)  {

     gpio_direction_output(S3C64XX_GPF(13), 1); //GPF13是USBpower用的,与lcd无关

     gpio_direction_output(S3C64XX_GPF(15), 1); //GPF15是是真正的一线控制线连PWM1

      /* fire  nRESET  on power  up  */

     gpio_direction_output(S3C64XX_GPN(5),  0); //GPN5好像与lcd也无关,先copy吧

      msleep(10);

     gpio_direction_output(S3C64XX_GPN(5), 1);

      msleep(1);

  } else  {

     gpio_direction_output(S3C64XX_GPF(15), 0);

      gpio_direction_output(S3C64XX_GPF(13), 0);

       }

 

183行:????编译出现错误!!!

default_bpp    = 16,},

的后面增加结构体:

staticstruct map_desc mini6410_lcd_iodesc[] = {

      {

       /* LCD  support  */

       .virtual        = (unsigned  long)S3C_VA_LCD,

       .pfn                =  __phys_to_pfn(S3C_PA_FB),

       .length          = SZ_16K,

       .type              = MT_DEVICE,

                },

};

 

将mini6410_map_io()这个函数中的一个函数引用改成如下。

s3c64xx_init_io(mini6410_lcd_iodesc,ARRAY_SIZE(mini6410_lcd_iodesc));

 

437行增加

        gpio_request(S3C64XX_GPN(5),  "LCD power");

        gpio_request(S3C64XX_GPF(13),  "LCD power");

去掉

gpio_request(S3C64XX_GPE(0),  "LCD power");

  1. 配置内核

#make menuconfig

Powermanagement options  ---> 

[ ] Power Management support  

DeviceDrivers  --->

Graphics support  --->

<*> Support for frame buffer devices  --->

        < >   Samsung S3C framebuffer support                              

        <*>   S3C Framebuffer Support (eXtended)                          

                  Select LCD Type (4.3 inch 480x272 TFT LCD)  --->       

                   <*> Advanced optionsfor S3C Framebuffer       

                         Select BPP(Bits PerPixel) (16 BPP)  --->              

                   (4) Number ofFramebuffers                                

                   [ ] Enable Virtual Screen(NEW)                             

                   [*] Enable DoubleBuffering                  

        [ ] Backlight & LCD devicesupport  --->

        Console display driver support  --->

<*> Framebuffer Console support    

  [*] Bootup logo  --->                                               

      [ ]  Standard black and white Linux logo                        

      [ ]  Standard 16-color Linux logo                                

      [*]  Standard 224-color Linux logo

 

  • 上面第一个绿色行一定要去掉,不然会有:drivers/video/samsung/s3cfb_fimd4x.c:1440:2:error: implicit declaration of function s3c6410_pm_do_save'的错误,郁闷了半天 

  • 上面第二个绿色行也一定要选,不然会有drivers/built-in.o:(.data+0x174):undefined reference to `soft_cursor'的错误。 

  • 重新编译内核并测试

#make

下载内核,如果屏幕出现小企鹅,说明LCD移植成功!

需要和触摸屏一起做才亮!

  1. 触摸屏移植

  2. 触摸屏驱动移植

从友善的配套内核中复制一下文件到新内核的对应文件夹:

arch/arm/mach-s3c64xx/dev-ts-mini6410.c

arch/arm/mach-s3c64xx/include/mach/ts.h

arch/arm/plat-samsung/include/plat/regs-adc.h                  //覆盖

drivers/input/touchscreen/mini6410_1wire_host.c

drivers/input/touchscreen/mini6410-ts.c

drivers/input/touchscreen/ts-if.c

  1. 修改文件arch/arm/mach-s3c64xx/Makefile  

#vi     arch/arm/mach-s3c64xx/Makefile

在文件的末尾添加如下代码:

obj-$(CONFIG_TOUCHSCREEN_MINI6410)  += dev-ts-mini6410.o

  1. 修改文件drivers/input/touchscreen/Makefile

在末尾添加如下代码:

obj-$(CONFIG_TOUCHSCREEN_MINI6410)  += mini6410-ts.o

obj-$(CONFIG_TOUCHSCREEN_1WIRE)  += mini6410_1wire_host.o

obj-$(CONFIG_FB_S3C_EXT_TFT800480)  += ts-if.o

obj-$(CONFIG_FB_S3C_EXT_TFT480272)  += ts-if.o

obj-$(CONFIG_FB_S3C_EXT_X240320)  += ts-if.o

  1. 修改drivers/input/touchscreen/Kconfig

#vi  drivers/input/touchscreen/Kconfig

在190行左右config TOUCHSCREEN_S3C2410的配置项后面加入如下代码(菜单项):

注意!!!下面有缩进行当最左边的缩进至少需要一个TAB缩进。

config  TOUCHSCREEN_MINI6410

tristate  "S3C  touchscreen driver  for  Mini6410"

depends  on  ARCH_S3C2410 ||  ARCH_S3C64XX  || ARCH_S5P64XX  ||  ARCH_S5PC1XX

default  y

help

    Say Y  here  to enable  the  driver for  the  touchscreen on  the

    FriendlyARM  Mini6410 development  board.

    If  unsure, say  N.

    To  compile this  driver  as a  module,  choose M  here:  the

    module will  be  called mini6410-ts.

config  TOUCHSCREEN_1WIRE

tristate "Mini6410  1-Wire  host and  Touch  Screen Driver"

depends  on  MACH_MINI6410

help

    Say  Y here  to  enable the  1-Wire  host and  Touch  Screen driver  for

    FriendlyARM  Mini6410 development  board.

    If  unsure, say  N.

    To  compile this  driver  as a  module,  choose M  here:  the

module  will  be called  mini6410_1wire_host.

  1. 修改文件arch/arm/mach-s3c64xx/mach-mini6410.c

#vi arch/arm/mach-s3c64xx/mach-mini6410.c

将#include  <plat/ts.h>改成#include <mach/ts.h>

在210行左右,将

static  struct s3c2410_ts_mach_info s3c_ts_platform  __initdata  =  {

                .delay                                    =  10000,

                .presc                                    = 49,

                .oversampling_shift          = 2,

};

改成

static  struct s3c_ts_mach_info s3c_ts_platform  __initdata  =  {

                .delay                                    =  0xFFFF,

                .presc                                    =  0xFF,

                .oversampling_shift          = 2,

                .resol_bit                            =  12,

                .s3c_adc_con        = ADC_TYPE_2,

};

在436行将

s3c24xx_ts_set_platdata(&s3c_ts_platform);

改成  

s3c_ts_set_platdata(&s3c_ts_platform);

  1. 修改文件arch/arm/plat-samsung/Makefile

#vi arch/arm/plat-samsung/Makefile

在60行左右,注释掉:obj-$(CONFIG_SAMSUNG_DEV_TS) +=  dev-ts.o,不然会有multiple  definition  of `s3c_device_ts'的错误很奇怪,友善的源码CONFIG_SAMSUNG_DEV_TS=n,而我的源码出来后CONFIG_SAMSUNG_DEV_TS=y,还改不掉。

  1. 修改drivers/input/touchscreen/mini6410-ts.c

#vi   drivers/input/touchscreen/mini6410-ts.c

增加头文件#include<linux/sched.h>。奇怪的是友善的mini6410-ts.c里没这个头文件也能找到需要的东西。

  1. 配置内核

#make    menuconfig

Device  Drivers --->

Input  device  support --->  

         [*]Touchscreens  --->   

            <*> S3C  touchscreen driver  for  Mini6410    

            <*> Mini6410  1-Wire host  and  Touch Screen  Driver

  1. 重新编译内核并测试

#make

测试:

#cat   /dev/touche…….1wire….

按触摸屏,如果终端有乱码出处,说明OK

 

此时,下载到开发板,无法出现图形界面,出现如下错误

Cannotcreate semaphore /tmp/qtembedded-0/QtEmbedded-0 'd'

Error 38Function not implemented 

Cannotget display lock

Aborted

原来是没有设置远程通信。

  1. 设置远程通信

#make menuconfig

General setup  --->

              [*] System V IPC

再编译。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值