Перейти к содержанию
    

Портирование ядра. Написал драйвер UART как корректно его подключить.

Здравствуйте. Я пытаюсь портировать ядро линукс на процессор SPMP8000 (основан на arm926).

Я написал свой драйвер ЮАРТ (пока сильно упрощенный вариант).

Вот код драйвера:

 

#include <linux/console.h>
#include <linux/serial_core.h>
#include <asm/io.h>
#include <mach/serial.h>

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/sched.h>
#include <linux/smp.h>
#include <linux/termios.h>
#include <linux/amba/bus.h>
#include <linux/amba/serial.h>
#include <linux/io.h>
#include <mach/platform.h>
#include <mach/hardware.h>
#include <asm/irq.h>
#include <asm/mach-types.h>
#include <asm/setup.h>
#include <asm/mach/arch.h>
#include <asm/mach/flash.h>
#include <asm/mach/irq.h>
#include <asm/mach/map.h>
#include <asm/mach/time.h>




//запись символа в юарт0
static void putc(int c)
{
	int timeout=4000;

	if (UART0_STATUS1 & 0x1E) return;
	while (timeout > 0) {
			if ((UART0_STATUS2 & 0x10) && ((UART0_STATUS3 & 4) == 0)) {
					UART0_DATA = c;
					break;
			}
			timeout--;
	}
}

// функция printk в  ЮАРТ
static void sanoprintk(struct console *co, const char *s, u_int count){
int i;
	/* Пишем каждый символ */
	for (i = 0; i < count; i++, s++) {
			if (*s == '\n'){
					putc('\r');
			}
			putc(*s);
	}
}


static int __init sano_console_setup(struct console *co, char *options)
{
	return 0;
}


/* Заполняем структуру консоли */

static struct console sano_uart_console = {
		.name   = "ttyS",				/* Имя консоли */
		.write  = sanoprintk, /* Как делать printk в консоли */
//		  .device = uart_console_device,	/* Предоставлена ядром serial */
		.setup  = sano_console_setup,
		.flags  = CON_PRINTBUFFER,		/* Флаг по умолчанию */
		.index  = -1,					 /* Инициализация в неправильное значение */
};
//register_console(&sano_uart_console);


/* Инициализация консоли */

static int __init sano_uart_console_init(void)
{
/* Регистрация этой консоли */
register_console(&sano_uart_console);
return 0;
}

console_initcall(sano_uart_console_init); /* Метка инициализации консоли */

В Makefile arch части добавил obj-y += serial.o, ядро собирается и драйвер в его добавляется, но вывод сообщений в ЮАРТ не происходит.

 

Однако если я в файде /init/main.c добавляю свою функцию sanoprintk , а так же заполняю и инициализирую структуру static struct console sano_uart_console прямо в начале функции start_kernel, то вывод в юарт работает так как надо.

Выглядит это примерно так

#ifdef STANDALONE_DEBUG
#define putstr printf
#else

static void sanoprintk(struct console *co, const char *s, u_int count);

#include <mach/uncompress.h>
#endif

static void sanoprintk(struct console *co, const char *s, u_int count){
int i;
	/* Пишем каждый символ */
	for (i = 0; i < count; i++, s++) {
			if (*s == '\n'){
					putc('\r');
			}
			putc(*s);
	}
}

asmlinkage void __init start_kernel(void)
{
/* Параметры каждого из поддерживаемых портов USB_UART */
	/* Заполняем структуру консоли */

static struct console sano_uart_console = {
	  .name   = "ttyS",				/* Имя консоли */
	  .write  = sanoprintk, /* Как делать printk в консоли */
	  .flags  = CON_PRINTBUFFER,		/* Флаг по умолчанию */
	  .index  = -1,					 /* Инициализация в неправильное значение */
};
register_console(&sano_uart_console);

 

 

Однако, это крайне не верное решение. Подскажите пожалуйста как подключить драйвер вынесенный в отдельный файл arch части ядра.

 

П.С. извиняюсь за много текста, но так и не понял как запехать тег CODE под спойлер

Изменено пользователем Rst7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

П.С. извиняюсь за много текста, но так и не понял как запехать тег CODE под спойлер

Вместо тэга CODE надо использовать CODEBOX (при размере кода более 10 строк).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте. Я пытаюсь портировать ядро линукс на процессор SPMP8000 (основан на arm926).

здравствуйте, всё спортировано до нас http://lists.infradead.org/pipermail/linux...ber/068699.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IgorKossak - спасибо. Буду знать и использовать.

 

Idle - да я видел это. Но не смог найти где скачать эти файлы.

Всё что можно я даже выдернул из общехо хода переписки в той рассылке, но там многого не хватает.

В ванильном ядре присутствует строка в arch/arm/tools/mach-types

letcool MACH_LETCOOL LETCOOL 3617

но больше нету не чего. Даже в arch/arm/Makefile отсутствует machine-$(CONFIG_ARCH_LETCOOL) не говоря уже об

arch/arm/mach-spmp8000/ и т.д.

 

я пробовал писать Zoltan Devai.

Может быть я что-то не понимаю. И вы мне подскажите где добыть патч для этой платформы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Idle - да я видел это. Но не смог найти где скачать эти файлы.

файлы разбиты на 9 писем в этом треде, из письма копипасти в файл - это и будет патч

 

В ванильном ядре присутствует строка в arch/arm/tools/mach-types

ну правильно, не включили же ничего, парень спортировал, запостил патч для того ядра, для которого писал, ему показали что не так и всё на этом

 

выясни ядро, на которое лягут патчи и собери, потом, если надо будет - портируй патчи на более свежее

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так и пробовал. К сожалению в переписке не хватает некоторых файлов.

Например, clkdev.h на него есть ссылка в clkdev.c

но самого это файла нету. И т.д. примерно после 40-50 пересборок с лечением ошибок я сдался.

Сколько там их всего я не знаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Например, clkdev.h на него есть ссылка в clkdev.c

так это #include <linux/clkdev.h>, его и не должно там быть

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нет

linux/clkdev.h

берется не из mach части а из общих инклайдов.

 

Я возможно перепутал название файлов т.к. в действительности #include <mach/clkdev.h> я сейчас не вижу.

Но я точно помню, что каких-то файлов не хватало.

Хотя возможно я где-то совершил ошибку.

Думаю стоит попробовать ещё раз. Не подскажите как определить под какую версию ядра писался этот патч.

Переписка датируется "Sun Oct 9 12:36:04 EDT 2011" я исходил из этого и брал последнее на тот момент ядро.

Но мне кажется я ошибся.

 

П.С. Спасибо большое за помощь.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не подскажите как определить под какую версию ядра писался этот патч.

Переписка датируется "Sun Oct 9 12:36:04 EDT 2011" я исходил из этого и брал последнее на тот момент ядро.

не знаю, я бы тоже взял последнее на тот момент

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а, этот товарищ у кого-то сделал cherry-pick, попробуй тогда на ванильное 3.2 наложить

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно чуть подробнее, что такое cherry-pick ?

 

Какой патч мне надо наложить? Нужно сначала собрать всё из сообщений первого патча, потом добавить к нему из второго патча, а потом накладывать на ванильное 3.2 ?

 

П.С. всегда такие сложности по сборке патчей из кучи писем? Не проще ли разработчику организовать что-то вроде git в котором будет и чистое ядро и пропатченое. Так можно будет скачивать и сразу патченое ядро и даже автоматом получать файл патча.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно чуть подробнее, что такое cherry-pick ?

он там когда разрабатывал, дёрнул один патч из девелоперской ветки разработчика системы прерываний

 

Какой патч мне надо наложить? Нужно сначала собрать всё из сообщений первого патча, потом добавить к нему из второго патча, а потом накладывать на ванильное 3.2 ?

нет, сразу бери v2, сохраняй 5 писем в 5 файлов с патчами и накладывай (текст письма можно даже не удалять) на ванильное 3.2

 

П.С. всегда такие сложности по сборке патчей из кучи писем?

не знаю, беру обычно из коммитов

Изменено пользователем Idle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

второй патч 3.2.28

Куча ошибок сборки

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c: In function ‘cpu_suspend’:

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c:42:32: error: dereferencing pointer to incomplete type

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c:56:3: error: implicit declaration of function ‘cpu_switch_mm’

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c:57:3: error: implicit declaration of function ‘local_flush_tlb_all’

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c: In function ‘cpu_suspend_init’:

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c:65:2: error: implicit declaration of function ‘pgd_alloc’

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c:65:27: error: ‘init_mm’ undeclared (first use in this function)

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c:65:27: note: each undeclared identifier is reported only once for each function it appears in

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c:68:3: error: implicit declaration of function ‘identity_mapping_add’

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/suspend.c:68:50: error: ‘SECTION_SIZE’ undeclared (first use in this function)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

хм, а без патча собирается? он в arch/arm/kernel/suspend.c что-то правил?

 

упд

под другую какую-нибудь борду с тем же ядром в soc у тебя собирается?

Изменено пользователем Idle

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...