реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Портирование ядра. Написал драйвер UART как корректно его подключить., spmp8000
Sanoend
сообщение Aug 16 2012, 08:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-08-12
Пользователь №: 73 144



Здравствуйте. Я пытаюсь портировать ядро линукс на процессор SPMP8000 (основан на arm926).
Я написал свой драйвер ЮАРТ (пока сильно упрощенный вариант).
Вот код драйвера:

CODE
#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, то вывод в юарт работает так как надо.
Выглядит это примерно так
CODE
#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 - Aug 17 2012, 12:14
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 17 2012, 11:11
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Sanoend @ Aug 16 2012, 11:38) *
П.С. извиняюсь за много текста, но так и не понял как запехать тег CODE под спойлер

Вместо тэга CODE надо использовать CODEBOX (при размере кода более 10 строк).
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 18 2012, 12:51
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Sanoend @ Aug 16 2012, 12:38) *
Здравствуйте. Я пытаюсь портировать ядро линукс на процессор SPMP8000 (основан на arm926).

здравствуйте, всё спортировано до нас http://lists.infradead.org/pipermail/linux...ber/068699.html
Go to the top of the page
 
+Quote Post
Sanoend
сообщение Aug 21 2012, 06:58
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-08-12
Пользователь №: 73 144



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.
Может быть я что-то не понимаю. И вы мне подскажите где добыть патч для этой платформы.
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 21 2012, 07:35
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Sanoend @ Aug 21 2012, 10:58) *
Idle - да я видел это. Но не смог найти где скачать эти файлы.

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

Цитата(Sanoend @ Aug 21 2012, 10:58) *
В ванильном ядре присутствует строка в arch/arm/tools/mach-types

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

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

Go to the top of the page
 
+Quote Post
Sanoend
сообщение Aug 21 2012, 08:08
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-08-12
Пользователь №: 73 144



Я так и пробовал. К сожалению в переписке не хватает некоторых файлов.
Например, clkdev.h на него есть ссылка в clkdev.c
но самого это файла нету. И т.д. примерно после 40-50 пересборок с лечением ошибок я сдался.
Сколько там их всего я не знаю.
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 21 2012, 08:16
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Sanoend @ Aug 21 2012, 12:08) *
Например, clkdev.h на него есть ссылка в clkdev.c

так это #include <linux/clkdev.h>, его и не должно там быть
Go to the top of the page
 
+Quote Post
Sanoend
сообщение Aug 21 2012, 08:59
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-08-12
Пользователь №: 73 144



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

Я возможно перепутал название файлов т.к. в действительности #include <mach/clkdev.h> я сейчас не вижу.
Но я точно помню, что каких-то файлов не хватало.
Хотя возможно я где-то совершил ошибку.
Думаю стоит попробовать ещё раз. Не подскажите как определить под какую версию ядра писался этот патч.
Переписка датируется "Sun Oct 9 12:36:04 EDT 2011" я исходил из этого и брал последнее на тот момент ядро.
Но мне кажется я ошибся.

П.С. Спасибо большое за помощь.
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 21 2012, 09:05
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Sanoend @ Aug 21 2012, 12:59) *
Не подскажите как определить под какую версию ядра писался этот патч.
Переписка датируется "Sun Oct 9 12:36:04 EDT 2011" я исходил из этого и брал последнее на тот момент ядро.

не знаю, я бы тоже взял последнее на тот момент
Go to the top of the page
 
+Quote Post
Sanoend
сообщение Aug 21 2012, 09:18
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-08-12
Пользователь №: 73 144



есть ещё патч в2
http://lists.infradead.org/pipermail/linux...ber/070007.html
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 21 2012, 09:51
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Sanoend @ Aug 21 2012, 13:18) *

а, этот товарищ у кого-то сделал cherry-pick, попробуй тогда на ванильное 3.2 наложить
Go to the top of the page
 
+Quote Post
Sanoend
сообщение Aug 21 2012, 10:21
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-08-12
Пользователь №: 73 144



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

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

П.С. всегда такие сложности по сборке патчей из кучи писем? Не проще ли разработчику организовать что-то вроде git в котором будет и чистое ядро и пропатченое. Так можно будет скачивать и сразу патченое ядро и даже автоматом получать файл патча.
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 21 2012, 10:38
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



Цитата(Sanoend @ Aug 21 2012, 14:21) *
Можно чуть подробнее, что такое cherry-pick ?

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

Цитата(Sanoend @ Aug 21 2012, 14:21) *
Какой патч мне надо наложить? Нужно сначала собрать всё из сообщений первого патча, потом добавить к нему из второго патча, а потом накладывать на ванильное 3.2 ?

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

Цитата(Sanoend @ Aug 21 2012, 14:21) *
П.С. всегда такие сложности по сборке патчей из кучи писем?

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

Сообщение отредактировал Idle - Aug 21 2012, 11:03
Go to the top of the page
 
+Quote Post
Sanoend
сообщение Aug 21 2012, 12:53
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 16-08-12
Пользователь №: 73 144



второй патч 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)
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 21 2012, 13:14
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 351
Регистрация: 5-04-05
Пользователь №: 3 874



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

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

Сообщение отредактировал Idle - Aug 21 2012, 13:39
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 23:45
Рейтинг@Mail.ru


Страница сгенерированна за 0.01509 секунд с 7
ELECTRONIX ©2004-2016