Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru
Партнеры:
otladka.com.ua - г.Киев

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

User Info


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

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

Ник:
Пароль:

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

ОбновитьПодробнееВсегоВсего:6
Форум » starterkit.ru » Embedded Linux
Эмуляция master-контроллера spi через gpio в linux
sasamy
Добавлено 10.08.2010 19:04 Сообщение: 51
sasamy
4.70

Пункты: 77159
Регистрация: 14.08.2009
Цитата

1) предложенный Сашей патчик заставляет драйвер постоянно крутиться, жрет ресурсы. некузяво.


Ви будете смеяться но все с точностью до наоборот :) достаточно взглянуть на код:
Код

static irqreturn_t ads7846_irq(int irq, void *handle)
{
struct ads7846 *ts = handle;
unsigned long flags;

spin_lock_irqsave(&ts->lock, flags);
// if (likely(get_pendown_state(ts))) {
// if (!ts->irq_disabled) {
/* The ARM do_simple_IRQ() dispatcher doesn't act
* like the other dispatchers: it will report IRQs
* even after they've been disabled. We work around
* that here. (The "generic irq" framework may help...)
*/
ts->irq_disabled = 1;
disable_irq_nosync(ts->spi->irq);
ts->pending = 1;
hrtimer_start(&ts->timer, ktime_set(0, TS_POLL_DELAY),
HRTIMER_MODE_REL);
// }
// }
spin_unlock_irqrestore(&ts->lock, flags);

return IRQ_HANDLED;
}


Как можно увидеть - когда приходит прерывание во первых эти прерывания от penirq запрещаются и запускается системный таймер не блокирующий процесс - мы тут же отдаем управление системе. По завершении выдержки таймера ядро вызывает ф-ию-обработчик ads7846_timer где и проверяется состояние pendown
Код

if (unlikely(!get_pendown_state(ts) ||
device_suspended(&ts->spi->dev))) {

Это как раз и есть защита от дребезга - на осцилле Павел видел мочалку из чередующих 0 и 1 что приводило к моментальному зависанию системы - прерывания шли одно за другим, в моем случае при приходе первого _всегда_ на время таймера отключаются прерывания.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 10.08.2010 19:09 Сообщение: 52
sasamy
4.70

Пункты: 77159
Регистрация: 14.08.2009
По поводу всего остального - нужно калибровать тачскрин, в составе libts есть утилитка calibrate помоему называется. Нужно запустить ее и следовать указаниям - потыкать на крестики появляющиеся, калибровочные коэффициенты она потом запоминает сама. В приложениях нужно указывать что работать им нужно через libts - практически все понимают ее. Если использовать стандартное устройство ввода - указатель бегает в противоположную сторону от того куда ты ему показываешь :)
Спуститься к концу Подняться к началу
Персональная информация
rw9uao
Добавлено 10.08.2010 19:37 Сообщение: 53
rw9uao
Ранг
5

Группа: Клиенты
Пункты: 6973
Регистрация: 26.03.2009
понятно. буду завтра допиливать. или не завтра. а вот libts мне, видимо, не пригодится. заказчик самописный GUI рисует. пяток кнопок на экране не требуют для себя полновесных Х-ов.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 10.08.2010 20:11 Сообщение: 54
sasamy
4.70

Пункты: 77159
Регистрация: 14.08.2009
По поводу загрузки системы, вот top загрузки если непрерывно возить по экрану лапой :)
Код

Mem: 14248K used, 46460K free, 0K shrd, 0K buff, 4432K cached
CPU: 4.9% usr 6.5% sys 0.0% nic 87.5% idle 0.0% io 0.9% irq 0.0% sirq
Load average: 0.00 0.02 0.00 2/39 2174
PID PPID USER STAT VSZ %MEM CPU %CPU COMMAND
591 1 root S 33928 55.5 0 7.7 /usr/bin/mpd --no-create-db
399 2 root RW< 0 0.0 0 3.1 [spi_gpio.3]
2174 558 root R 3156 5.1 0 0.4 top
488 1 root S 3020 4.9 0 0.2 /sbin/watchdog -T 10 /dev/watchdog
555 1 root S 4104 6.7 0 0.0 /usr/sbin/openvpn --daemon --write
529 1 root S 3284 5.3 0 0.0 /usr/sbin/ntpd -p 0.europe.pool.nt
532 1 root S 3156 5.1 0 0.0 /bin/sh /usr/local/bin/stream-moni
558 1 root S 3156 5.1 0 0.0 -sh
557 1 root S 3156 5.1 0 0.0 /sbin/getty 38400 tty1 linux
1 0 root S 3152 5.1 0 0.0 init
561 1 root S 3152 5.1 0 0.0 /usr/bin/tail -f /var/log/messages
559 1 root S 3152 5.1 0 0.0 /sbin/syslogd -n -m 0
560 1 root S 3152 5.1 0 0.0 /sbin/klogd -n
491 1 root S 3152 5.1 0 0.0 /usr/sbin/telnetd
2173 532 root S 3020 4.9 0 0.0 sleep 60
403 2 root SW< 0 0.0 0 0.0 [mxs-spi.0]
4 2 root SW< 0 0.0 0 0.0 [events/0]
5 2 root SW< 0 0.0 0 0.0 [khelper]
142 2 root SW< 0 0.0 0 0.0 [khubd]
2 0 root SW< 0 0.0 0 0.0 [kthreadd]


Вот наш нагрузитель:
399 2 root RW< 0 0.0 0 3.1 [spi_gpio.3]
что неудивительно - наш "контроллер" вовсю старается програмно колотить лапками передавая текущие координаты, но даже при этом это всего 3 %. В реальных условиях работы загрузки от него вообще не видно.
Спуститься к концу Подняться к началу
Персональная информация
rw9uao
Добавлено 16.08.2010 13:20 Сообщение: 55
rw9uao
Ранг
5

Группа: Клиенты
Пункты: 6973
Регистрация: 26.03.2009
запускаю ts_calibrate, калибрую. записываю в /usr/local/etc/pointercal выданные цифирки. а ts_test не хочет рисовать, и читает не отмасштабированные данные. а те, которые я ему в ABS_X, ABS_Y сую. поправил вывод в драйвере тачскрина.
x = 480 - (x * 480 / 4096)
демка стала работать корректно. почти. т.к. начало тачскрина 30х30, а начало экрана 0х0. как заставить tslib отдавать откалиброванные данные. и как пользоваться этой либой?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 16.08.2010 15:28 Сообщение: 56
sasamy
4.70

Пункты: 77159
Регистрация: 14.08.2009
Цитата

калибрую. записываю в /usr/local/etc/pointercal выданные цифирки.


Насколько я помню - никуда никакие настройки не сохранял - все само подхватывалось. Сам я с ее помощью ничего не писал - пользовался готовым, иксы и qt работали на "ура". В иксах gtk-ые приложения работали корректно, что неудивительно - они все равно через xlib работают. Там помоему нужно прописать переменные окружения только - через какое устройство работать tslib - у меня event0 или input0 было - я не помню, счас пока чисто с консолью вожусь а старые конфиги похерил все к сожалению, только заново искать в инете...
Спуститься к концу Подняться к началу
Персональная информация
Hermes
Добавлено 16.08.2010 16:59 Редактировалось 16.08.2010 17:00 Сообщение: 57
Hermes
5

Пункты: 3383
Регистрация: 02.04.2010
насколько я помню нужно еще переменные среды прописать:
Код
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CALIBFILE=/etc/pointercal
export TSLIB_CONFFILE=/etc/ts.conf
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_CONSOLEDEVICE=/dev/ttyS0

помойму у меня на TSLIB_CONSOLEDEVICE ругалось, я менял на /dev/null и всё работало, так же может проканать если вообще не указывать TSLIB_CONSOLEDEVICE
Спуститься к концу Подняться к началу
Персональная информация
rw9uao
Добавлено 17.08.2010 07:38 Сообщение: 58
rw9uao
Ранг
5

Группа: Клиенты
Пункты: 6973
Регистрация: 26.03.2009
переменные среды можно прописать, а можно использовать дефолтные значения. дело не в этом. ну да ладно. забью. все равно мне не через tslib работать.
Спуститься к концу Подняться к началу
Персональная информация
Hermes
Добавлено 22.08.2010 22:50 Редактировалось 22.08.2010 22:53 Сообщение: 59
Hermes
5

Пункты: 3383
Регистрация: 02.04.2010
Ребята, помогите с мнуком справиться!
Это какая-то каша в голове...
уже неделю мудохаюсь - результата ноль... не могу даже понять какие адреса пинов указывать в первом шаге :-(
вышлите если можно подправленные файлики...
а вообще если будет расписано что как делать поподробней - будет вообще обалдеть! :-)
Спуститься к концу Подняться к началу
Персональная информация
rw9uao
Добавлено 23.08.2010 11:31 Сообщение: 60
rw9uao
Ранг
5

Группа: Клиенты
Пункты: 6973
Регистрация: 26.03.2009
дожился, сам себя цитирую =)
Цитата
в папке include/arch/arm лежит загадочный файл nuc900_gpio.h в нем все-все написано

указываем группу, например GPIO_GROUP_E и ногу. если это, к примеру GPIOE7, то второй парметрв будет - 7 =)
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux