MAC-адреса в модулях Q7 Baikal

MAC-адреса в модулях устанавливаются двумя способами:

Вычитываются из I2C EEPROM 24AA025E48T-I/OT с прошитым EUI-48

Через переменные окружения U-boot (ethaddr и eth1addr)

Способ работы с MAC-адресами определяется на этапе сборки U-boot.

В розничных модулях по умолчанию прошит 1-й способ.

I2C EEPROM с EUI-48

На модуле установлены 2 I2C EEPROM 24AA025E48T-I/OT.

Они работают на I2С-шине с контроллером 0x1f047000. На шине так же висит RTC, STM32 WD. Шина только на модуле, на разъем Q7 не выведена.

U-boot вычитывает EUI из EEPROM и устанавливает их в переменные U-boot ethaddr и eth1addr. Переопределять эти переменные нельзя.

EEPROM прописаны в DTS, поэтому драйвер atmel,24c02 добавляет их в sysfs.

[root@baikal_t1_uq7 ~]# hexdump -C /sys/bus/i2c/devices/1-0052/eeprom
00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
000000f0 ff ff ff ff ff ff ff ff ff ff 80 1f 12 30 0b d8 |.............0..|
00000100
[root@baikal_t1_uq7 ~]# hexdump -C /sys/bus/i2c/devices/1-0053/eeprom
00000000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
000000f0 ff ff ff ff ff ff ff ff ff ff 80 1f 12 30 73 8d |.............0s.|
00000100
[root@baikal_t1_uq7 ~]# i2cdetect -y -r 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- 1a -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- UU UU -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- 6a -- -- -- -- --
70: -- -- -- -- -- -- -- --
[root@baikal_t1_uq7 ~]#

Переменные окружения

В варианте, когда U-boot не вычитывает EEPROM с мак-адресами, необходимо самостоятельно иницилизировать переменнные окружения с желаемым адресом. В u-boot по умолчанию вкомпилированы адреса 4c:a5:15:9e:ce:20 и 4c:a5:15:9e:ce:21.

Переменные окружения хранятся в NOR SPI Flash, в которую прошит U-boot:

[root@baikal_t1_uq7 ~]# cat /proc/mtd
dev: size erasesize name
mtd0: 000c0000 00010000 "bootloader"
mtd1: 00010000 00010000 "environment"
mtd2: 00010000 00010000 "information"
mtd3: 00010000 00010000 "fdt"
mtd4: 00e90000 00010000 "fitimage"
mtd5: 00080000 00010000 "configs"

Переменные MAC-адреса, в отличие от других нельзя переопределить в U-boot, поэтому это делается из-под Linux с помощью утилит fw_printenv и fw_setenv.

Для начала нужно убедиться, что область переменных окружения валидна. Об этом пишет U-boot при старте:

Переменнные окружения вычитаны успешно

** Переменнные окружения не вычитаны **

Переменные окружения с точки зрения U-boot

U-boot вычитывает переменные окружения либо из из области flash, которая опеределна на этапе компиляции, либо использует вкомпилированные переменные окружения (если область flash невалидна). Во случае невалидности необходимо выполнить команду saveenv в консоли U-boot. Так вкомпилированные переменные попадут во Flash.

BAIKAL # saveenv
Saving Environment to SPIFlash... Erasing SPI flash...Writing to SPI flash...done
OK
BAIKAL #

Переменные окружения с точки зрения Linux

Linux читает переменные окружения опираясь на /etc/fw_env.config

[root@baikal_t1_uq7 ~]# cat /etc/fw_env.config
# MTD device name	Device offset	Env. size	Flash sector size	Number of sectors
/dev/mtd1	0x0	0x10000

Если MTD device невалиден, то используются переменные окружения из /etc/u-boot-initial-env

Оба файла задаются на этапе сборке rootfs.

Linux должен корректно вычитывать переменные через fw_printenv (не должно быть сообщения using default environment).

Переопределение MAC-адреса из Linux

Команда записи переменной окружения ethaddr:

fw_setenv ethaddr aa:bb:cc:dd:ee:ff

После перезагрузки MAC-адрес должен быть применен к сетевому интерфейсу и читаться через ifconfig

[root@baikal_t1_uq7 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr AA:BB:CC:DD:EE:FF
inet addr:192.168.1.209 Bcast:192.168.1.255 Mask:255.255.255.0