Ник:
Пароль:

Контакты

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

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Процессорные модули » SK-iMX6S/D-SODIMM
SK-IMX6S-SODIMM / SPI
robertstar
Добавлено 21.01.2015 08:49
0
Сообщение: 1
robertstar
0

Пункты: 1892
Регистрация: 20.04.2013
Пол: Мужчина
Добрый день!
Подскажите пожалуйста, как задействовать SPI?
В /dev/ его нет.
С уважением Владимир.
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 21.01.2015 11:20 Сообщение: 2
Jury093
4.5

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

сначала в конфиге ядра включите SPI и поддержку для IMX
потом в файле платы пропишите структуры для устройств, далее в функции инита пропишите вызов регистрации для устройств..
примеры можно посмотреть в соседних файлах..

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

Пункты: 1892
Регистрация: 20.04.2013
Пол: Мужчина
Цитата
Цитата
Подскажите пожалуйста, как задействовать SPI?
В /dev/ его нет.

сначала в конфиге ядра включите SPI и поддержку для IMX
потом в файле платы пропишите структуры для устройств, далее в функции инита пропишите вызов регистрации для устройств..
примеры можно посмотреть в соседних файлах..


сначала в конфиге ядра включите SPI и поддержку для IMX (а где находиться этот конфиг???? и как его включить???)
потом в файле платы (в каком файле платы?) пропишите структуры для устройств (какие структуры и для каких устройств???), далее в функции инита (это в rc.local??? или где?) пропишите вызов регистрации для устройств (что за вызов регистрации для устройств???)..
примеры можно посмотреть в соседних файлах..(в каких соседних файлах?)
Спуститься к концу Подняться к началу
Персональная информация
Jury093
Добавлено 21.01.2015 21:59 Сообщение: 4
Jury093
4.5

Пункты: 54271
Регистрация: 25.05.2009
Пол: Мужчина
Из: Санкт-Петербург
Цитата
сначала в конфиге ядра включите SPI и поддержку для IMX (а где находиться этот конфиг???? и как его включить???)
потом в файле платы (в каком файле платы?) пропишите структуры для устройств (какие структуры и для каких устройств???), далее в функции инита (это в rc.local??? или где?) пропишите вызов регистрации для устройств (что за вызов регистрации для устройств???)..
примеры можно посмотреть в соседних файлах..(в каких соседних файлах?)

google.ru->"ядро menuconfig"
google.ru->"ядро файле платы"
google.ru->"ядро platform_register"
и самый важный запрос, без него не взлетит:
google.ru->"линукс для чайников"

так и хочется дописать еще совет
google.ru->"линукс - а что это???"

На любой вопрос есть любой ответ.
Спуститься к концу Подняться к началу
Персональная информация
robertstar
Добавлено 22.01.2015 06:35 Сообщение: 5
robertstar
0

Пункты: 1892
Регистрация: 20.04.2013
Пол: Мужчина
Цитата
Цитата
сначала в конфиге ядра включите SPI и поддержку для IMX (а где находиться этот конфиг???? и как его включить???)
потом в файле платы (в каком файле платы?) пропишите структуры для устройств (какие структуры и для каких устройств???), далее в функции инита (это в rc.local??? или где?) пропишите вызов регистрации для устройств (что за вызов регистрации для устройств???)..
примеры можно посмотреть в соседних файлах..(в каких соседних файлах?)

google.ru->"ядро menuconfig"
google.ru->"ядро файле платы"
google.ru->"ядро platform_register"
и самый важный запрос, без него не взлетит:
google.ru->"линукс для чайников"

так и хочется дописать еще совет
google.ru->"линукс - а что это???"


Спасибо за советы!
Ранее я работал с Beaglebone Black, так что там проблем не было, так как в инете много инфы по настройке и инициализации.
А переконфигурирование ядра я сам еще не делал, так что извините за такие вопросы)
Спуститься к концу Подняться к началу
Персональная информация
Pavel Ivanchenko
Добавлено 22.01.2015 10:45 Редактировалось 22.01.2015 10:46 Сообщение: 6
Pavel Ivanchenko
Admin
4.39

Пункты: 92788
Регистрация: 24.03.2009
Пол: Мужчина
Цитата
Подскажите пожалуйста, как задействовать SPI?

Вам может показаться странным, но постановка вопроса слишком широка ...
Штатно в системе уже используется 1 SPI для общения с контроллером сенсорного экрана.
Если вам нужно какую то микросхему по SPI подключить (и ее драйвер есть в системе), тогда проще всего подключить ее к этому же порту а в структуре подключения устройства прописать новый чип.
Если нужно общаться по SPI из приложения пользователя, это уже другой случай, если задействовать свободный SPI порт, для этого потребуется:
1) включить в ядре поддержку "User mode SPI ..." (SPIDEV)
2) инициализировать в боардфайле новый SPI порт
3) инициализировать пины для SPI порта
4) добавить в ините боардфайла объявление spidev (не помню, нужно его аттачить к реальному порту или нет)

Можно проще, перенастроить имеющийся SPI порт на spidev.

Где и какие конкретно "буквы прописать" я сам не знаю, помню только направление действий, исходники перед глазами - экспериментируйте (уверен, среди тучи боардфайлов сторонних плат в этом же ядре найдется и пример подключения spidev).
Спуститься к концу Подняться к началу
Персональная информация
robertstar
Добавлено 25.01.2015 12:18 Сообщение: 7
robertstar
0

Пункты: 1892
Регистрация: 20.04.2013
Пол: Мужчина
Добрый день!
С SPI вроде как разобрался, добавил структуру в board файл:

static struct spi_board_info spi_device_info[] __initdata = {
{
.modalias = "spidev",
.max_speed_hz = 20000000,
.bus_num = 0,
.chip_select = 0,
.mode = SPI_MODE_0,
},
{
.modalias = "spidev",
.max_speed_hz = 20000000,
.bus_num = 3,
.chip_select = 0,
.mode = SPI_MODE_0,
},
};

static void spi_device_init(void)
{
spi_register_board_info(spi_device_info, ARRAY_SIZE(spi_device_info));
}

Собрал ядро, залил, в /dev/ появились spidev0.0 и spidev3.0
Написал программку, которая в цикле читает и пишет в SPI.
Когда я делаю эту инициализацию, все работает нормально, смотрю в анализаторе.
int Init_SPI0(void)
{
txBuffer[0]=0xA1;
txBuffer[1]=0xB2;
txBuffer[2]=0xC3;
txBuffer[3]=0xD4;

xfer.rx_buf = (unsigned long)rxBuffer;
xfer.tx_buf = (unsigned long)txBuffer;
xfer.len = 4;
xfer.speed_hz = 6000000;
xfer.cs_change = 0;
xfer.bits_per_word = 8;
xfer.delay_usecs = 2;

spiDev = open(spi_name, O_RDWR);
if (spiDev == -1)
printf("can't open spidev\n");

res = ioctl(spiDev, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (res == -1)
printf("can't set max speed hz\n");

res = ioctl(spiDev, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (res == -1)
{
printf("can't get max speed hz\n");
}
printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);

return 0;
}

Но стоит мне изменить: xfer.len = 1; xfer.bits_per_word = 32; (Чтобы длинна слова была 4 байта), при запуске программы происходит следующее:
open /dev/mem successfully !
max speed: 6000000 Hz (6000 KHz)
Unable to handle kernel NULL pointer dereference at virtual address 000000d8
pgd = 80004000
[000000d8] *pgd=00000000
Internal error: Oops: 17 [#1] PREEMPT SMP
Modules linked in: adv7180_tvin g_serial
CPU: 0 Not tainted (3.1.2 #165)
PC is at journal_submit_data_buffers+0x5c/0x1f0
LR is at journal_submit_data_buffers+0x20/0x1f0
pc : [<801bd4bc>] lr : [<801bd480>] psr: 80000013
sp : 92363e58 ip : 9234b840 fp : 92362000
r10: 00000000 r9 : 9234ba20 r8 : 926efd4c
r7 : 00000171 r6 : 0a8f1e89 r5 : 926efd38 r4 : 00000000
r3 : 00000000 r2 : 92448b74 r1 : 926efd4c r0 : 00000000
Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: 10c53c7d Table: 2246c04a DAC: 00000015
Process jbd2/mmcblk0p1- (pid: 57, stack limit = 0x923622f0)
Stack: (0x92363e58 to 0x92364000)
3e40: 8081c224 92362000
3e60: 92448b74 92448b40 902423c0 00000001 8003edd8 9234b844 60000013 00000001
3e80: 00000003 00000000 807b2080 807b2080 92363ebc 8006c584 00000000 9234ba20
3ea0: 00000000 0a8f1e89 00000171 9234b800 807b2080 807b2080 92448b40 801bd9a4
3ec0: 8bc07160 9234bc00 92363f84 9234b800 9234b814 92448b7c 92363f24 92448d20
3ee0: 00000000 00000f84 9234e000 00000008 ffffffff 92448cc0 0a8f1e89 00000171
3f00: 8003d160 8003d160 0a8f1e89 00000171 9024c000 00000000 0006825e 00000000
3f20: 92363f5c 91827364 92363f28 92363f28 92363f30 00000001 80821c80 80821c80
3f40: 00000000 0000024c 00000000 0001f5f6 9234b814 9234ba58 9234b864 8008b454
3f60: 92363f8c 9234b800 9234b814 9234ba58 9234b864 92362000 9234b884 807b2080
3f80: 8009c3c0 801c298c 9202dd0c 00000000 9234bc00 8009c3c0 92363f98 92363f98
3fa0: 00000013 9202dcfc 9234b800 801c28e4 00000013 00000000 00000000 00000000
3fc0: 00000000 8009bc2c 80044598 00000000 9234b800 00000000 00000000 00000000
3fe0: 92363fe0 92363fe0 9202dcfc 8009bbac 80044598 80044598 ffffffff ffffffff
[<801bd4bc>] (journal_submit_data_buffers+0x5c/0x1f0) from [<801bd9a4>] (jbd2_journal_commit_transaction+0x31c/0x164c)
[<801bd9a4>] (jbd2_journal_commit_transaction+0x31c/0x164c) from [<801c298c>] (kjournald2+0xa8/0x1ec)
[<801c298c>] (kjournald2+0xa8/0x1ec) from [<8009bc2c>] (kthread+0x80/0x88)
[<8009bc2c>] (kthread+0x80/0x88) from [<80044598>] (kernel_thread_exit+0x0/0x8)
Code: e5953010 e2858014 e1a01008 e3a00000 (e59370d8)
---[ end trace 13cac4d000fae3ad ]---
note: jbd2/mmcblk0p1-[57] exited with preempt_count 1
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = 80004000
[00000000] *pgd=00000000
Internal error: Oops: 17 [#2] PREEMPT SMP
Modules linked in: adv7180_tvin g_serial
CPU: 0 Tainted: G D (3.1.2 #165)
PC is at unlink_anon_vmas+0x14/0x1c4
LR is at free_pgtables+0x2c/0xc8
pc : [<80110d38>] lr : [<80106ee4>] psr: a0000113
sp : 924abd40 ip : 0bbca000 fp : 924aa000
r10: 00000000 r9 : 926fb8f0 r8 : 924abda8
r7 : 926fb928 r6 : 00000000 r5 : 926fb8f0 r4 : 00000000
r3 : 00000000 r2 : 00001000 r1 : 926fb8f0 r0 : 926fb8f0
Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 10c53c7d Table: 223b004a DAC: 00000015
Process lighttpd (pid: 150, stack limit = 0x924aa2f0)
Stack: (0x924abd40 to 0x924ac000)
bd40: 60000113 00000001 924aa000 00000000 926fb8f0 00000000 00001000 924abda8
bd60: 924aa000 00000000 924aa000 80106ee4 00000000 926fb8f0 924b09c0 926fb8f0
bd80: 924b09c0 00000000 924abdc8 0000003d 0000008c 8010e044 00000020 00000000
bda0: 806db8d4 00000000 924b09c0 00000001 00000000 8012e71c fffffff5 00000000
bdc0: 00000400 926e1000 807e39a0 800c6798 924aec00 924b09c0 924b09fc 805b8118
bde0: 8bc06558 923c7150 924b09e8 924b09c0 924b09c0 924aef08 924b09fc 8007b144
be00: 924aec00 80080bc4 0000000b 924aec00 00106001 0000000b 924b09c0 924aec00
be20: 923c7100 80080d34 00000080 0000000b 924aa000 00000001 00000000 0000008d
be40: 00000000 924aec00 00000000 923c7100 0000000b 924aa000 00106001 9248df8c
be60: 924aa000 9248df88 0000000b 800815ac fffffff5 924abfb0 924abf00 924aa000
be80: 00106001 800901c8 8bc06558 00000028 9248e3c4 9248dec0 923c7100 418004fc
bea0: 924abfb0 924abeec 00000000 924abfb0 00000000 924aa000 00000000 00000000
bec0: 924aa000 00000000 0002f7e4 80046144 000f423e 00000000 924abed9 8bc06608
bee0: 00000000 00000000 2ace8e74 00000007 805baecc 807ca148 2ae20dc6 924abfb0
bf00: 0000000b 00000000 00030001 2ae20dc6 8bc07160 924aec00 924abecc 805b6028
bf20: 924aa000 92445460 00000000 924abf50 00000001 80161468 00000000 8013d404
bf40: 924abf64 92304b40 000f423e 00000001 2abf4c36 00000171 923a7500 00000631
bf60: 2162a236 00000630 2162a236 00000001 924aec00 80077828 00100100 00200200
bf80: 00000008 00000001 00000007 00021518 000000fc 00000000 924aa000 00021570
bfa0: 0002f7e4 80046b48 0000040f 80043af8 00000000 00040fa8 00000801 000003e8
bfc0: 00000007 00000000 00021518 000000fc 00021588 00030008 00021570 0002f7e4
bfe0: 00000000 7e901ab4 0000e113 2ae20dc6 60000030 ffffffff 25ffe821 25ffec21
[<80110d38>] (unlink_anon_vmas+0x14/0x1c4) from [<80106ee4>] (free_pgtables+0x2c/0xc8)
[<80106ee4>] (free_pgtables+0x2c/0xc8) from [<8010e044>] (exit_mmap+0x140/0x248)
[<8010e044>] (exit_mmap+0x140/0x248) from [<8007b144>] (mmput+0x48/0x114)
[<8007b144>] (mmput+0x48/0x114) from [<80080bc4>] (exit_mm+0x130/0x170)
[<80080bc4>] (exit_mm+0x130/0x170) from [<80080d34>] (do_exit+0x130/0x74c)
[<80080d34>] (do_exit+0x130/0x74c) from [<800815ac>] (do_group_exit+0x3c/0xbc)
[<800815ac>] (do_group_exit+0x3c/0xbc) from [<800901c8>] (get_signal_to_deliver+0x2c0/0x490)
[<800901c8>] (get_signal_to_deliver+0x2c0/0x490) from [<80046144>] (do_signal+0x64/0x4ec)
[<80046144>] (do_signal+0x64/0x4ec) from [<80046b48>] (do_notify_resume+0x38/0x44)
[<80046b48>] (do_notify_resume+0x38/0x44) from [<80043af8>] (work_pending+0x24/0x28)
Code: e1a07000 e5b74038 e24dd00c e1a09000 (e5943000)
---[ end trace 13cac4d000fae3ae ]---
Fixing recursive fault but reboot is needed!

Подскажите пожалуйста, где может быть проблема?
Еще есть вопрос, какова максимальная частота шины SPI?
С уважением Владимир.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 25.01.2015 17:56 Сообщение: 8
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
Судя по логу ошибка никак не связана с spi - скорей всего некорректный код у вас, по тому что вы привели не понять

Цитата

open /dev/mem successfully !


это зачем ?
Спуститься к концу Подняться к началу
Персональная информация
robertstar
Добавлено 25.01.2015 18:35 Сообщение: 9
robertstar
0

Пункты: 1892
Регистрация: 20.04.2013
Пол: Мужчина
Да нет же, /dev/mem, я открываю для последующего мапирования GPIO и т.д.
Сейчас пока это не используется.

static const char *spi_name = "/dev/spidev0.0";
static uint32_t speed = 60000000;
int spiDev;
struct spi_ioc_transfer xfer;
char rxBuffer[4];
char txBuffer[4];
uint32_t data= 0;
int res=0;
unsigned int i=0;

int Init_SPI0(void)
{
txBuffer[0]=0xA1;
txBuffer[1]=0xB2;
txBuffer[2]=0xC3;
txBuffer[3]=0xD4;

xfer.rx_buf = (unsigned long)rxBuffer;
xfer.tx_buf = (unsigned long)txBuffer;
xfer.len = 4;
xfer.speed_hz = 5000000;
xfer.cs_change = 0;
xfer.bits_per_word = 8;
xfer.delay_usecs = 2;

spiDev = open(spi_name, O_RDWR);
if (spiDev == -1)
printf("can't open spidev\n");

res = ioctl(spiDev, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (res == -1)
printf("can't set max speed hz\n");

res = ioctl(spiDev, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (res == -1)
{
printf("can't get max speed hz\n");
}
printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);

return 0;
}

uint32_t rwSPI(void)
{
res = ioctl(spiDev, SPI_IOC_MESSAGE(1), &xfer);
for ( i=0; i<= (sizeof (rxBuffer)-1); i++)
{
data<<=4;
data |= rxBuffer[i];
}
return data;
}

int main()
{
int memh=0;

printf( "!!!imx6-test1!!!\n");
/*Получаем доступ к памяти*/
memh = open("/dev/mem", O_RDWR | O_SYNC );
if (memh < 0)
{
printf("Failed to open the /dev/mem !\n");
return 0;
}
else
{
printf("open /dev/mem successfully !\n");
}

Init_SPI0();
while(1)
{
uint32_t InTemp = rwSPI();
printf("InTemp=%08X\n",InTemp);
sleep(1);
}


if (memh!=0)
{
close(memh);
}

return EXIT_SUCCESS;
}
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 25.01.2015 20:04 Сообщение: 10
sasamy
4.71

Пункты: 83542
Регистрация: 14.08.2009
В документации ядра есть пример

http://lxr.free-electrons.com/source/Documentation/spi/spidev_test.c?v=3.2#L180

там явно устанавливают количество бит в слове через ioctl

180 * bits per word
181 */
182 ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
183 if (ret == -1)
184 pabort("can't set bits per word");
185
186 ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
187 if (ret == -1)
188 pabort("can't get bits per word");
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Процессорные модули » SK-iMX6S/D-SODIMM