Category: ARM

Окт 02 2015

Драйвер для Linux: первый шаг

Продолжаю эксперименты с Altera Cyclone V. На этот раз объектом эксперимента стал драйвер для той прошивки FPGA, про которую я писал ранее. Сама прошивка простейшая: она просто мигает светодиодами с частотой, которую можно задавать программно. В прошлом посте на эту тему я сделал управление частотой мигания из обычной (user-space) программы, которая получает доступ к физической памяти через функции open(«/dev/mem») и mmap().
Однако такой путь считается «hacky and unsafe». Поэтому следующим логичным шагом должно стать написание драйвера.

Tux-linux-and-ARM-multiplatform-support

Я воспользовался готовым исходником драйвера (ссылка) за авторством Howard Mao (он на самом деле не Howard, а Zhe Hao Mao). Конечно, для того, чтобы разобраться в работе кода, почитал отдельные главы книги Linux Device Drivers (есть русский перевод).

Для компиляции пришлось вытаскивать архив Arrow SocKit 13.1 GSRD Linux отсюда: http://releases.rocketboards.org/release/2013.11/gsrd/src, файл linux-socfpga-gsrd-13.1-src.bsx. Объем архива около 1.1 Гб, но сервер очень медленный, качается несколько часов. Честно говоря, я впервые увидел файл с расширением bsx, оказалось, что это самораспаковывающийся архив. Просто запускаем его и он разворачивается в указанную папку. В ней в папке sources находится файл linux-socfpga.tgz. Его тоже нужно распаковать, естественно. Это и есть как таковое ядро системы, которое нужно указывать при компиляции драйвера.

Однако всё не так просто. После компиляции записываем скомпилированный драйвер blinker.ko на SD-карту, после загрузки Linux пишем insmod blinker.ko и получаем следующее: «blinker: version magic ‘3.9.0-00161-ged01b8c SMP mod_unload ARMv7 p2v8 ‘ should be ‘3.9.0 SMP mod_unload ARMv7 p2v8’«. Не совпали волшебные номерки. Причем версия одна и та же, просто зачем-то к ней приделан какой-то добавочный номер.

Решений может быть три: 1. Скомпилировать Linux именно из этого скачанного исходника (очень неохота) или 2. Подправить номер в исходниках ядра Linux. 3. Использовать команду modprobe с ключом -f, который заставляет систему игнорировать «волшебные цифры».  Однако этот способ почему-то не заработал.
Итак, способ номер 2, подправить номер в исходнике ядра. Данный номер записан в файле /include/generated/utsrelease.h. Исправляем то, что там было, на «3.9.0», и перекомпилируем драйвер. На всякий случай смотрим hex-редактором файл blinker.ko, чтобы убедиться, что волшебные циферки такие, как нужно. Снова записываем драйвер на SD-карту, запускаем insmod, всё прошло гладко. Теперь можно проверить работу драйвера, посылая ему числа от 1 до 15 для управления частотой миганий: echo 1 > blinker — мигает быстро, echo 15 > blinker — мигает медленно. Пока всё. Немного, но путь в тысячу ли начинается с одного шага.

Эксперименты продолжаются.

Сен 23 2015

Управление FPGA из программы

Приведённый ниже код писал не я, он взят отсюда: https://zhehaomao.com/blog/fpga/2013/12/27/sockit-3.html, но я решил оставить его здесь, т.к. он пригодится для дальнейших экспериментов.

Напоминаю, что данная программа работает в ОС Linux GSRD на SoC Altera Cyclone V (ядро ARM Cortex A9). Компилятор Linaro GCC, берём здесь: http://releases.linaro.org/latest/components/toolchain/binaries/4.8/arm-linux-gnueabihf/

#include ;
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define PAGE_SIZE 4096
#define LWHPS2FPGA_BRIDGE_BASE 0xff200000
#define BLINK_OFFSET 0x0

volatile unsigned char *blink_mem;
void *bridge_map;

int main(int argc, char *argv[])
{
	int fd, ret = EXIT_FAILURE;
	unsigned char value;
	off_t blink_base = LWHPS2FPGA_BRIDGE_BASE;

	if (argc < 2) {
		fprintf(stderr, "Usage: %s number\n", argv[0]);
		exit(EXIT_FAILURE);
	}

	/* check the bounds of the value being set */
	value = atoi(argv[1]);
	if (value < 1 || value > 15) {
		fprintf(stderr, "Invalid delay setting."
				"Delay must be between 1 and 15, inclusive.\n");
		exit(EXIT_FAILURE);
	}

	/* open the memory device file */
	fd = open("/dev/mem", O_RDWR|O_SYNC);
	if (fd < 0) {
		perror("open");
		exit(EXIT_FAILURE);
	}

	/* map the LWHPS2FPGA bridge into process memory */
	bridge_map = mmap(NULL, PAGE_SIZE, PROT_WRITE, MAP_SHARED,
				fd, blink_base);
	if (bridge_map == MAP_FAILED) {
		perror("mmap");
		goto cleanup;
	}

	/* get the delay_ctrl peripheral's base address */
	blink_mem = (unsigned char *) (bridge_map + BLINK_OFFSET);

	/* write the value */
	*blink_mem = value;

	if (munmap(bridge_map, PAGE_SIZE) < 0) {
		perror("munmap");
		goto cleanup;
	}

	ret = 0;

cleanup:
	close(fd);
	return ret;
}

Программа управляет частотой мигания светодиода, сам делитель частоты расположен в FPGA, частота задаётся регистром.

Read more »

Июл 28 2015

SoCKit Lab Instructions

Прочитал и освоил на практике воркбенч SoCKit Lab, две части, Hardware и Software.
Данная программа лабораторных работ основана на системе на кристалле (SoC) Altera Cyclone V. SoC состоит из двух процессорных ядер ARM Cortex A9 и FPGA, которые соединены мостами и могут взаимодействовать друг с другом. Первое руководство, Hardware, выполняется в Quartus II, и описывает конфигурирование и подключение периферии к процессору, а также симуляцию системы в ModelSim.
Вторая часть, Software, описывает процесс загрузки Linux, компиляцию простейшей программы (мигание светодиодом), отладку программы в ARM DS-5 Embedded Development Suite, и основы работы с SignalTap II Logic Analyzer в режиме совместной отладки программного кода и FPGA-проекта.

pic1

Мар 03 2015

Книга Louise Crockett и др. «The Zynq Book»

Дочитал книгу «The Zynq Book», руководство по системе на кристалле (SoC) Zynq-7000 фирмы Xilinx.

Напомню, что Zynq-7000 состоит из двух ядер ARM Cortex A9 и блока программируемой логики PL (по сути, встроенная в систему FPGA).

В книге подробно рассматривается структура системы, программный пакет Vivado, предназначенный для разработки под Zynq-7000, подробно рассматривается процесс преобразования кода на языке высокого уровня (например, С) в форму RTL, предназначенную для конфигурирования PL . Эта возможность обеспечивается программой Vivado HLS.
В последней части книги кратко описывается структура и процедура загрузки Linux в память.

ZynqPerspective
Интересная книга, интересный процессор.

Сен 14 2013

Time Capsule своими руками

Для бэкапа содержимого жесткого диска в OS X, как известно, используется приложение Time Machine, очень удобное и качественное. Однако для его работы нужно устройство Time Capsule. В этом посте я хочу рассказать о том, как я сделал свою Time Capsule на основе Raspberry Pi.

Итак, нам понадобятся следующие компоненты:

1. Raspberry Pi и SD-карта для него;

2. HDD (я использовал HDD на 1 Tb, но можно взять жесткий диск и другого объёма);

3. переходник USB-SATA (от коробки для внешнего диска);

4. источник питания с напряжениями +5В и +12В, который может обеспечить силу тока по каналу +5В не менее 1,7А, по каналу 12В не менее 0,6А;

5. Wi-Fi адаптер для USB;

6. вентилятор (я использовал вентилятор 40 мм);

7. корпус;

Собираем всё вместе:

(все картинки кликабельны)

Read more »

Сен 13 2012

Отладочная платформа на Raspberry Pi

На основе платы  Raspberry Pi (процессор Broadcom BCM2835 700 MHz ARM11 ARM1176JZF-S) сделал такое устройство, для удобства работы с платой и подключения к Raspberry Pi других устройств.

Плата Rasperry Pi.

Фото устройства. (Картинка кликабельна)

На Raspberry Pi установлена операционная система Debian Wheezy.

Подробнее можно прочитать здесь.

 

Мар 24 2012

Подключение цветного LCD с сенсорным экраном к микроконтроллеру

Перепост с Хабрахабра:

Добрый день, хабр. Сегодня я хотел бы поделиться некоторым опытом, касающимся подключения цветных LCD-индикаторов к микроконтроллеру. Эта тема уже поднималась на хабре (http://habrahabr.ru/post/139384/), поэтому данный пост может рассматриваться как дополнение к уже написанному моими уважаемыми коллегами.

Читать далее:   http://habrahabr.ru/post/140415/

Дек 12 2010

Интерфейс прибора

Интерфейс прибора реализован на базе монохромного индикатора разрешением 128х64, и включает в себя 35 различных экранов, в которых выполняются все манипуляции с прибором, включая его наладку и тестирование всех узлов (ЦАП, АЦП, все дискретные входы и выходы), установку параметров алгоритма обработки сигналов (DSP), а также все переменные настройки прибора (более 200 переменных).

Программно интерфейс реализован в виде библиотеки классов C++, представляющих элементы управления (кнопки, поля ввода, текстовые поля и пр.)

Так это выглядит в натуральном виде:

Ещё  несколько картинок под катом.

Read more »

Дек 05 2010

Старый прибор

Фотография старого прибора, для которого я разрабатывал прошивку.

Кроме разработки программного обеспечения, я также отлаживал некоторые узлы прибора, принимал участие в испытаниях, а также частично разрабатывал документацию на прибор.

Прибор содержит микроконтроллер с ядром ARM7 (фирмы Atmel), и имеет 8 каналов АЦП (16 бит), 8 каналов ЦАП (12 бит), 16 дискретных входов, 16 дискретных выходов, 2 силовых выхода управления ТЭНами, интерфейсы RS-232 и RS-485 (протокол Modbus). Все входы и выходы прибора имеют гальваническую изоляцию друг от друга.

Ноя 19 2010

Прерывания в Cortex M3. Часть 3

В предыдущей части (http://32bit.me/?p=842) были рассмотрены основные функции работы с прерываниями микроконтроллера LPC17хх. Однако, рассмотренные функции не работают с особым видом прерываний ядра Cortex M3 — системными исключениями. Ниже будет рассмотрена работа с системными исключениями на примере системного исключения SysTick. Также будет рассмотрено одно исключение из тех правил работы с прерываниями, которые рассматривались в части 2.

Read more »