且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

I.MX6 MAC Address hacking

更新时间:2022-08-12 20:02:49

/**************************************************************************
 *                       I.MX6 MAC Address hacking
 * 说明:
 *     本文记录I.MX6驱动是如何获取MAC地址的。
 *
 *                                  2016-6-24 深圳 南山平山村 曾剑锋
 **************************************************************************/



/*
 * initialize __mach_desc_MX6Q_SABRESD data structure.
 */
MACHINE_START(MX6Q_SABRESD, "Freescale i.MX 6Quad/DualLite/Solo Sabre-SD Board")
    /* Maintainer: Freescale Semiconductor, Inc. */
    .boot_params = MX6_PHYS_OFFSET + 0x100,
    .fixup = fixup_mxc_board,
    .map_io = mx6_map_io,
    .init_irq = mx6_init_irq,
    .init_machine = mx6_sabresd_board_init,        --------------+
    .timer = &mx6_sabresd_timer,                                 |
    .reserve = mx6q_sabresd_reserve,                             |
MACHINE_END                                                      |
                                                                 |
                                                                 |
static void __init mx6_sabresd_board_init(void)    <-------------+
{
    ......
    imx6_init_fec(fec_data);                       --------------------+
    ......                                                             |
}                                                                      |
                                                                       |
void __init imx6_init_fec(struct fec_platform_data fec_data)      <----+
{
    fec_get_mac_addr(fec_data.mac);                      ----------+
    if (!is_valid_ether_addr(fec_data.mac))                        |
        random_ether_addr(fec_data.mac);                           |
                                                                   |
    if (cpu_is_mx6sl())                                            |
        imx6sl_add_fec(&fec_data);                                 |
    else                                                           |
        imx6q_add_fec(&fec_data);                                  |
}                                                                  |
                                                                   |
static int fec_get_mac_addr(unsigned char *mac)         <----------+
{
    unsigned int value;

    value = readl(MX6_IO_ADDRESS(OCOTP_BASE_ADDR) + HW_OCOTP_MACn(0));
    mac[5] = value & 0xff;
    mac[4] = (value >> 8) & 0xff;
    mac[3] = (value >> 16) & 0xff;
    mac[2] = (value >> 24) & 0xff;
    value = readl(MX6_IO_ADDRESS(OCOTP_BASE_ADDR) + HW_OCOTP_MACn(1));
    mac[1] = value & 0xff;
    mac[0] = (value >> 8) & 0xff;

    return 0;
}