Портирование ядра. Написал драйвер UART как корректно его подключить.
Форум — Mobile
Здравствуйте. Я пытаюсь портировать ядро линукс на процессор 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 части ядра.