LINUX.ORG.RU

Управление i2s интерфейсом на си/с++

 , ,


1

4

Здравствуйте уважаемые! Имеется железка linkit smart 7688 с интерфейсом i2s, который идеально подходит для управления ws2811, но не могу найти никакой информации как им управлять напрямую, а не через драйвер alsa. В даташите на микропроцессор есть адреса регистров i2s, но видимо из-за разделения памяти ядра и памяти пользователя писать/читать туда напрямую не получается. И если для i2c есть библиотеки <linux/i2c-dev.h>,<i2c/smbus.h>, а устройство gpio находится в /sys/class, то для i2s я ничего не нашел. На устройство портирован дистрибутив openwrt. Заранее спасибо.


Ответ на: комментарий от mos

Я правильно понимаю что вот такой код работать не будет: uint32_t *a; a = 0x10000a00; *a = 0x81000400; потому что используется какое то виртуальное адресное пространство(честно говоря не знаю как правильно называется) и надо использовать функции readl, writel, для непосредственной записи в регистры процессора и что для выполнения этих функций достаточно root прав?

Leemur
() автор топика
Ответ на: комментарий от mos

Да ядро то понятное дело что работает, вот только в ядро лезть как то совсем не хочется, было бы шикарно из юрезспейса рулить. Но все равно большое спасибо, буду разбираться и обязательно попробую.

Leemur
() автор топика

Чтобы из юзерспейса добраться до тех адресов из даташита на soc, можно открыть /dev/mem, смапить через mmap(2) нужный регион из физического адресного пространства к себе в виртуальное, после уже читать или писать.

d_a ★★★★★
()
Ответ на: комментарий от Leemur

было бы шикарно из юрезспейса рулить

У драйвера i2s должен быть API для этого (ioctl обычно).

tailgunner ★★★★★
()
Ответ на: комментарий от Leemur

Спасибо буду пробовать

Только сейчас заметил, что речь не о каком-то i2s, а об i2c. У него есть стандартные юзерспейсные утилиты и юзерспейсный API,

выглядит как то что надо.

Тебе дали плохой совет. То, что ты на него повелся, печально.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

речь не о каком-то i2s, а об i2c.

там даже не i2c а однонаправленный однопроводный интерфейс, 1 и 0 кодируются шириной импульса

https://cdn-shop.adafruit.com/datasheets/WS2811.pdf

По-моему проще всего тут будет spi - для него тоже есть API для юзерспейс: период импульсов 2.5 us, соотвтетственно выставить частоту для 8-битных данных

8 * 10^6 / 2.5 = 3200000

передача 0xC0 - это 0 0xF0 - это 1

anonymous
()
Ответ на: комментарий от anonymous

По-моему проще всего тут будет spi

Я не думаю, что топикстартер разрабатывает устройство и может выбирать. Скорее всепго, у него уже есть именно i2c.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я не думаю, что топикстартер разрабатывает устройство и может выбирать.

так он же написал

Имеется железка linkit smart 7688

https://geektimes.ru/company/iridiummobile/blog/270368/

Чип имеет 22 контакта GPIO с поддержкой прерываний, часть которых может выполнять несколько функций в зависимости от конфигурации. В частности есть четыре выхода с PWM, SPI мастер и SPI слейв, I2S, I2C, три UART, хост USB 2.0.

там и PWM есть но сомневаюсь что с DMA, поэтому на Linux тайминги не выдержать

anonymous
()

то для i2s я ничего не нашел

Обычно никто не лезет в I2S с юзерспейса. Скорее всего тебе нужно писать модуль ядра, я всю документацию брать в даташите на linkit smart 7688

cvv ★★★★★
()
Последнее исправление: cvv (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.