How to add customised ATAG variable in U-Boot and Linux kernel?

前端 未结 3 1043
没有蜡笔的小新
没有蜡笔的小新 2020-12-25 08:36

I want to add customized atag variable in U-Boot and Linux kernel.
How can i achieve this?
Is there any procedure to add an ATAG variable i

3条回答
  •  温柔的废话
    2020-12-25 09:16

    Follow this procedure ,

    To achieve this goal, there're 2 parts need to be modified. One is the U-Boot, and the other one is the Linux kernel.

        1.    U-Boot changes required :
    
            A.     Make sure the  CONFIG_CMDLINE_TAG/CONFIG_SETUP_MEMORY_TAGS/CONFIG_INITRD_TAG are defined in you project definition header file ( u-boot/include/configs/am335x_evm.h ), and we  can add our own tag here, eg. CONFIG_CUSTOM_TAG.
    
            B.     Add the structure definition you wanna append w/ ATAG in u-boot/include/asm-arm/setup.h, eg.
    
                #define ATAG_CUSTOM 0x5441000a
                struct tag_custom{
                unsigned char mac_addr[6];
                };
    
            C.    Add the struct at the tail of "u"...
    
                struct tag {
                        struct tag_header hdr;
                        union {
                        struct tag_core         core;
                        struct tag_mem32        mem;
                        struct tag_videotext    videotext;
                        struct tag_ramdisk      ramdisk;
                        struct tag_initrd       initrd;
                        struct tag_serialnr     serialnr;
                        struct tag_revision     revision;
                        struct tag_videolfb     videolfb;
                        struct tag_cmdline      cmdline;
    
                        /*
                         * Acorn specific
                         */
                        struct tag_acorn        acorn;
    
                        /*
                         * DC21285 specific
                         */
                        struct tag_memclk       memclk;
    
                        /****** INFOTECH Custom TAG ********/
    
                       struct tag_custom custom;
                        } u;
                    };
    
            D.    Add implementation code in lib_arm/bootm.c:
    
                static void setup_custom_tag(bd_t *bd);
    
                static void setup_custom_tag(bd_t *bd) {
                    params->hdr.tag = ATAG_CUSTOM;
                       params->hdr.size = tag_size (tag_macaddr);
                    params->u.custom.cmd =0;
                    params = tag_next (params);
                }
    
            E.    Add "#ifdef CONFIG_CUSTOM_TAG / #endif" at every place you change the code.
    
            F.    Done of U-Boot modification.
    
    2. Linux Changes required:
    
            A.    Add parse tag code in linux/arch/arm/kernel/setup.c:
    
                int cmd;
                static int __init parse_tag_custom(const struct tag *tag){
                        printk("u.custom.cmd=%d\n",tag->u.custom.cmd);
                    return 0;
                }
    
                __tagtable(ATAG_MACADDR, parse_tag_custom);
    
            B. Add the structure declaration as U-Boot did in linux/include/asm-arm/setup.h:
    
                #define ATAG_MACADDR 0x5441000a
                struct tag_custom {
                    int cmd;
                };
    
            C. Add the struct at the tail of "u"...
    
                struct tag {
                    struct tag_header hdr;
                   union {
                        struct tag_core         core;
                     struct tag_mem32        mem;
                    struct tag_videotext    videotext;
                    struct tag_ramdisk      ramdisk;
                    struct tag_initrd       initrd;
                    struct tag_serialnr     serialnr;
                    struct tag_revision     revision;
                    struct tag_videolfb     videolfb;
                    struct tag_cmdline      cmdline;
    
                    /*
                     * Acorn specific
                     */
                    struct tag_acorn        acorn;
    
                    /*
                     * DC21285 specific
                     */
                    struct tag_memclk       memclk;
    
                    /* Add Infotech custom tag */
    
                    struct tag_custom      custom;
                    } u;
                };
    
            D. Done w/ Kernel parts.
    

提交回复
热议问题