Сегодня хочется поговорить о том, как настроить crossdev окружение в Gentoo, которое необходимо для компиляции под микроконтроллеры AVR. По аналогичной схеме собираются тулчейны и для других популярных архитектур, к примеру MIPS или различных веток ARM.
Перед началом работы размаскируем последнюю версию crossdev и установим её:
# echo "sys-devel/crossdev ~amd64" >> /etc/portage/package.accept_keywords
Теперь создадим и настроим отдельный оверлей, для пакетов crossdev.
# mkdir /usr/local/crossdev-overlay # cd /usr/local/crossdev-overlay # mkdir -p /usr/local/crossdev-overlay/{profiles,metadata} # echo 'crossdevLocalOverlay' > profiles/repo_name # vim metadata/layout.conf masters = gentoo thin-manifests = true # chown -R portage:portage /usr/local/crossdev-overlay
Также следует описать оверлей в repos.conf:
# vim /etc/portage/repos.conf/crossdev.conf [crossdevLocalOverlay] location = /usr/local/crossdev-overlay priority = 10 masters = gentoo auto-sync = no
Тут есть один важный нюанс. Если у нас в системе уже был один локальный оверлей, а для crossdev мы хотим использовать отдельный, то следует существующему оверлею назначить более высокий приоритет. Сделать это можно изменив его настройки там же, в директории repos.conf. В моём случае это выглядело так:
#echo 'priority = 13' >> /etc/portage/repos.conf/local.confСоберём окружение для AVR, явно указав версии необходимого нам ПО. У меня всё заработало со следующими параметрами GCC, binutils и libc:
USE="multilib -cxx" crossdev --g 4.6.2 --b 2.21.1-r1 --l 1.7.0 -S -s1 --target avr USE="multilib cxx" crossdev --g 4.6.2 --b 2.21.1-r1 --l 1.7.0 -S -s4 --target avr
Если не вышло, можно попробовать проще:
crossdev -s4 --stable --portage --verbose --target avrТеперь нужно создать ссылку на ldscripts, иначе ничего не соберётся (эта проблема существует уже лет 6, но никто не шевелится её исправлять):
ln -s /usr/x86_64-pc-linux-gnu/avr/lib/ldscripts/ /usr/avr/lib/ldscriptsОсталось установить avrdude:
# emerge avrdudeПопробуем помирать диодиком на PC5:
# vim me.cpp #define F_CPU 8000000L #include <avr/io.h> #include <util/delay.h> void sleep(uint8_t millisec) { while(millisec) { _delay_ms(1); millisec--; } } int main(void) { while (1) { DDRC |=1<<PC5; PORTC &= ~(1<<PC5); sleep(100); PORTC |=(1<<PC5); sleep(100); } }
Теперь скомпилируем и прошьём (я использую программатрор от Thomas Fischl).
# avr-gcc -O2 -mmcu=atmega8 me.cpp -o me.elf # avr-objcopy -O ihex me.elf me.hex # avrdude -c usbasp -p m8 -U hfuse:w:0xd9:m -U lfuse:w:0xe1:m # avrdude -c usbasp -p m8 -U flash:w:me.hex:iВот и всё. Схему приводить тут не вижу смысла, но если кому интересно — смотрите на иконку к этой публикации. Удачи!
Полезные ссылки:
https://wiki.gentoo.org/wiki/Overlay/Local_overlay
http://gentoo-en.vfose.ru/wiki/Crossdev
0 коммент.:
Отправить комментарий