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

 
 
> Портирование ядра. Написал драйвер 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
сообщение Sep 4 2012, 06:45
Сообщение #2


Участник
*

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



Удалось запустить ядро.
Прежде всего хочу поблагодарить всех кто помогал советом.
Я создал проек на гулокоде и написал там пару статей по неочевидным, на мой взгляд, момментам. Вот ссылка
https://code.google.com/p/linux-on-spmp8000/w/list

Сейчас мучаюсь с запуском экрана. Дисплей совместимый с PSP (пробовали перекидывать). По этому логично предположить что драйвер нужно использовать "Epson S1D13XXX FB Driver". Если верить DTS файлу, а так же данныйм в дизасемблированной родной прошивке, то адресом framebuffer должен быть 0x93000000
я пытался запустить дисплей инициализируя драйвер на этот адрес, но всегда получал сообщение
Код
probe called: device is c01d51a8
Epson S1D13XXX FB Driver
s1d13xxxfb: unknown chip production id 0, revision 0
s1d13xxxfb: please contant maintainer


Добавил дополнительные отладочные строки в цикле сравнения увидел вот это
Код
probe called: device is c01d51a8
Epson S1D13XXX FB Driver
s1d13xxxfb: prod_id = 0, s1d13xxxfb_prod_ids = 3
s1d13xxxfb: prod_id = 0, s1d13xxxfb_prod_ids = 4
s1d13xxxfb: prod_id = 0, s1d13xxxfb_prod_ids = 7
s1d13xxxfb: unknown chip production id 0, revision 0
s1d13xxxfb: please contant maintainer


Прот этом значение переменной prod_id берется как:
Код
<------>/* production id is top 6 bits */
prod_id = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) >> 2;
<------>/* revision id is lower 2 bits */
revision = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) & 0x3;


где S1DREG_REV_CODE имеет смещение ноль, относительно адреса начала фрейм буферра.

Я пробовал задать руками значения prod_id равные 3,4,7 в этом случае ядро пытается делить на ноль и уходит в панику.
Подскажите пожалуйста в какую сторону копать дальше.
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   Idle спасибо вам за помощь. Ну опубликую для истор...   Aug 22 2012, 11:44
|- - Idle   Цитата(Sanoend @ Aug 22 2012, 15:44) у ме...   Aug 22 2012, 12:22
- - 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
- - 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 Текстовая версия Сейчас: 23rd June 2025 - 15:51
Рейтинг@Mail.ru


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