Сборка программного обеспечения контроллеров из исходников.

Решил поделиться опытом сборки программного обеспечения для дистрибутива Fedora 16.
Так как в этом дистрибутиве Linux используется новый релиз avr-gcc,
(проблема обсуждалась на форуме разработчиков "usbdrv" для Atmel http://forums.obdev.at/viewtopic.php?f=8&t=6424)

[lubimov-aa@localhost firmware]$ avr-gcc --version
avr-gcc (Fedora 4.6.2-1.fc16) 4.6.2
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

а также в репозитории программ Fedora 16 я не нашёл статически собранных версий библиотек libusb,
то в процессе сборки пришлось создать патч (также см. вложение).

--- ./unc0xx-2120413/commandline/Makefile
+++ ./unc0xx-2120413-F16/commandline/Makefile
@@ -21,7 +21,7 @@
$(AR) crs $@ $^

%: %.o
- $(CC) -static -o $@ $^ $(USBLIBS)
+ $(CC) -o $@ $^ $(USBLIBS)

uncctl: uncctl.o grab_com.o libuncusb.a
scanbus: scanbus.o

--- ./unc0xx-2120413/firmware/usb_io.c
+++ ./unc0xx-2120413-F16/firmware/usb_io.c
@@ -27,7 +27,7 @@

-PROGMEM char usbHidReportDescriptor[78] = {
+const PROGMEM char usbHidReportDescriptor[78] = {
0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)

--- ./unc0xx-2120413/firmware/usbdrv.c
+++ ./unc0xx-2120413-F16/firmware/usbdrv.c
@@ -67,7 +67,7 @@
#if USB_CFG_DESCR_PROPS_STRING_0 == 0
#undef USB_CFG_DESCR_PROPS_STRING_0
#define USB_CFG_DESCR_PROPS_STRING_0 sizeof(usbDescriptorString0)
-PROGMEM char usbDescriptorString0[] = { /* language descriptor */
+const PROGMEM char usbDescriptorString0[] = { /* language descriptor */
4, /* sizeof(usbDescriptorString0): length of descriptor in bytes */
3, /* descriptor type */
0x09, 0x04, /* language index (0x0409 = US-English) */
@@ -77,7 +77,7 @@
#if USB_CFG_DESCR_PROPS_STRING_VENDOR == 0 && USB_CFG_VENDOR_NAME_LEN
#undef USB_CFG_DESCR_PROPS_STRING_VENDOR
#define USB_CFG_DESCR_PROPS_STRING_VENDOR sizeof(usbDescriptorStringVendor)
-PROGMEM int usbDescriptorStringVendor[] = {
+const PROGMEM int usbDescriptorStringVendor[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_VENDOR_NAME_LEN),
USB_CFG_VENDOR_NAME
};
@@ -86,7 +86,7 @@
#if USB_CFG_DESCR_PROPS_STRING_PRODUCT == 0 && USB_CFG_DEVICE_NAME_LEN
#undef USB_CFG_DESCR_PROPS_STRING_PRODUCT
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT sizeof(usbDescriptorStringDevice)
-PROGMEM int usbDescriptorStringDevice[] = {
+const PROGMEM int usbDescriptorStringDevice[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_DEVICE_NAME_LEN),
USB_CFG_DEVICE_NAME
};
@@ -95,7 +95,7 @@
#if USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER == 0 && USB_CFG_SERIAL_NUMBER_LEN
#undef USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER sizeof(usbDescriptorStringSerialNumber)
-PROGMEM int usbDescriptorStringSerialNumber[] = {
+const PROGMEM int usbDescriptorStringSerialNumber[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_SERIAL_NUMBER_LEN),
USB_CFG_SERIAL_NUMBER
};
@@ -108,7 +108,7 @@
#if USB_CFG_DESCR_PROPS_DEVICE == 0
#undef USB_CFG_DESCR_PROPS_DEVICE
#define USB_CFG_DESCR_PROPS_DEVICE sizeof(usbDescriptorDevice)
-PROGMEM char usbDescriptorDevice[] = { /* USB device descriptor */
+const PROGMEM char usbDescriptorDevice[] = { /* USB device descriptor */
18, /* sizeof(usbDescriptorDevice): length of descriptor in bytes */
USBDESCR_DEVICE, /* descriptor type */
0x10, 0x01, /* USB version supported */
@@ -139,7 +139,7 @@
#if USB_CFG_DESCR_PROPS_CONFIGURATION == 0
#undef USB_CFG_DESCR_PROPS_CONFIGURATION
#define USB_CFG_DESCR_PROPS_CONFIGURATION sizeof(usbDescriptorConfiguration)
-PROGMEM char usbDescriptorConfiguration[] = { /* USB configuration descriptor */
+const PROGMEM char usbDescriptorConfiguration[] = { /* USB configuration descriptor */
9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
USBDESCR_CONFIG, /* descriptor type */
18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 +

--- ./unc0xx-2120413/firmware/usbdrv.h
+++ ./unc0xx-2120413-F16/firmware/usbdrv.h
@@ -449,43 +449,43 @@
#ifndef __ASSEMBLER__
extern
#if !(USB_CFG_DESCR_PROPS_DEVICE & USB_PROP_IS_RAM)
-PROGMEM
+const PROGMEM
#endif
char usbDescriptorDevice[];

extern
#if !(USB_CFG_DESCR_PROPS_CONFIGURATION & USB_PROP_IS_RAM)
-PROGMEM
+const PROGMEM
#endif
char usbDescriptorConfiguration[];

extern
#if !(USB_CFG_DESCR_PROPS_HID_REPORT & USB_PROP_IS_RAM)
-PROGMEM
+const PROGMEM
#endif
char usbDescriptorHidReport[];

extern
#if !(USB_CFG_DESCR_PROPS_STRING_0 & USB_PROP_IS_RAM)
-PROGMEM
+const PROGMEM
#endif
char usbDescriptorString0[];

extern
#if !(USB_CFG_DESCR_PROPS_STRING_VENDOR & USB_PROP_IS_RAM)
-PROGMEM
+const PROGMEM
#endif
int usbDescriptorStringVendor[];

extern
#if !(USB_CFG_DESCR_PROPS_STRING_PRODUCT & USB_PROP_IS_RAM)
-PROGMEM
+const PROGMEM
#endif
int usbDescriptorStringDevice[];

extern
#if !(USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER & USB_PROP_IS_RAM)
-PROGMEM
+const PROGMEM
#endif
int usbDescriptorStringSerialNumber[];

Итак начнём.
Для начала необходимо установить требуемые для сборки пакеты из репозитория программ Fedora.
yum install libusb-devel
для сборки утилит и
yum install avr-gcc avr-libc
для сборки микропрограммного обеспечения.

Далее загрузим и распакуем архив с исходниками.
На текущий момент я использоват версию от 13 апреля 2012 г. с номером 2120413.
http://www.unicontrollers.com/soft.html
И сохраним файл прилагаемого патча в unc0xx-2120413-Fedora-16.patch

[lubimov-aa@localhost build]$ ll
итого 108
-rw-r--r--. 1 lubimov-aa lubimov-aa 4608 апр. 25 16:54 unc0xx-2120413-Fedora-16.patch
-rw-r--r--. 1 lubimov-aa lubimov-aa 99724 апр. 24 10:32 unc0xx-2120413.tgz
[lubimov-aa@localhost build]$ tar -xvf ./unc0xx-2120413.tgz
unc0xx-2120413/
unc0xx-2120413/WARRANTY
unc0xx-2120413/COPYING
unc0xx-2120413/commandline/
unc0xx-2120413/commandline/Makefile
unc0xx-2120413/commandline/Makefile.mingw
unc0xx-2120413/commandline/README
unc0xx-2120413/commandline/grab_com.c
unc0xx-2120413/commandline/hidapi.c
......
......

Применим патч к распакованным исходникам.

[lubimov-aa@localhost build]$ patch -p0 < ./unc0xx-2120413-Fedora-16.patch
patching file ./unc0xx-2120413/commandline/Makefile
patching file ./unc0xx-2120413/firmware/usb_io.c
patching file ./unc0xx-2120413/firmware/usbdrv.c
patching file ./unc0xx-2120413/firmware/usbdrv.h

Зайдём в необходимые директории.

[lubimov-aa@localhost build]$ ll
итого 112
drwxr-xr-x. 4 lubimov-aa lubimov-aa 4096 апр. 14 18:09 unc0xx-2120413
-rw-r--r--. 1 lubimov-aa lubimov-aa 4608 апр. 25 16:54 unc0xx-2120413-Fedora-16.patch
-rw-r--r--. 1 lubimov-aa lubimov-aa 99724 апр. 24 10:32 unc0xx-2120413.tgz
[lubimov-aa@localhost build]$ cd unc0xx-2120413/
commandline/ firmware/
[lubimov-aa@localhost build]$ cd unc0xx-2120413/commandline/

И произведём компиляцию утилит управления.

[lubimov-aa@localhost commandline]$ make
gcc -O0 -Wall -g `libusb-config --cflags` -I. -I.. -c uncctl.c -o uncctl.o
gcc -O0 -Wall -g `libusb-config --cflags` -I. -I.. -fpic -c grab_com.c -o grab_com.o
gcc -O0 -Wall -g `libusb-config --cflags` -I. -I.. -fpic -c uncusb.c -o uncusb.o
ar crs libuncusb.a uncusb.o
gcc -o uncctl uncctl.o grab_com.o libuncusb.a `libusb-config --libs`
gcc -O0 -Wall -g `libusb-config --cflags` -I. -I.. -c scanbus.c -o scanbus.o
gcc -o scanbus scanbus.o `libusb-config --libs`

Проверим сборку исполняемых файлов.

[lubimov-aa@localhost commandline]$ file ./uncctl
./uncctl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
[lubimov-aa@localhost commandline]$ file ./scanbus
./scanbus: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped

Зачистим для нагладности буфер лога ядра.

[lubimov-aa@localhost commandline]$ sudo dmesg -c > /dev/null

Произведём подключение контроллера по USB и убедимся, что оно обнаружилось и доступно.

[lubimov-aa@localhost commandline]$ sudo dmesg -c
[29769.884014] usb 4-2: new low-speed USB device number 9 using uhci_hcd
[29769.947039] hub 4-0:1.0: unable to enumerate USB device on port 2
[29770.660018] usb 4-2: new low-speed USB device number 10 using uhci_hcd
[29770.844028] usb 4-2: New USB device found, idVendor=16c0, idProduct=05df
[29770.844031] usb 4-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[29770.844033] usb 4-2: Product: Electric circuit switch UNC0xx
[29770.844035] usb 4-2: Manufacturer: Unicontrollers http://www.unicontrollers.com
[29770.844037] usb 4-2: SerialNumber: 0003:0115:7775
[29770.938220] generic-usb 0003:16C0:05DF.0005: hiddev0,hidraw2: USB HID v1.01 Device [Unicontrollers http://www.unicontrollers.com Electric circuit switch UNC0xx] on usb-0000:00:1d.2-2/input0
[lubimov-aa@localhost commandline]$ sudo ./scanbus
...
...
Device: 16c0 / 5df
VendorName: Unicontrollers http://www.unicontrollers.com
ProductName: Electric circuit switch UNC0xx
SerialNumber: 0003:0115:7775
...
...
[lubimov-aa@localhost commandline]$ sudo ./uncctl -L
[serial number ] version
7775 [0003:0115:7775] 2120413
1 UNC0xx device(s) found
[lubimov-aa@localhost commandline]$

Утилиты скомпилированы и работают.
Также для желающих можно собрать микропрограммное обеспечение для контроллера Atmel AVR.

[lubimov-aa@localhost commandline]$ cd ../firmware/
[lubimov-aa@localhost firmware]$ make
cc -Wall -g -I.. _mkusbid.c -o _mkusbid
_mkusbid.c: В функции «main»:
_mkusbid.c:76:5: предупреждение: format «%d» expects argument of type «int», but argument 2 has type «long unsigned int» [-Wformat]
_mkusbid.c:82:5: предупреждение: format «%d» expects argument of type «int», but argument 2 has type «long unsigned int» [-Wformat]
./_mkusbid > _usb_id.h
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -x assembler-with-cpp -c usbdrvasm.S -o usbdrvasm.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c usbdrv.c -o usbdrv.o
usbdrv.c: In function 'usbPoll':
usbdrv.h:466:6: warning: uninitialized variable 'usbDescriptorHidReport' put into program memory area [-Wuninitialized]
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c uart.c -o uart.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c sernum.c -o sernum.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c unc.c -o unc.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c unc_prim.c -o unc_prim.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c atparser.c -o atparser.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c print.c -o print.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c ser_io.c -o ser_io.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c usb_io.c -o usb_io.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c led.c -o led.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c misc.c -o misc.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c onewire.c -o onewire.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c unc_1w.c -o unc_1w.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -c twowire.c -o twowire.o
avr-gcc -mmcu=atmega8 -Wall -DF_CPU=12000000UL -s -fsigned-char -I.. -funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums -ffreestanding -Os -fno-inline-small-functions -fno-split-wide-types -Wl,--relax,--gc-sections -s -o uncfirmw.elf usbdrvasm.o usbdrv.o uart.o sernum.o unc.o unc_prim.o atparser.o print.o ser_io.o usb_io.o led.o misc.o onewire.o unc_1w.o twowire.o
rm -f uncfirmw.hex uncfirmw.eep.hex
avr-objcopy -j .text -j .data -O ihex uncfirmw.elf uncfirmw.hex
avr-size uncfirmw.hex
text data bss dec hex filename
0 7348 0 7348 1cb4 uncfirmw.hex
avr-size -x uncfirmw.elf
text data bss dec hex filename
0x1c68 0x4c 0x193 7751 1e47 uncfirmw.elf
:
[lubimov-aa@localhost firmware]$ file ./uncfirmw.elf
./uncfirmw.elf: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, stripped
[lubimov-aa@localhost firmware]$ tail ./uncfirmw.hex
:101C3000E09A99278DB30895DC01CB0102C02D9164
:101C400005D041505040D8F70895262FE199FECF96
:101C50009FBB8EBB2DBB0FB6F894E29AE19A0FBEE4
:081C600001960895F894FFCFEE
:101C68005AFF1E0330003000300030003A003000C8
:101C78003000300030003A003000300030003000D2
:101C8800413A00320035003800102040800102043B
:101C9800080208102001000000640000007017000E
:0C1CA80000407E05004C2B300A000300B9
:00000001FF
[lubimov-aa@localhost firmware]$

Сборка завершена.

Прикрепленный файлРазмер
unc0xx-2120413-Fedora-16.patch_.txt4.5 кб

Отправить комментарий

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <s>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

CAPTCHA
Вы ведь не робот? (извините, просто ходят тут всякие...)
Image CAPTCHA
Enter the characters shown in the image.

Данный интернет-сайт носит исключительно информационный характер. Никакая информация, представленная на сайте, ни при каких условиях не может считаться публичной офертой, определяемой ст. 437 ГК РФ.