kernel(三):kernel移植

news2024/7/4 4:20:28

        本文主要探讨210官方kernel移植。

配置文件选择

    选择配置文件smdkv210_android_defconfig(arch/arm/configs)

修改主Makefile

    配置cpu架构和交叉编译工具链

    vim Makefile

    ARCH            ?= arm
    CROSS_COMPILE   ?= /root/arm-2009q3/bin/arm-none-linux-gnueabi-

初步编译烧录

ubuntu:

    make smdkv210_android_defconfig
    
    make -j4

    cp -r arch/arm/boot/zImage ~/tftp/



uboot:

    tftp 30008000 zImage

    bootm 30008000

        结果显示(无法启动): 

一阶段移植(head.s)

        初步移植未有kernel信息打印则说明一阶段(汇编)异常

        led调试一阶段,添加led熄灭代码逐步测试(初始led亮)

        led亮且未显示解压zImage信息则解压部分异常(实际为物理地址错误)

vim arch/arm/kernel/head.s

/*
 * Kernel startup entry point.
 * ---------------------------
 *
 * This is normally called from the decompressor code.  The requirements
 * are: MMU = off, D-cache = off, I-cache = dont care, r0 = 0,
 * r1 = machine nr, r2 = atags pointer.
 *
 * This code is mostly position independent, so if you link the kernel at
 * 0xc0008000, you call this at __pa(0xc0008000).
 *
 * See linux/arch/arm/tools/mach-types for the complete list of machine
 * numbers for r1.
 *
 * We're trying to keep crap to a minimum; DO NOT add any machine specific
 * crap here - that's what the boot loader (or in extreme, well justified
 * circumstances, zImage) is for.
 */
        __HEAD
ENTRY(stext)
        setmode PSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode

        //test 
        bl led_off
                                                @ and irqs disabled
        mrc     p15, 0, r9, c0, c0              @ get processor id
        bl      __lookup_processor_type         @ r5=procinfo r9=cpuid
        movs    r10, r5                         @ invalid processor (r5=0)?
        beq     __error_p                       @ yes, error 'p'
        bl      __lookup_machine_type           @ r5=machinfo
        movs    r8, r5                          @ invalid machine (r5=0)?
        beq     __error_a                       @ yes, error 'a'
        bl      __vet_atags
        bl      __create_page_tables

        /*
         * The following calls CPU specific code in a position independent
         * manner.  See arch/arm/mm/proc-*.S for details.  r10 = base of
         * xxx_proc_info structure selected by __lookup_machine_type
         * above.  On return, the CPU will be ready for the MMU to be
         * turned on, and r0 will hold the CPU control register value.
         */
        ldr     r13, __switch_data              @ address to jump to after
                                                @ mmu has been enabled
        adr     lr, BSYM(__enable_mmu)          @ return (PIC) address
         ARM(   add     pc, r10, #PROCINFO_INITFUNC     )
         THUMB( add     r12, r10, #PROCINFO_INITFUNC    )
         THUMB( mov     pc, r12                         )
ENDPROC(stext)





//led off

led_off:
        ldr r3, =0x11111111
        ldr r4, = 0xE0200240
        str r3, [r4]

        ldr r3, =0xff
        ldr r4, =0xE0200244
        str r3, [r4]

        mov pc, lr

        修改物理地址

#define KERNEL_RAM_VADDR	(PAGE_OFFSET + TEXT_OFFSET)
#define KERNEL_RAM_PADDR	(PHYS_OFFSET + TEXT_OFFSET)

(arch/arm/include/asm/memory.h)#define PAGE_OFFSET        UL(CONFIG_PAGE_OFFSET)
(.config)CONFIG_PAGE_OFFSET=0xC0000000


修改为

(arch/arm/mach-s5pv210/include/mach/memory.h)
#if defined(CONFIG_MACH_SMDKV210)
#define PHYS_OFFSET             UL(0x30000000)
#else
#define PHYS_OFFSET             UL(0x30000000)
#endif

        修改解压地址
 

vim  arch/arm/mach-spv210/Makefile.boot

# override for SMDKV210
zreladdr-$(CONFIG_MACH_SMDKV210)    := 0x30008000
params_phys-$(CONFIG_MACH_SMDKV210)    := 0x30000100

 

        内核机器码确定分析
            MACHINE_START宏定义机器码数据结构(硬件信息及其相关初始化函数等)
            每个mach-xxx.c文件定义一个机器码machine_desc结构体变量且结构体变量被定义到段(.arch.info.init)    

(arch/arm/mach-s5pv210/s5pc110.c)
    #ifdef CONFIG_MACH_SMDKC110
    MACHINE_START(SMDKC110, "SMDKC110")
    #elif CONFIG_MACH_SMDKV210
    MACHINE_START(SMDKV210, "SMDKV210")
    #endif
    /* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
    .phys_io    = S3C_PA_UART & 0xfff00000,
    .io_pg_offst    = (((u32)S3C_VA_UART) >> 18) & 0xfffc,
    .boot_params    = S5P_PA_SDRAM + 0x100,
    .init_irq    = s5pv210_init_irq,
    .map_io        = smdkc110_map_io,
    .init_machine    = smdkc110_machine_init,
    .timer        = &s5p_systimer,
    MACHINE_END


    (.config)
    CONFIG_MACH_SMDKV210=y
    # CONFIG_MACH_SMDKC110 is not set


    (arch/arm/include/asm/mach/arch.h)
    #define MACHINE_START(_type,_name)            \
    static const struct machine_desc __mach_desc_##_type    \
     __used                            \
     __attribute__((__section__(".arch.info.init"))) = {    \
        .nr        = MACH_TYPE_##_type,        \
        .name        = _name,

    #define MACHINE_END                \
};


推导出():
static const struct machine_desc __mach_desc_SMDKV210    \
 __used                            \
 __attribute__((__section__(".arch.info.init"))) = {    \
    .nr        = MACH_TYPE_SMDKV210,        \
    .name        = "SMDKV210",
    .phys_io    = S3C_PA_UART & 0xfff00000,
    .io_pg_offst    = (((u32)S3C_VA_UART) >> 18) & 0xfffc,
    .boot_params    = S5P_PA_SDRAM + 0x100,
    .init_irq    = s5pv210_init_irq,
    .map_io        = smdkv210_map_io,
    .init_machine    = smdkv210_machine_init,
    .timer        = &s5p_systimer,
};

二阶段 

        修改电源异常

                程序在dev_driver_string或max8698_pmic_probe异常
                max8698_pmic_probe为电源管理IC驱动安装函数,210未使用电源IC

                make menuconfig取消max8698编译进内核

        修改网卡异常

                     修改网卡寄存器配置(移植mach-x210.c)
    

smdkc110_machine_init==>smdkc110_dm9000_set

#ifdef CONFIG_DM9000
static void __init smdkc110_dm9000_set(void)
{
        unsigned int tmp;

        s3c_gpio_cfgpin(S5PV210_GPH1(2), S3C_GPIO_INPUT);
        s3c_gpio_setpull(S5PV210_GPH1(2), S3C_GPIO_PULL_NONE);

        int ret = gpio_request(S5PV210_GPH1(2), "GPH1");
        if(ret)
                printk("mach-x210: request gpio GPH1(2) fail");
        else
        {
                s3c_gpio_cfgpin(S5PV210_GPH1(2), 0xf);
                s3c_gpio_setpull(S5PV210_GPH1(2), S3C_GPIO_PULL_NONE);
        }
        tmp = ((0<<28)|(0<<24)|(5<<16)|(0<<12)|(0<<8)|(0<<4)|(0<<0));
        __raw_writel(tmp, S5P_SROM_BC1);

        tmp = __raw_readl(S5P_SROM_BW);
        tmp &= ~(0xf << 4);
        tmp |= (1<<7) | (1<<6) | (1<<5) | (1<<4); // dm9000 16bit
        __raw_writel(tmp, S5P_SROM_BW);

        tmp = __raw_readl(S5PV210_MP01CON);
        tmp &= ~(0xf << 4);
        tmp |= (2 << 4);

        __raw_writel(tmp, S5PV210_MP01CON);
}

                        修改网卡地址和中断号(arch/arm/plat-s5p/devs.c)

/* DM9000 registrations */
#ifdef CONFIG_DM9000
static struct resource s5p_dm9000_resources[] = {
    [0] = {
        .start = S5P_PA_DM9000,
        .end   = S5P_PA_DM9000,
        .flags = IORESOURCE_MEM,
    },
    [1] = {
#if defined(CONFIG_DM9000_16BIT)
        //.start = S5P_PA_DM9000 + 2,
        //.end   = S5P_PA_DM9000 + 2,
        .start = S5P_PA_DM9000 + 4,
        .end   = S5P_PA_DM9000 + 4,
        .flags = IORESOURCE_MEM,
#else
        .start = S5P_PA_DM9000 + 1,
        .end   = S5P_PA_DM9000 + 1,
        .flags = IORESOURCE_MEM,
#endif
    },
    [2] = {
        //.start = IRQ_EINT9,
        //.end   = IRQ_EINT9,
        .start = IRQ_EINT10,
        .end   = IRQ_EINT10,
        .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
    }
};


依据

struct platform_device s5p_device_dm9000 = {
    .name        = "dm9000",
    .id        =  0,
    .num_resources    = ARRAY_SIZE(s5p_dm9000_resources),
    .resource    = s5p_dm9000_resources,
    .dev        = {
        .platform_data = &s5p_dm9000_platdata,
    }
};

                        修改bank

(arch/arm/mach-s5pv210/include/mach/map.h)

//#define S5PV210_PA_DM9000       (0xA8000000)
#define S5PV210_PA_DM9000       (0x88000000)
#define S5P_PA_DM9000           S5PV210_PA_DM9000

                        结果显示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1308528.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS应用程序框架

应用程序入口—UIAbility的使用 UIAbility概述 UIAbility是一种包含用户界面的应用组件&#xff0c;主要用于和用户进行交互。UIAbility也是系统调度的单元&#xff0c;为应用提供窗口在其中绘制界面。 每一个UIAbility实例&#xff0c;都对应于一个最近任务列表中的任务。 …

【论文阅读】MAKE-A-VIDEO: TEXT-TO-VIDEO GENERATION WITHOUT TEXT-VIDEO DATA

Make-a-video:没有文本-视频数据的文本-视频生成。 paper&#xff1a; code&#xff1a; ABSTRACT 优点: (1)加速了T2V模型的训练(不需要从头开始学习视觉和多模态表示)&#xff0c; (2)不需要配对的文本-视频数据&#xff0c; (3)生成的视频继承了当今图像生成模型的庞大…

HBase 高可用集群详细图文安装部署

目录 一、HBase 安装部署 1.1 Zookeeper 正常部署 1.2 Hadoop 正常部署 1.3 HBase 安装 1.4 HBase 的配置文件 1.4.1 hbase-env.sh 1.4.2 hbase-site.xml 1.4.3 regionservers 1.4.4 创建目录 1.5 HBase 远程发送到其他节点 1.6 HBase 服务的启动 1.6.1 单点…

用友时空 KSOA 多处SQL注入漏洞复现

0x01 产品简介 用友时空 KSOA 是建立在 SOA 理念指导下研发的新一代产品,是根据流通企业前沿的 IT 需求推出的统一的IT基础架构,它可以让流通企业各个时期建立的 IT 系统之间彼此轻松对话。 0x02 漏洞概述 用友时空 KSOA 系统 PayBill、QueryService、linkadd.jsp等接口处…

数字化赋能实体经济,凌雄科技发挥DaaS模式提质增效价值

11月中旬&#xff0c;市场监管总局发布了2023年前三季度经营主体数据。其中&#xff0c;前三季度全国新设民营企业总计706.5万户&#xff0c;截至9月底&#xff0c;全国登记在册的民营企业数量超过5200万户&#xff0c;在企业总量中占比高达92.3%。如何帮助民营企业实现高质量发…

中海达亮相能源北斗与时空智能创新技术应用大会

12月7日-8日&#xff0c;2023年能源北斗与时空智能创新技术应用大会暨鹭岛论坛在厦门举办。本次活动以“能源北斗时空智能”为主题&#xff0c;由中关村智能电力产业技术联盟、中国能源研究会、中国卫星导航定位协会、中国电力科学研究院有限公司、国网信息通信产业集团有限公司…

探索 Vim:一个强大的文本编辑器

引言&#xff1a; Vim&#xff08;Vi IMproved&#xff09;是一款备受推崇的文本编辑器&#xff0c;拥有强大的功能和高度可定制性&#xff0c;提供丰富的编辑和编程体验。本文将探讨 Vim 的基本概念、使用技巧以及为用户带来的独特优势。 简介和发展 1. Vim 的简介和历史 V…

0基础学习VR全景平台篇第127篇:什么是VR全景/720全景漫游?

“全景”作为一种表现宽阔视野的手法&#xff0c;在很久之前就得到了普遍的认同。北宋年间&#xff0c;由张择端绘制的《清明上河图》就是一幅著名的全景画。摄影术出现后&#xff0c;全景摄影也随之而生。 到今天&#xff0c;全景拍摄不再被专业摄影师所独享&#xff0c;广大…

uniapp 之 图片 视频 文件上传

<view class"" style"padding: 24rpx 0"><text>相关资料 <text class"fs-26 color-666">&#xff08;图片、视频、文档不超过9个&#xff09;</text> </text><view class"flex align-center" style&…

CNN 卷积神经网络之 DenseNet 网络的分类统一项目(包含自定义数据集的获取)

1. DenseNet 网络介绍 本章实现的项目是DenseNet 网络对花数据集的五分类&#xff0c;下载链接&#xff1a; 基于迁移学习的 DenseNet 图像分类项目 DenseNet 网络是在 ResNet 网络上的改进&#xff0c;大概的网络结构如下&#xff1a; 1.1 卷积的简单介绍 图像识别任务主要…

通过 RIOT 将 AWS ElastiCache 迁移到阿里云 Tair

本文通过示例介绍了 RIOT 如何轻松地将数据从 AWS ElastiCache 迁移到云原生内存数据库&#xff08;如 Tair 和云数据库 Redis 版&#xff09;。 1. 准备资源迁移 1.1. 源代码 AWS ElastiCache cache.r6g.xlarge。它有三个数据分片&#xff0c;与 Redis 6.2 兼容。 AWS EC2 t2.…

共建开源新里程:北京航空航天大学OpenHarmony技术俱乐部正式揭牌成立

12月11日,由OpenAtom OpenHarmony(以下简称“OpenHarmony”)项目群技术指导委员会(以下简称“TSC”)和北京航空航天大学共同举办的“OpenHarmony软件工程研讨会暨北京航空航天大学OpenHarmony技术俱乐部成立仪式”在京圆满落幕。 现场大合影 活动当天,多位重量级嘉宾出席了此次…

2023.12.14 hive sql的聚合增强函数 grouping set

目录 1.建库建表 2.需求 3.使用union all来完成需求 4.聚合函数增强 grouping set 5.聚合增强函数cube ,rollup 6.rollup翻滚 7.聚合函数增强 -- grouping判断 1.建库建表 -- 建库 create database if not exists test; use test; -- 建表 create table test.t_cookie(month …

理解 Proxy 和 Object.defineProperty:提升你的 JavaScript 技能(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

华为配置基本QinQ示例

组网需求 如图1所示&#xff0c;网络中有两个企业&#xff0c;企业1有两个分支&#xff0c;企业2有两个分支。这两个企业的各办公地的企业网都分别和运营商网络中的SwitchA和SwitchB相连&#xff0c;且公网中存在其它厂商设备&#xff0c;其外层VLAN Tag的TPID值为0x9100。 现…

ffmpeg编解码——数据包(packet)概念(如何正确处理数据包中的显示时间戳pts与解码时间戳dts关系?)

文章目录 FFmpeg编解码——数据包&#xff08;Packet&#xff09;概念1. 数据包&#xff08;Packet&#xff09;简介2. 数据包&#xff08;Packet&#xff09;在FFmpeg中的应用2.1 从媒体文件读取数据包2.2 向媒体文件写入数据包 3. 数据包&#xff08;Packet&#xff09;相关问…

智能优化算法应用:基于鸽群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鸽群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鸽群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鸽群算法4.实验参数设定5.算法结果6.参考文献7.MA…

数据结构-06-散列/哈希表

1-什么是散列表 散列表用的是数组支持按照下标随机访问数据的特性&#xff0c;所以散列表其实就是数组的一种扩展&#xff0c;由数组演化而来。可以说&#xff0c;如果没有数组&#xff0c;就没有散列表。散列表中的元素在数组的位置(index)是通过散列函数得到的。 2-散…

C语言 联合体验证 主机字节序 +枚举

联合体应用&#xff1a;验证当前主机的大小端&#xff08;字节序&#xff09; //验证当前主机的大小端 #include <stdio.h>union MyData {unsigned int data;struct{unsigned char byte0;unsigned char byte1;unsigned char byte2;unsigned char byte3;}byte; };int main…

华为OD机试-传递悄悄话(JavaPythonGo)100%通过率

题意 给定一个二叉树,每个节点上站着一个人,节点数字表示父节点到该节点传递悄悄话需要花费的时间。初始时,根节点所在位置的人有一个悄悄话想要传递给其他人,求二又树所有节点上的人都接收到悄悄话花费的时间。 输入 给定一叉树 09 20-1-1 157-1-1-1-132 注:-1表示空节…