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

 
 
> Портирование ядра. Написал драйвер 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
 
Start new topic
Ответов
Sanoend
сообщение Aug 22 2012, 11:44
Сообщение #2


Участник
*

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



Idle спасибо вам за помощь.
Ну опубликую для истории, куда двинулся дальше.
get_irqnr_preamble и т.д. в действительности не хватало в mach части. Я уже писал их для ядра 2.6.31
по этому просто добавил в /mach/include/entry-macro.S строки
Код
#include <mach/hardware.h>
#include <mach/irqs.h>
#include <mach/platform.h>

<-----><------>.macro<>disable_fiq
<------><------>.endm
<------><------>.macro  get_irqnr_preamble, base, tmp
<------><------>.endm
<------><------>.macro  arch_ret_to_user, tmp1, tmp2
<------><------>.endm
<------><------>.macro<>get_irqnr_and_base, irqnr, irqstat, base, tmp
<------><------>.endm

и создал там же файл platform.h
Код
#ifndef __PLATFORM_H__
#define __PLATFORM_H__


#define>SPMP8K_IO_BASE<><------>0x90000000


#define>SPMP8K_UART0_BASE<----->0x92B04000
#define>SPMP8K_UART0_DATA<----->0x00
#define>SPMP8K_UART0_STAT1<---->0x14<-->// 0x92B04014
#define>SPMP8K_UART0_STAT2<---->0x18<-->// 0x92B04018
#define>SPMP8K_UART0_STAT3<---->0x20<-->//


Эта ошибка пропала. Компиляция двинулась чуть дальше и стала появляться ошибка

/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/debug.S: Assembler messages:
/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/debug.S:159: Error: too many positional arguments
/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/kernel/debug.S:175: Error: too many positional arguments


Ну тут более менее понятно в чем причина, видимо в более старых (или наоборот новых) версиях ядра, передавались два параметра в addruart и именно это и объявленно в
/arch/arm/mach-spmp8000/include/mach/debug-macro.S
Код
<------>.macro  addruart, rp, rv
<------>mov     \rp, #0x92000000
<------>add<--->\rp, #0x00B00000
<------>add<--->\rp, #0x00004000
<------>orr<--->\rv, \rp, #0xF0000000
<------>.endm

#define UART_SHIFT 2
#include <asm/hardware/debug-8250.S>

а в /arch/arm/kernel/debug.S вызов идет с тремя параметрами
Код
<------><------>addruart_current r3, r1, r2

На данный моммент я решил не вникать, что там такое изменили и решил проблему самым простым и не правильным образом (только для теста)
в /arch/arm/mach-spmp8000/include/mach/debug-macro.S

Код
<------>.macro  addruart, rp, rv, rb


и встретил новую ошибку компиляции
CC arch/arm/mach-spmp8000/core.o
/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/mach-spmp8000/core.c: In function ‘spmp8000_init_irq’:
/home/armkernel/source/patchtest/linux-3.2.28/arch/arm/mach-spmp8000/core.c:90:2: error: implicit declaration of function ‘vic_of_init’
а вот такие ошибки всегда ставят меня в полный тупик.
неявное объявление функции "vic_of_init" , как его сделать явным?

у меня есть подозрение, что функция vic_of_init вызывается, но не где не объявлена. Или объявлена но не инклудится.
Ход моих мыслей верный?
Go to the top of the page
 
+Quote Post
Idle
сообщение Aug 22 2012, 12:22
Сообщение #3


Местный
***

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



Цитата(Sanoend @ Aug 22 2012, 15:44) *
у меня есть подозрение, что функция vic_of_init вызывается, но не где не объявлена. Или объявлена но не инклудится.
Ход моих мыслей верный?

да, такой функции нигде нет
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Sanoend   Портирование ядра. Написал драйвер UART как корректно его подключить.   Aug 16 2012, 08:38
- - IgorKossak   Цитата(Sanoend @ Aug 16 2012, 11:38) П.С....   Aug 17 2012, 11:11
- - Idle   Цитата(Sanoend @ Aug 16 2012, 12:38) Здра...   Aug 18 2012, 12:51
- - Sanoend   IgorKossak - спасибо. Буду знать и использовать. ...   Aug 21 2012, 06:58
|- - Idle   Цитата(Sanoend @ Aug 21 2012, 10:58) Idle...   Aug 21 2012, 07:35
- - Sanoend   Я так и пробовал. К сожалению в переписке не хвата...   Aug 21 2012, 08:08
|- - Idle   Цитата(Sanoend @ Aug 21 2012, 12:08) Напр...   Aug 21 2012, 08:16
- - Sanoend   нет linux/clkdev.h берется не из mach части а из о...   Aug 21 2012, 08:59
|- - Idle   Цитата(Sanoend @ Aug 21 2012, 12:59) Не п...   Aug 21 2012, 09:05
- - Sanoend   есть ещё патч в2 http://lists.infradead.org/piperm...   Aug 21 2012, 09:18
|- - Idle   Цитата(Sanoend @ Aug 21 2012, 13:18) есть...   Aug 21 2012, 09:51
- - Sanoend   Можно чуть подробнее, что такое cherry-pick ? Как...   Aug 21 2012, 10:21
|- - Idle   Цитата(Sanoend @ Aug 21 2012, 14:21) Можн...   Aug 21 2012, 10:38
- - Sanoend   второй патч 3.2.28 Куча ошибок сборки /home/armker...   Aug 21 2012, 12:53
- - Idle   хм, а без патча собирается? он в arch/arm/kernel/s...   Aug 21 2012, 13:14
- - Sanoend   нет в suspend.c он не чего не правил. Заметил полн...   Aug 21 2012, 13:57
|- - Dron_Gus   Цитата(Sanoend @ Aug 21 2012, 17:57) CONF...   Aug 21 2012, 19:04
|- - Idle   Цитата(Sanoend @ Aug 21 2012, 17:57) Заме...   Aug 22 2012, 05:47
- - Sanoend   Idle - файлы /arch/arm/Kconfig /arch/arm/Makefile...   Aug 22 2012, 08:32
|- - Idle   Цитата(Sanoend @ Aug 22 2012, 12:32) /arc...   Aug 22 2012, 09:18
|- - Idle   Цитата(Sanoend @ Aug 22 2012, 12:32) Или ...   Aug 22 2012, 09:59
|- - Sanoend   Цитата(Idle @ Aug 22 2012, 12:59) -D__LIN...   Aug 22 2012, 10:04
|- - Idle   Цитата(Sanoend @ Aug 22 2012, 14:04) можн...   Aug 22 2012, 10:13
- - Sanoend   если поменять в конфиге CONFIG_ARCH_VERSATILE=y н...   Aug 22 2012, 09:43
- - Sanoend   Не понял ядро чего? Процессора, если так , то spmp...   Aug 22 2012, 10:43
|- - Idle   Цитата(Sanoend @ Aug 22 2012, 14:43) Не п...   Aug 22 2012, 10:50
- - Sanoend   посмотрел в ванили 3.5.х там эта функция есть. Так...   Aug 22 2012, 12:41
- - Sanoend   Ядро упорно собирается под арм версализ. Пытаюсь в...   Aug 22 2012, 14:09
- - Idle   а зачем тебе свой конфиг, выбери в дефолтном нужны...   Aug 22 2012, 16:13
- - Sanoend   Удалось собрать ядро. В данный момент запускается ...   Aug 23 2012, 05:11
- - Sanoend   Удалось запустить ядро. Прежде всего хочу поблагод...   Sep 4 2012, 06:45
- - kurtis   Я могу ошибаться, но как мне кажется, драйвер ниче...   Sep 4 2012, 08:08
- - Sanoend   Спасибо за наводку. Активность на шине посмотрю. Р...   Sep 4 2012, 08:21
- - kurtis   Я бегло глянул драйвер s1d13xxxfb.c, там походу пр...   Sep 4 2012, 09:03
|- - Idle   Цитата(kurtis @ Sep 4 2012, 13:03) Нужно ...   Sep 4 2012, 09:09
- - Sanoend   RE: Портирование ядра. Написал драйвер UART как корректно его подключить.   Sep 4 2012, 13:10
- - Sanoend   Новости и вопросы с полей. На контроллер ЛСД не по...   Sep 7 2012, 06:40


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

 


RSS Текстовая версия Сейчас: 20th August 2025 - 09:18
Рейтинг@Mail.ru


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