Плата разработки выступает в роли USB-хоста, отвечающего за питание подключенных ведомых устройств и управление передачей данных.
Устройство работает как ведомое (управляемое хостом) и не может подключаться к другим USB-устройствам.
Устройство может динамически переключаться между режимом хоста (Host Mode) и режимом устройства (Device Mode) без фиксированной роли.
Измените файл дерева устройств в соответствии со следующим путем проекта:
Добавьте в этот файл следующее содержимое:
x/include/ "system-conf.dtsi"
/ {
};
# Added content/ { usb_phy0: phy0@e0002000 { compatible = "ulpi-phy"; #phy-cells = <0>; reg = <0xe0002000 0x1000>; view-port = <0x0170>; drv-vbus; };};&usb0 { # Select the mode as needed dr_mode = "otg"; /*dr_mode = "peripheral";*/ /*dr_mode = "host";*/ usb-phy = <&usb_phy0>; usb-reset = <&gpio0 10 0>;};Ссылки:
1.https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842272/Zynq+Linux+USB+Device+Driver
Используйте команду:
xxxxxxxxxxpetalinux-config -c kernelВ появившемся текстовом интерфейсе включите следующее содержимое: Драйвер можно скомпилировать в ядро или как модуль ядра для динамической загрузки после запуска системы. Рекомендуется компилировать его как модуль ядра.
xxxxxxxxxx#Compile directly into the kernelDevice Drivers --->[*]USB support ---> [*]USB Gadget Support ---> [*]USB Gadget functions configurable through configfs [*]Abstract controlo Model(CDC ACM) [*]USB Gadget precomposed confiurations-----> [*]Mass Storage Gadget [*]Serial Gadget(with CDC ACM and CDC OBEX support) #Compile as kernel moduleDevice Drivers --->[*]USB support ---> [*]USB Gadget Support ---> [M]USB Gadget functions configurable through configfs [M]Abstract controlo Model(CDC ACM) [*]USB Gadget precomposed confiurations-----> [M]Mass Storage Gadget [M]Serial Gadget(with CDC ACM and CDC OBEX support) # [*]: Indicates that the function is selected and enabled, meaning it will be compiled into the kernel and become part of the kernel. This is kernel static compilation. For example, if Mass Storage Gadget under USB Gadget Support is selected, this function will be directly compiled into the kernel and enabled every time the kernel starts, without loading any modules.# [M]: Indicates that the function will be compiled as a kernel module, meaning it will not be directly compiled into the kernel but dynamically loaded after system startup. This configuration provides greater flexibility, allowing modules to be loaded or unloaded as needed without recompiling the kernel. For example, if Serial Gadget (with CDC ACM and CDC OBEX support) is selected with [M], this function will be compiled as a module and can be manually loaded or unloaded using modprobe or insmod commands, facilitating dynamic management. Используйте команду
xxxxxxxxxxpetalinux-build -c kernelСкопируйте перекомпилированное ядро и дерево устройств на SD-карту. Включите питание и загрузите систему, затем вручную загрузите модули ядра в консоли или через telnet:
xxxxxxxxxxcd /lib/modules/5.10.0-xilinx-v2021.1/kernel/drivers/usb/gadget/legacyinsmod u_serial.koinsmod libcomposite.koinsmod usb_f_serial.koinsmod usb_f_obex.koinsmod usb_f_acm.koinsmod g_serial.ko
# insmod libcomposite.ko;insmod u_serial.ko;insmod usb_f_serial.ko;insmod usb_f_acm.ko;insmod g_serial.ko# rmmod g_serial;rmmod usb_f_acm;rmmod usb_f_serial;rmmod u_serial;rmmod libcomposite;Вы увидите устройство /dev/ttyGS0:
Если вы не хотите вручную загружать модули ядра при каждом включении, вы можете записать эти команды в стартовый скрипт для автоматической загрузки после включения.
Заранее подготовьте USB-накопитель (обязательно в формате FAT32) и создайте на нем несколько документов с помощью компьютера, например, два документа с именами a.txt и b.txt.
Замкните контакты JP2 и JP3 на плате разработки перемычками. После включения питания и запуска системы вставьте USB-накопитель в соответствующий интерфейс Type-C OTG (потребуется переходник с Type-C на Type-A "мама"). В консоли последовательного порта появится следующая информация:
Далее введите команду для просмотра точки монтирования USB-накопителя и использования памяти:
xxxxxxxxxxdf -hВы увидите, что точка монтирования находится в "/run/media/sda1". В соответствии с расположением USB-накопителя, показанным на изображении выше, введите cd /run/media/sda1, чтобы перейти к USB-накопителю.
xxxxxxxxxxcd /run/media/sda1Далее вы можете ввести "ls", чтобы просмотреть содержимое USB-накопителя:
xxxxxxxxxxlsВы увидите, что в папке есть два файла: a.txt и b.txt. Вы также можете напрямую изменять содержимое USB-накопителя.
Поскольку мы включили USB CDC при конфигурации ядра, при подключении к компьютеру через USB-кабель этот USB будет виртуализирован как последовательный порт.
После нормального включения и запуска системы сначала загрузите модули ядра, соответствующие упомянутому ранее виртуальному последовательному порту. Затем подключите плату разработки к компьютеру с помощью USB-кабеля с разъемами Type-C на обоих концах. В помощнике отладки последовательного порта вы увидите два последовательных порта, где COM11 — это виртуальный последовательный порт, созданный интерфейсом USB OTG, а COM12 — это консольный последовательный порт системы Zynq Linux.
Виртуальный последовательный порт соответствует /dev/ttyGS0 на Zynq.
Отправка данных с платы разработки на компьютер через виртуальный последовательный порт
Используйте следующую команду в консоли последовательного порта платы разработки для отправки данных на компьютер:
xxxxxxxxxxecho 123 > /dev/ttyGS0
Полученные данные будут отображены в последовательном терминале компьютера:
Компьютер также может отправлять данные на плату разработки через виртуальный последовательный порт
Используйте команду 'cat' на плате разработки для чтения данных, полученных виртуальным последовательным портом. Введите: hello\n в терминале, соответствующем виртуальному последовательному порту компьютера, и полученные данные будут отображены в консольном терминале платы разработки.
Примечание: В терминале для отправки и получения данных по последовательному порту в качестве условия завершения используется '\n'. То есть к отправляемым данным будет добавляться '\n', а полученные данные должны быть выведены после получения '\n'.