Как добавить поддержку DFU в u-boot?

Я пытаюсь добавить поддержку DFU в u-boot, которую я использую в своем проекте, потому что я понял, что поддержка DFU в нем не включена.

Я использую freescale u-boot (клонирование из git: //git.freescale.com/imx/uboot-imx.git) и я проверил тег "rel_imx_4.1.15_1.1.0_ga", который я " м требуется для работы.

Дело в том, что, просматривая документацию по u-boot, я вижу, что DFU должен быть включен. Я добавил следующее в мой.h файл

#define CONFIG_USB_FUNCTION_DFU
#define CONFIG_CMD_DFU
#define CONFIG_DFU_MMC
#define CONFIG_SYS_DFU_DATA_BUF_SIZE SZ_16M
#define DFU_DEFAULT_POLL_TIMEOUT 300

Но я получаю следующие ошибки:

common/built-in.o: In function `do_dfu':
/home/m4l490n/uboot-imx/common/cmd_dfu.c:29: undefined reference to `dfu_init_env_entities'
/home/m4l490n/uboot-imx/common/cmd_dfu.c:35: undefined reference to `dfu_show_entities'
/home/m4l490n/uboot-imx/common/cmd_dfu.c:41: undefined reference to `g_dnl_clear_detach'
/home/m4l490n/uboot-imx/common/cmd_dfu.c:42: undefined reference to `g_dnl_register'
/home/m4l490n/uboot-imx/common/cmd_dfu.c:44: undefined reference to `g_dnl_detach'
/home/m4l490n/uboot-imx/common/cmd_dfu.c:50: undefined reference to `dfu_usb_get_reset'
/home/m4l490n/uboot-imx/common/cmd_dfu.c:67: undefined reference to `usb_gadget_handle_interrupts'
/home/m4l490n/uboot-imx/common/cmd_dfu.c:70: undefined reference to `g_dnl_unregister'
/home/m4l490n/uboot-imx/common/cmd_dfu.c:72: undefined reference to `dfu_free_entities'
/home/m4l490n/uboot-imx/common/cmd_dfu.c:77: undefined reference to `g_dnl_clear_detach'
arm-linux-gnueabihf-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf32-arm.c:7696
arm-linux-gnueabihf-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf32-arm.c:7696
arm-linux-gnueabihf-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf32-arm.c:7696
arm-linux-gnueabihf-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf32-arm.c:7696
arm-linux-gnueabihf-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf32-arm.c:7696
arm-linux-gnueabihf-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf32-arm.c:7696
arm-linux-gnueabihf-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf32-arm.c:7696
arm-linux-gnueabihf-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf32-arm.c:7696
arm-linux-gnueabihf-ld.bfd: BFD (GNU Binutils for Ubuntu) 2.24 assertion fail ../../bfd/elf32-arm.c:7696
arm-linux-gnueabihf-ld.bfd: error: required section '.rel.plt' not found in the linker script
arm-linux-gnueabihf-ld.bfd: final link failed: Invalid operation
make: *** [u-boot] Error 1

Я заметил, что если я удаляю #define CONFIG_CMD_DFU из файла.h, он прекрасно компилируется, но если я ввожу => dfu в оболочке u-boot, он говорит:

Unknown command 'dfu' - try 'help'

Итак, вопрос в том * Знаете ли вы, что еще мне нужно добавить, чтобы включить DFU в используемой вами u-boot?

Спасибо!!

1 ответ

  1. Чтобы исправить эти ошибки связывания:

    неопределенная ссылка на dfu_*

    включите USB-часть класса DFU USB:

    #define CONFIG_DFU_FUNCTION
    
  2. Чтобы исправить эту ошибку связывания:

    неопределенная ссылка на usb_gadget_handle_interrupts

    включите ваш контроллер UDC (я уверен, что ваша платформа имеет контроллер ChipIdea UDC), а также включите гаджет USB:

    #define CONFIG_CI_UDC
    #define CONFIG_USBD_HS
    
    #define CONFIG_USB_GADGET
    #define CONFIG_USB_GADGET_DUALSPEED
    #define CONFIG_USB_GADGET_VBUS_DRAW 2
    
  3. Чтобы исправить эти ошибки связывания:

    неопределенная ссылка на g_dnl_*

    включить и настроить гаджет загрузки USB:

    #define CONFIG_USBDOWNLOAD_GADGET
    #define CONFIG_G_DNL_VENDOR_NUM     0x18d1
    #define CONFIG_G_DNL_PRODUCT_NUM    0x0d02
    #define CONFIG_G_DNL_MANUFACTURER   "FSL"
    

Теперь вы сможете успешно собрать U-Boot. Проверено на configs/mx7dsabresd_defconfig (с изменениями в include/configs/mx7dsabresd.h). Значения конфигурации для гаджета загрузки (G_DNL) были взяты из include/configs/mx7dsabresdandroid.h,

В принципе, проблемы со связыванием могут быть решены следующим образом. Чтобы узнать, какое определение отсутствует, вы можете посмотреть, где реализована отсутствующая функция, а затем найти Makefile где соответствующий исходный файл включен для сборки, и из этого Makefile Вы можете выяснить, какую опцию определить, чтобы соответствующий объект-файл был создан и требуемая функция была на этапе связывания.

Другие вопросы по тегам