3.2 Введение в настройку модуля
3.2.1 Инструкция по настройке menuconfig
Для лонгана среды Linux-4.9 войдите в корневой каталог ядра, выполните make ARCH=arm menuconfig
(make ARCH=arm64 menuconfig на 64-битной платформе).
Войдите в основной интерфейс конфигурации и выполните следующие действия.
Для лонгана среды Linux-5.4, вы можете напрямую выполнить ./build.sh menuconfig в корневом
каталоге лонгана.
Для среды Tina вы можете выполнить make kernel_menuconfig в корневом каталоге,
чтобы войти в интерфейс конфигурации menuconfig.
1. Настройте стек сетевых протоколов
Конфигурация стека сетевых протоколов
2. Отметьте флажком драйвер GMAC
Конфигурация драйвера GMAC
Примечание. Если используется встроенный PHY SOC, то необходимо выполнить
шаги 3 и 4 настройки. В настоящее время встроенный EPHY используют только SOC ТВ-серии и
некоторые платформы серии H, например TV303, H3, H6, H313, H616.
Для других платформ можно пропустить.
3. Отметьте флажком драйвер SUNXI-EPHY (конфигурирование драйвера АСХ00).
ACX00 внутри SOC инкапсулирует EPHY, поэтому сначала необходимо включить поддержку устройства ACX00:
Конфигурация драйвера ACX00
4. Затем отметьте драйвер SUNXI-EPHY
Конфигурация драйвера EPHY
3.2.2 Инструкция по настройке дерева устройств
Настройте контроллер GMAC в дереве устройств. Один контроллер GMAC соответствует
одному узлу устройства GMAC.
Конфигурация дерева устройств модуля EMAC находится в каталоге ядра по пути:
для ARM 64 - arch/arm64/boot/dts/sunxi/xxxxx.dtsi
для ARM 32 - arch/arm/boot/dts/xxxxx.dtsi,
для RISCV - arch/riscv/boot/dts/
Конфигурация под ядро linux-4.9 выглядит следующим образом:
gmac0: eth@05020000
{
compatible = "allwinner,sunxi-gmac";
reg = <0x0 0x05020000 0x0 0x10000>,
<0x0 0x03000030 0x0 0x4>;
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "gmacirq";
clocks = <&clk_gmac0>, <&clk_ephy_25m>;
clock-names = "gmac", "ephy";
device_type = "gmac0";
pinctrl-0 = <&gmac_pins_a>;
pinctrl-1 = <&gmac_pins_b>;
pinctrl-names = "default", "sleep";
phy-mode;
tx-delay = <7>;
rx-delay = <31>;
phy-rst;
gmac-power0;
gmac-power1;
gmac-power2;
status = "disabled";
};
Свойства в дереве устройств означают:
'compatible' («совместимый») - представляет конкретное устройство, которое
используется для привязки драйвера и устройства;
'reg' - адрес, используемый устройством;
'interrupts' - прерывания, используемые устройством;
'clocks' - тактовый синхрогенератор ("часы"), используемый устройством;
'pinctrl-0' - конфигурация GPIO в активном состоянии устройства
'pinctrl-1' - конфигурация GPIO в состоянии остановки устройства
'phy-mode' - физический интерфейс между GMAC и PHY, такой как MII, RMII, RGMII и т.д.
'tx-delay' - задержка синхроимпульсов передачи, значение tx-delay составляет 0-7, первая
передача составляет около 536 пс (пикосекунд)
'rx-delay' - задержка синхроимпульсов приема, значение rx-delay 0-31, первая
передача составляет около 186 пс (пикосекунд)
'phy-rst' - контакт сброса PHY
'gmac-powerX' - контакт питания gmac «gmac-powerX», настроить в соответствии с реальной ситуацией
'status' - состояние, включить-отключить узел устройства
В linux-5.4 конфигурация TWI несколько отличается от конфигурации ядра linux-4.9,
разница в основном в синхрогенераторе и dma.
gmac0: eth@4500000
{
compatible = "allwinner,sunxi-gmac";
reg = <0x0 0x04500000 0x0 0x10000>,
<0x0 0x03000030 0x0 0x4>;
interrupts-extended = <&plic0 62 IRQ_TYPE_LEVEL_HIGH>;
interrupt-names = "gmacirq";
clocks = <&ccu CLK_BUS_EMAC0>, <&ccu CLK_EMAC0_25M>;
clock-names = "gmac", "ephy";
resets = <&ccu RST_BUS_EMAC0>;
device_type = "gmac0";
pinctrl-0 = <&gmac_pins_a>;
pinctrl-1 = <&gmac_pins_b>;
pinctrl-names = "default", "sleep";
phy-mode = "rgmii";
use_ephy25m = <1>;
tx-delay = <7>;
rx-delay = <31>;
phy-rst = <&pio PA 14 GPIO_ACTIVE_LOW>;
gmac-power0;
gmac-power1;
gmac-power2
status = "disabled";
}
gmac_pins_a, gmac_pins_a — узлы дерева для конфигурации выводов EMAC
Путь этой конфигурации в lixnu4.9 — arch/arm64 (для 32-битной платформы — arm) /boot/dts/sunxi/xxxxpinctrl
dtsi выглядит следующим образом:
gmac_pins_a: gmac@0
{
allwinner,pins = "PI0", "PI1", "PI2", "PI3",
"PI4", "PI5", "PI6", "PI7",
"PI8", "PI9", "PI10", "PI11",
"PI12", "PI13", "PI14", "PI15",
"PI16";
allwinner,function = "gmac0";
allwinner,muxsel = <2>;
allwinner,drive = <3>;
allwinner,pull = <0>;
};
gmac_pins_b: gmac@1
{
allwinner,pins = "PI0", "PI1", "PI2", "PI3",
"PI4", "PI5", "PI6", "PI7",
"PI8", "PI9", "PI10", "PI11",
"PI12", "PI13", "PI14", "PI15",
"PI16";
allwinner,function = "io_disabled";
allwinner,muxsel = <7>;
allwinner,drive = <3>;
allwinner,pull = <0>;
};
pins - означают контакты GPIO, используемые xMII
function - имя функции, используемой pinctrl
muxsel - мультиплексирование выводов GPIO, необходимо проверить спецификацию для установки
drive - GPIO pin drive capability
pull - подтянутое состояние выходного уровня
Примечание. Конфигурация контактов на разных платформах различается.
Путь этой конфигурации в linux-5.4
arch/arm64 (32-битная платформа — arm)/boot/dts/sunxi/xxxx.dtsi
Дерево устройств выглядит так:
gmac_pins_a: gmac@0
{
pins = "PA0", "PA1", "PA2", "PA3",
"PA4", "PA5", "PA6", "PA7",
"PA8", "PA10", "PA11", "PA12",
"PA13", "PA17", "PA18", "PA28",
"PA29", "PA30", "PA31";
function = "gmac0";
drive-strength = <10>;
};
gmac_pins_b: gmac@1
{
pins = "PA0", "PA1", "PA2", "PA3",
"PA4", "PA5", "PA6", "PA7",
"PA8", "PA10", "PA11", "PA12",
"PA13", "PA17", "PA18", "PA28",
"PA29", "PA30", "PA31";
function = "gpio_in";
drive-strength = <10>;
};
pins - означают контакты GPIO, используемые xMII;
function - имя функции, используемой «функцией» pinctrl;
drive-strength - возможность подключения к выводам GPIO,
подробности см. в документации по GPIO;
Кроме того, clk_gmac0 и clk_ephy_25m являются узлами синхрогенератора
В linux-4.9 путь — arch/arm64 (32-битная платформа — arm) /boot/dts/sunxi/XXXX-clk.dtsi
Дерево устройств выглядит следующим образом:
clk_gmac0_25m: gmac0_25m
{
#clock-cells = <0>;
compatible = "allwinner,periph-clock";
clock-output-names = "gmac0_25m";
};
clk_gmac0: gmac0
{
#clock-cells = <0>;
compatible = "allwinner,periph-clock";
clock-output-names = "gmac0";
};
3.2.3 Пользовательский физический уровень AllWinner
Часть SOC AllWinner объединяет AC200 и AC300.
AC200 и AC300 имеют внутренний интегрированный EPHY.
3.2.3.1 АС200
ARM связывается с AC200 через TWI, инициализирует EPHY,
а затем MAC обращается к EPHY через шину MDIO.
Модуль PWM обеспечивает внутреннюю тактовую частоту 25M для EPHY.
Общая блок-схема AC200 выглядит следующим образом:
3.2.3.2 АС300
ARM связывается с AC300 через шину MDIO, инициализирует EPHY,
а затем MAC связывается с AC300 через шину MDIO.
Модуль PWM обеспечивает внутреннюю тактовую частоту 25M для EPHY.
Общая блок-схема AC300 выглядит следующим образом:
3.2.4 Инструкции по настройке board.dts
3.2.4.1 Конфигурация интерфейса RGMII
Для интерфейса RGMII подключается внешний EMAC физического уровня (чип RTL8211F)
и используются внутренние синхроимпульсы SOC EPHY_25M, которые поддерживают
скорость 10 Мбит/с, 100 Мбит/с и 1000 Мбит/с.
Пример конфигурации board.dts выглядит следующим образом:
Путь: longan/device/config/chips/{IC}/configs/{BOARD}/board.dts
gmac0: eth@05020000
{
phy-mode = "rgmii";
use_ephy25m = <1>;
tx-delay = <7>;
rx-delay = <0>;
status = "okay";
};
Примечание.
use_ephy25m=1 означает, что PHY использует внутреннюю тактовую частоту SOC EPHY_25M;
use_ephy25m=0 (или если этот параметр не настроен) означает, что PHY
не использует внутреннюю тактовую частоту SOC EPHY_25M, и для обеспечения PHY требуется
внешний кварцевый генератор 25M.
Интерфейс RGMII предъявляет строгие требования к фазе сигналов синхронизации и данных,
поэтому обычно необходимо настроить параметры tx-delay и rx-delay для обеспечения
корректности передачи данных.
3.2.4.2 Конфигурация интерфейса RMII
Для интерфейса RMII используется EMAC внешнего физического уровня (чип RTL8201F),
а внешний кварцевый генератор 25M используется для поддержки скорости 10 Мбит/с и /100 Мбит/с.
Пример узла дерева устройств board.dts выглядит следующим образом:
Путь: longan/device/config/chips/{IC}/configs/{BOARD}/board.dts
gmac1: eth@05030000
{
phy-mode = "rmii";
status = "okay";
};
Для EMAC, использующих встроенный в SOC EPHY, синхрочастота 25M обеспечиваются модулем PWM,
поддержка cкорости 10 Мбит/с и /100 Мбит/с.
Путь: longan/device/config/chips/{IC}/configs/{BOARD}/board.dts
gmac1: eth@05030000
{
phy-mode = "rmii";
status = "okay";
};
ac200: ac200
{
tv_used = <1>;
tv_twi_used = <1>;
tv_twi_addr = <16>;
tv_pwm_ch = <5>;
status = "okay";
};
Примечание.
В некоторых SOC AC200 инкапсулирует EPHY, связывается с AC200 через TWI, инициализирует EPHY,
а затем MAC обращается к EPHY через шину MDIO.
В некоторых SOC AC300 инкапсулирует EPHY, связывается с AC300 через шину MIDO контроллера MAC,
инициализирует EPHY, а затем MAC также использует шину MDIO для доступа к EPHY.
Конечно, конфигурацию дерева устройств можно поместить в конфигурацию дерева устройств ядра или board.dts.
При этом конфигурация board.dts переопределит конфигурацию дерева устройств ядра.
3.3 Структура исходного кода GMAC
Исходный код драйвера GMAC находится в папке ядра drivers/net/ethernet/allwinner:
drivers/net/ethernet/allwinner/
sunxi-gmac.h - заголовочный файл драйвера GMAC платформы Sunxi, который определяет
некоторые макросы, структуры данных и внутренние интерфейсы
sunxi-gmac.c - основной код драйвера GMAC платформы Sunxi
sunxi_gmac_ops.c - конкретная реализация каждого внутреннего интерфейса
драйвера GMAC платформы Sunxi