简体   繁体   中英

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

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 in U-Boot and Linux ?

  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. 
    1. 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.

The latest Linux kernel is attempting to obsolete ATAGS with device trees . However, the setup.h file defines the different ATAG values and structures. To parse these, you need to add them with something like,

static int __init parse_tag_custom(const struct tag *tag)
{
    if (tag->hdr.size > CUSTOM_SIZE) {
         /* Use, storing or acting on passed values */ 
         tag->u.custom;
    }
    return 0;
}

__tagtable(ATAG_CUSTOM, parse_tag_custom);

as found in atags_parse.c . Of course, you need to add these to the values in setup.h .

u-boot is probably less defined as for the most part, it passes arguments via the kernel command line as this is not ARM specific. A command argument or device trees is probably the preferred method. If you gave an example of what type of configuration you need, someone could probably give better guidance.

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM