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

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

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

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

Способ работы с 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