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

 
 
> Как скомпилировать модуль ядра под AT91SAM9260
X-Shadow
сообщение Dec 2 2010, 22:34
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 31-08-06
Пользователь №: 19 988



Здравствуйте.
Имеется плата с AT91SAM9260. Требуется из линукса работать с SPI. Почитал вот эту тему: http://www.starterkit.ru/html/index.php?na...iew&id=8139

В итоге сделал как там и говорилось: включил поддержку spidev в ядре, подредактировал at91sam9260_devices.c сделав short enable_spi1 = 1.

Ядро загружается, есть строчка atmel_spi atmel_spi.1: Atmel SPI Controller at 0xfffcc000 (irq 13). В каталоге sys/devices есть spidev. В /dev устройств spi нет. Я так понял они должны появиться после запуска модуля.

Нашел пример модуля:

Код
#include <linux/spi/spi.h>

#include <mach/gpio.h>// at91 specific GPIO pins



#define SPI_1_SPEED 1*1000*1000

#define MYCHIP_CS_PIN AT91_PIN_PС5



static struct spi_board_info my_spi_device =

{

    .modalias       = "myspidev",// имя устройства

    .chip_select    = 2,// абстрактный номер микросхемы

    .bus_num        = 1,// номер шины

    .max_speed_hz   = SPI_1_SPEED,// максимальная скорость подключения

    .controller_data = (void *) MYCHIP_CS_PIN,// выбор кристалла

    .mode           = SPI_MODE_0,// режим работы SPI, поддерживаемый микросхемой

};



static int init_and_send_data(void)

{

    static struct spi_device* my_spi_ptr;
    int err;

    struct spi_master* spi = spi_busnum_to_master( my_spi_device.bus_num );

    if( spi == NULL )

    {

        printk("unable to get spi master %d\n", my_spi_device.bus_num);

        return -1;

    }



    my_spi_ptr = spi_new_device( spi, my_spi_device );

    if( my_spi_ptr == NULL )

    {

        printk("unable to create my spi device\n");

        return -1;

    }



    u8 reg[2];

    reg[0] = 0x00<<1;// адрес, обычно младший бит указывает режим чтение/запись

    reg[1] = 0x00;// данные

    spi_write( my_spi_ptr, reg, sizeof(reg) );



out:

    spi_unregister_device(spi_codec);

    return err;

}


Насколько я понял данный модуль при инициализации посылает по SPI1 по CS1 2 байта и выгружается.

Проблема возникла с компиляцией. Порылся в интернете но так и не нашел как компилировать модули к ядру с помощью codesourcery (может быть не там/плохо искал).

Собственно скачал Codesourcery for ARM GNU/Linux & IA32 GNU/Linux версии arm-2007q1-22. С помощью нее компилировал ядро, т.е она работает (компилировал не сам задавая значения а скачал пример сборки).

Создал файл myspidev.c. Попробовал откомпилировать так:

arm-none-linux-gnueabi-gcc -mcpu=arm926ej-s myspidev.c -o myspidev

Инклуды указал напрямую, т.е /usr/src/linux-2.6.27/include/linux/spi/spi.h иначе он не хотел их видеть.

В конечном итоге при попытке компиляции выводит множетсво ошибок как в самих инклудах так и в файле модуля.

Я в этом всем новичек и скорее всего делаю все не так как надо. Подскажите пожалуйста как именно нужно компилировать.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
/dev/null
сообщение Dec 3 2010, 06:21
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 17-11-06
Пользователь №: 22 438



У меня используется такой Make для сборки самодельного драйвера MSP430:
Код
obj-m := msp430.o
driverioctl-objs := msp430.o

KDIR  := /home/kirill/mv_pro_4.0.1/kernel #kernel directory
PWD   := $(shell pwd) #current directory
default:
        $(MAKE) -C $(KDIR) M=$(PWD) modules
Go to the top of the page
 
+Quote Post
kurtis
сообщение Dec 3 2010, 06:42
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Цитата(X-Shadow @ Dec 3 2010, 00:34) *
Ядро загружается, есть строчка atmel_spi atmel_spi.1: Atmel SPI Controller at 0xfffcc000 (irq 13). В каталоге sys/devices есть spidev. В /dev устройств spi нет. Я так понял они должны появиться после запуска модуля.

Нет. Ядро "наполняет" папки /sys и /proc, остальное отдано пользователю. Вы должны предварительно сформировать содержимое папки /dev создав файл устройства с помощью команды mknod указав минорный и мажорный номер. Если у вас стоит что-то вроде udev, то эта операция может выполняться автоматически, но скорее всего, udev у вас не стоит. Кстати, если пройти по приведенной вами ссылко, то во втором сообщении будет подсказка
Цитата
/dev/spidevB.C ... character special device, major number 153 with
a dynamically chosen minor device number. This is the node
that userspace programs will open, created by "udev" or "mdev".
только вам его проще будет создать ручками.

Цитата(X-Shadow @ Dec 3 2010, 00:34) *
Проблема возникла с компиляцией. Порылся в интернете но так и не нашел как компилировать модули к ядру с помощью codesourcery (может быть не там/плохо искал).

codesourcery это обычный gcc, но собранный умными людьми. Теоретически, сборка модуля обычным gcc и codesourcery-gcc ничем не должна отличаться, а найти руководства по сборке модуля с помощью gcc не должно составить большого труда.

Цитата
Создал файл myspidev.c. Попробовал откомпилировать так:

Помоему, там make нужно запускать с параметром module. Посмотрите здесь, там ближе к конце рассказывается как модуль собрать.

Цитата
Инклуды указал напрямую, т.е /usr/src/linux-2.6.27/include/linux/spi/spi.h иначе он не хотел их видеть.

вы точно компилируете именно это ядро под arm? я обычно все свои исходники держу в папке /home/$USER, а в /usr/lib находится только то, что напрямую относиться к хост системе. (это я так, на всякий случай спросил)

Цитата
В конечном итоге при попытке компиляции выводит множетсво ошибок как в самих инклудах так и в файле модуля.

Попробуйте сделать как написанно по ссылке, что я приводил чуть выше. Если все плохо, то приводите лог ошибок.
Go to the top of the page
 
+Quote Post
X-Shadow
сообщение Dec 5 2010, 14:25
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 31-08-06
Пользователь №: 19 988



Большое спасибо за совет!

Хотел уточнить. Я хочу использовать SPI1 с CS1 который на ножке PC5 находится.
В файле board-sam9260ek.c я написал:

Код
    {    /*my SPI*/
        .modalias    = "spidev",
        .chip_select    = 2,
        .controller_data = AT91_PIN_PC5,
        .max_speed_hz    = 1 * 1000 * 1000,
        .bus_num    = 1,
    },


Теперь нужно зайти в линукс и написать команду mknod /dev/spidev c 153 0 и после долны появиться устройство /dev/spidev1.1 которое можно будет использовать??
Go to the top of the page
 
+Quote Post
X-Shadow
сообщение Dec 5 2010, 16:49
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 31-08-06
Пользователь №: 19 988



Почитал несколько тем на этот счет. (основная эта - http://www.starterkit.ru/html/index.php?na...ew&id=8139)
Я так понял проблема там заключалась в том что в файл board-sam9260ek.c не были внесены соответствующие строчки. После того как это сделали у них появилось устройство.

Но в там у людей был udev а у меня нет udev или mdev. Необходимо создать устройство вручную. Проблема в том что я не знаю минорный номер устройства SPI1 с CS1. Как мне можно его узнать?
Go to the top of the page
 
+Quote Post
kurtis
сообщение Dec 5 2010, 22:09
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205



Цитата
Теперь нужно зайти в линукс и написать команду mknod /dev/spidev c 153 0 и после долны появиться устройство /dev/spidev1.1 которое можно будет использовать??

в документации написано что так лучше не делать, но в любом случае, если вы так сделаете, то появиться устройство /dev/spidev, без 1.1 в конце, зато если драйвер работает правильно, то sysfs по определенному адресу, должны появиться какие-то устройства (конкретно можно в Documentation/spi почитать).

у вас в sysfs устройства spi появляются? при загрузке что-то про spi пишет?
Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 7 2010, 08:01
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(X-Shadow @ Dec 5 2010, 19:49) *
Но в там у людей был udev а у меня нет udev или mdev. Необходимо создать устройство вручную. Проблема в том что я не знаю минорный номер устройства SPI1 с CS1. Как мне можно его узнать?


Начиная с версии ядра 2.6.35 ядру опять вернули возможность экспортировать файлы устройств в юзерсейс (напомню - раньше была devfs которую разработчики дружно раскритиковали и выбросили из ядра sm.gif правда сейчас это только на этапе загрузки делается а потом нужен hotplug агент для создания файлов устройств появляющихся динамически, но вам этого достаточно. В menuconfig эта опция нахоится тут
Device Drivers ---> Generic Driver Options --->
[*] Maintain a devtmpfs filesystem to mount at /dev
[*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
Помоему это не работает если корневая ФС находится в initramfs.
Go to the top of the page
 
+Quote Post
~phase
сообщение Dec 24 2010, 15:58
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 24-06-07
Из: ukraine
Пользователь №: 28 658



Цитата(sasamy @ Dec 7 2010, 13:01) *
Начиная с версии ядра 2.6.35 ядру опять вернули возможность экспортировать файлы устройств в юзерсейс (напомню - раньше была devfs которую разработчики дружно раскритиковали и выбросили из ядра sm.gif правда сейчас это только на этапе загрузки делается а потом нужен hotplug агент для создания файлов устройств появляющихся динамически, но вам этого достаточно. В menuconfig эта опция нахоится тут
Device Drivers ---> Generic Driver Options --->
[*] Maintain a devtmpfs filesystem to mount at /dev
[*] Automount devtmpfs at /dev, after the kernel mounted the rootfs
Помоему это не работает если корневая ФС находится в initramfs.

модули собираються типа так:
make menuconfig
в меню:
* - вкомпилировано в ядро
M - собирать модуль
сохраняем конфу
собираем
в самом конце сборки будет написано де лежат ваши модули, заливаете на ваш ФС и стартуете стандартными процедурами работы с модулями. insmod к примеру. если через modprobe то там его надо в соответсвующее место ложить надо.
Go to the top of the page
 
+Quote Post

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

 


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


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