LINUX.ORG.RU

Сообщения Sanoend

 

Портирование ядра. Написал драйвер 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 части ядра.

 spmu8000, ,

Sanoend
()

RSS подписка на новые темы