Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:5
Форум » starterkit.ru » Embedded Linux
Как скомпилировать модуль ядра под AT91SAM9260
XShadow
Добавлено 03.12.2010 01:33
0
Сообщение: 1
XShadow
0

Пункты: 193
Регистрация: 03.12.2010
Здравствуйте.
Имеется плата с AT91SAM9260. Требуется из линукса работать с SPI. Почитал вот эту тему: http://www.starterkit.ru/html/index.php?name=forum&op=view&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 иначе он не хотел их видеть.

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

Я в этом всем новичек и скорее всего делаю все не так как надо. Подскажите пожалуйста как именно нужно компилировать.
Спуститься к концу Подняться к началу
Персональная информация
_kp
Добавлено 03.12.2010 10:24 Редактировалось 03.12.2010 10:31 Сообщение: 2
_kp
0

Пункты: 311
Регистрация: 10.02.2010
Из: Иваново
1.
собери на компе linux-headers. в каталоге с исходниками запусти:

#!/bin/sh
make ARCH=arm CROSS_COMPILE=/usr/local/bin/arm-2007q1/bin/arm-none-linux-gnueabi- headers_
install

2.
Компилируй примерно так:
TARGET=my_driver

obj-m += $(TARGET).o
$(TARGET)-objs := init.o file1.o file2.0 ...

CURRENT = $(shell uname -r)
KDIR = /lib/modules/$(CURRENT)/build. #путь к linux-headers можешь задать свой.
DEST = /lib/modules/$(CURRENT)/kernel/$(MDIR)
PWD = $(shell pwd)

default:
make -C $(KDIR) SUBDIRS=$(PWD) modules

Этот мэйк файл для сборки модулей на самом arm. Мне их так удобнее, прямо на железе мучить.
Спуститься к концу Подняться к началу
Персональная информация
Strijar
Добавлено 03.12.2010 12:39 Сообщение: 3
Strijar
Ранг
5

Группа: Клиенты
Пункты: 1618
Регистрация: 21.04.2009
Пол: Мужчина
Я делаю так:

Makefile

Код

obj-m := drv.o
drv-objs := src1.o src2.o


скрипт cross

Код

export PATH="/home/strijar/work/arm-2010q1/bin:${PATH}"
export CROSS_COMPILE=arm-none-linux-gnueabi-

make ARCH=arm -C ../linux-2.6.32.8 M=`pwd` modules
Спуститься к концу Подняться к началу
Персональная информация
XShadow
Добавлено 05.12.2010 00:22 Сообщение: 4
XShadow
0

Пункты: 193
Регистрация: 03.12.2010
Спасибо большое за ответы, они очень помогли!

Еще один вопрос появился - а как скомпилировать программу под линукс на ARM?

Пишу простой код hello world.c

Далее пишу:
arm-none-linux-gnueabi-gcc -mcpu=arm926ej-s helloworld.c -o helloworld

Потом копирую фаил в папку и стартую плату. Загружается линукс.

Далее пишу ./helloworld
На что он мне ругается что No such file or directory. Попытка запуска через mc приводит к томуже. Причем файл лежит в папке и никуда не девается. В чем может быть проблема? Может он неправильно скомпилирован?
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 05.12.2010 00:29 Редактировалось 05.12.2010 02:04 Сообщение: 5
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Может он неправильно скомпилирован?

вероятно не хватает ключа -static
после обычной компиляции дайте команду ls -l
потом компиляция с этим ключом и еще раз ls -l
смотрите размер конечного файла

update и еще права на запуск файла проверьте. мало ли..

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
XShadow
Добавлено 05.12.2010 18:07 Сообщение: 6
XShadow
0

Пункты: 193
Регистрация: 03.12.2010
Jury093 спасибо, добавил параметр статик и программа стала запускаться.

Появился еще вопрос один. Я хочу использовать SPI1 с CS1 который на ножке PC5 находится.
В файле board-sam9260ek.c в секцию spi устройств я написал:
Код
{ /*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 которое можно будет использовать??
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 05.12.2010 19:26 Сообщение: 7
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Jury093 спасибо, добавил параметр статик и программа стала запускаться.

ок. не вы первый, кто наступил на эти грабли :)

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

у меня с SPI как-то не очень складывается..
почитайте например вот тут:
http://www.starterkit.ru/html/index.php?name=forum&op=view&id=8139

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
XShadow
Добавлено 05.12.2010 19:42 Сообщение: 8
XShadow
0

Пункты: 193
Регистрация: 03.12.2010
Я читал эту тему. Там я так понял основная проблема была в том что в board-sam9260ek.c не были добавлены нужные строчки.

Я все это сделал но устойства не появляются. Скорее всего это из за того что в файловой системе нет udev или mdev. Следовательно нужно создать устройство руками но я не могу понять какой минорный номер будет у моего устройства если в исходниках оно объявлено как написано постом выше
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 05.12.2010 19:58 Сообщение: 9
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
Я читал эту тему

упс, это я не увидел ссылки в первом сообщение..

Цитата
системе нет udev или mdev

а что консоль пишет в ответ на команды udev или mdev -s?

я бы минор поставил 2, но в доке видел строчки, что нельзя самому прописывать устройства

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
XShadow
Добавлено 05.12.2010 20:05 Сообщение: 10
XShadow
0

Пункты: 193
Регистрация: 03.12.2010
Консоль говорит comend not found)
Этих программ просто нет в системе
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux