Jump to content

    
Sign in to follow this  
Sanoend

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

Recommended Posts

Здравствуйте. Я пытаюсь портировать ядро линукс на процессор 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 под спойлер

Edited by Rst7

Share this post


Link to post
Share on other sites
П.С. извиняюсь за много текста, но так и не понял как запехать тег CODE под спойлер

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

Share this post


Link to post
Share on other sites
Здравствуйте. Я пытаюсь портировать ядро линукс на процессор SPMP8000 (основан на arm926).

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

Share this post


Link to post
Share on other sites

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.

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

Share this post


Link to post
Share on other sites
Idle - да я видел это. Но не смог найти где скачать эти файлы.

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

 

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

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

нет

linux/clkdev.h

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

 

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

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

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

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

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

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

 

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

 

Share this post


Link to post
Share on other sites
Не подскажите как определить под какую версию ядра писался этот патч.

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

Share this post


Link to post
Share on other sites
Можно чуть подробнее, что такое cherry-pick ?

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

 

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

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

 

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

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

Edited by Idle

Share this post


Link to post
Share on other sites

второй патч 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)

 

Share this post


Link to post
Share on other sites

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

 

упд

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

Edited by Idle

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this