android移植(一)-s3c2416内核的移植

板子helper2416    芯片是三星的s3c2416  arm平台   本机系统: opensuse 

以下只是记录曾经的瞎搞过程,可能有些乱。 要在板子上运行andoid首先得有一个支持android的内核

下载内核

$ git clone https://android.googlesource.com/kernel/samsung.git
$ ls -a
.  ..  .git


$ git branch -r
origin/HEAD -> origin/master
origin/android-samsung-2.6.35-gingerbread
origin/android-samsung-3.0-ics-mr1
origin/master


$ git checkout origin/android-samsung-3.0-ics-mr1
hecking out files: 100% (37465/37465), done.
Previous HEAD position was eef8e7b... empty commit
HEAD is now at 6656123... ARM: s5pv210: herring: don't disable prox sensor during suspend


$ ls
arch     CREDITS        drivers   include  Kbuild   lib          mm      REPORTING-BUGS  security  usr
block    crypto         firmware  init     Kconfig  MAINTAINERS  net     samples         sound     virt
COPYING  Documentation  fs        ipc      kernel   Makefile     README  scripts         tools


上面版本为 3.0.8


由help2416的内核与同版本的内核比较,生成patch,然后把patch打到下载的android 内核上,冲突的手动解决
编译通过后,启动出现
Memory policy: ECC disabled, Data cache writeback
<4>BUG: not creating mapping for 0x56000000 at 0x03000000 in user region


Linux内核访问外设I/O内存资源的方式有两种:动态映射(ioremap)和静态映射(map_desc)
static void __init create_mapping(struct map_desc *md)
{
    unsigned long addr, length, end;
    phys_addr_t phys;
    const struct mem_type *type;
    pgd_t *pgd;


    if (md->virtual != vectors_base() && md->virtual < TASK_SIZE) { //0x03000000这个是virtual找到对应这个就能知道哪里错
        printk(KERN_WARNING "BUG: not creating mapping for 0x%08llx"
               " at 0x%08lx in user region\n",
               (long long)__pfn_to_phys((u64)md->pfn), md->virtual);
        return;
    }
.................
}


arch/arm/mach-s3c2416/s3c2416.c
static struct map_desc s3c2416_iodesc[] __initdata = {
    IODESC_ENT(WATCHDOG),
    IODESC_ENT(CLKPWR),
    IODESC_ENT(TIMER),
};
iotable_init(s3c2416_iodesc, ARRAY_SIZE(s3c2416_iodesc));


struct map_desc {
    unsigned long virtual; 0x03000000
    unsigned long pfn;  //0x56000000 这两个值是出错值
    unsigned long length;
    unsigned int type;
};


#define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, __phys_to_pfn(S3C24XX_PA_##x), S3C24XX_SZ_##x, MT_DEVICE }


由代码可知,可能是S3C24XX_VA_WATCHDOG/CLKPWR/TIMER 中的一个或几个值不对 或者是S3C24XX_PA_xx中某个不对


另外还有一处可能是出错处
arm/mach-s3c2416/mach-smdk2416.c
static void __init smdk2416_map_io(void)
{
    s3c24xx_init_io(smdk2416_iodesc, ARRAY_SIZE(smdk2416_iodesc)); //这个函数里处理了smdk2416_iodesc还处理了s3c_iodesc
}


static struct map_desc s3c_iodesc[] __initdata = {
    IODESC_ENT(GPIO),
    IODESC_ENT(IRQ),
    IODESC_ENT(MEMCTRL),
    IODESC_ENT(UART)
};


调试发现,出错出为GPIO处
#define S3C2410_PA_GPIO    (0x56000000)
#define S3C24XX_VA_GPIO    ((S3C24XX_PA_GPIO - S3C24XX_PA_UART) + S3C24XX_VA_UART)
#define S3C24XX_SZ_GPIO    SZ_1M


S3C24XX_VA_GPIO = (0x56000000 - 0x50000000) + (0xFC000000 + 0x01000000)  = 0x03000000
解决方法
arch/arm/plat-samsung/include/plat/map-base.h
#define S3C_ADDR_BASE   (0xFC000000)
改成
#define S3C_ADDR_BASE   0xF6000000


另外启动时发现,打印信息都会打两次
比如
<6>usbcore: registered new interface driver usbfs
usbcore: registered new interface driver usbfs


查看printk源码
在vprintk中多了以下代码
#ifdef  CONFIG_DEBUG_LL
    printascii(printk_buf);
#endif


menuconfig中下面选项不配置
[ ] Kernel low-level debugging functions


=======================================================================================
kernel运行声卡驱动出问题
Error: Driver 'samsung-audio' is already registered, aborting...
ALSA device list:
  No soundcards found.


搜索发现有两处driver的  name都是"samsung-audio",而且这两个driver都编译进内核,导致冲突
sound/soc/samsung/dma.c
sound/soc/samsung/s3c-dma-wrapper.c


sound/soc/samsung/Makefile
snd-soc-s3c24xx-objs := dma.o s3c-dma-wrapper.o 
改成snd-soc-s3c24xx-objs := dma.o


此时还是无法识别声卡
sound/soc/samsung/dma.c


#ifndef CONFIG_S5P_INTERNAL_DMA  //这行去掉


static int __devinit samsung_asoc_platform_probe(struct platform_device *pdev)
{
    return snd_soc_register_platform(&pdev->dev, &samsung_asoc_platform);
}
.......
#endif //这行去掉


sound/soc/codecs/wm8753.c
static struct i2c_driver wm8753_i2c_driver = {
    .driver = {
        .name = "wm8753-codec", //注意这里与3.2.11不同
        .owner = THIS_MODULE,
.........
}


/sound/soc/samsung/smdk2416_wm8753.c
static struct snd_soc_dai_link smdk6400_dai[] = {
{ /* Hifi Playback - for similatious use with voice below */
    .name = "WM8753",
    .stream_name = "WM8753 HiFi",
    //.cpu_dai = &s3c_i2s_dai,
    //.codec_dai = &wm8753_dai[WM8753_DAI_HIFI],
    .platform_name = "samsung-audio",
    .cpu_dai_name = "s3c24xx-iis",
    .codec_dai_name = "wm8753-hifi",
    .codec_name = "wm8753-codec.0-001a", //"wm8753.0-001a", //相应改这里
    .init = smdk6400_wm8753_init,
    .ops = &smdk6400_hifi_ops,
},
};


再编译运行kernel打印出错
clk_get: could not find clock iis for dev 0xc03e9f38 (s3c24xx-iis)


arch/arm/plat-s3c24xx/s3c2443-clock.c
static struct clk init_clocks_off[] = {
    //加上
    {
        .name       = "iis", //这个是针对s3c24xx-iis的
        .id     = -1,
        .parent     = &clk_p,
        .enable     = s3c2443_clkcon_enable_p,
        .ctrlbit    = S3C2443_PCLKCON_IIS,
    }, {
        .name       = "hsspi", //这个是spi的,跟上面的错误无关,随便加的
        .id     = -1,
        .parent     = &clk_p,
        .enable     = s3c2443_clkcon_enable_p,
        .ctrlbit    = S3C2443_PCLKCON_HSSPI,
    },
}


arch/arm/mach-s3c2410/include/mach/regs-s3c2443-clock.h
加上
#define S3C2443_PCLKCON_HSSPI       (1<<6)


选中Android内核必须选项
Kernel Features  ---> [*] Use the ARM EABI to compile the kernel
Device Drivers ---> [*] Staging drivers  --->       Android  --->  
[*] Android Drivers
[*]   Android Binder IPC Driver
<*>   Android log driver
[*]   Android RAM buffer console
[*]     Enable verbose console messages on Android RAM console (NEW)
[*]     Android RAM Console Enable error correction  --->
[ ]     Start Android RAM console early (NEW)
[*]   Timed output class driver (NEW)
<*>     Android timed gpio driver
[*]   Android Low Memory Killer


-> General setup--> [ ] Configure standard kernel features (expert users)  --->
-> General setup-->[*]Enable the Anonymous Shared Memory Subsystem
-> System Type-->[*]Support Thumb user binaries
   作者:帅得不敢出门   c++哈哈堂群:31843264  转载请保留此信息
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值