Как добавить поддержку 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 ответ
Чтобы исправить эти ошибки связывания:
неопределенная ссылка на
dfu_*
включите USB-часть класса DFU USB:
#define CONFIG_DFU_FUNCTION
Чтобы исправить эту ошибку связывания:
неопределенная ссылка на
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
Чтобы исправить эти ошибки связывания:
неопределенная ссылка на
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
Вы можете выяснить, какую опцию определить, чтобы соответствующий объект-файл был создан и требуемая функция была на этапе связывания.