Ник:
Пароль:

Контакты

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-iMX233
Прерывания GPIO
alexsl
Добавлено 13.08.2012 11:49
0
Сообщение: 1
alexsl
0

Пункты: 4270
Регистрация: 26.10.2010
Приветствую.
Понадобилась возможность считать импульсы на IMX233 по спаду. По примеру http://www.starterkit.ru/html/index.php?name=forum&op=view&id=9406 написан драйвер.
В начале обработчика дергаю пин(изменяю состояние ножки), и обнаруживаю такую картину. При переключении сигнала на ножке в обработчик может зайти 2-а раза а может один раз(судя по пину, который переключается в обработчике). В итоге после подачи 1000 импульсов программа насчитывает от 1100 до 1600.
Кто-нибудь сталкивался с возникновением ложных срабатываний прерываний?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 13.08.2012 12:21 Сообщение: 2
sasamy
4.71

Пункты: 83556
Регистрация: 14.08.2009
Как вы переключаете пин ? возможно это влияние "дребезга" котакта. Еще не совем понятно это - "судя по пину, который переключается в обработчике", зачем его там переключать ? покажите код лучше. Количество прерываний можно смотреть через
cat /proc/interrupts
Спуститься к концу Подняться к началу
Персональная информация
alexsl
Добавлено 13.08.2012 12:51 Сообщение: 3
alexsl
0

Пункты: 4270
Регистрация: 26.10.2010
Цитата
Как вы переключаете пин ? возможно это влияние "дребезга" котакта. Еще не совем понятно это - "судя по пину, который переключается в обработчике", зачем его там переключать ? покажите код лучше. Количество прерываний можно смотреть через
cat /proc/interrupts


Дребезг отсутствует т.к. подаю меандр 20Гц с генератора.
Переключаю совершенно дугой пин дабы подключится осцилографом и посмотреть заходит в обработчик или нет.
Цитата
cat /proc/interrupts

Смотрел, количество также плавает.

Обработчик:
static irqreturn_t flow_interrupt(int irq, void *dev_id){
static int pin_state;
pin_state^=1;
gpio_set_value( MXS_PIN_TO_GPIO(PINID_LCD_D04), pin_state) ;
do_gettimeofday( &time_count );
counter++;
return IRQ_HANDLED;
}

Ф инициализации:
static int irq_init(int *irq, irq_handler_t handler, int pin)
{
int err;

if(gpio_request(MXS_PIN_TO_GPIO(pin), "FLOW CONTROL pendown") < 0){
printk(KERN_INFO "Can't get FLOW CONTROL pen down GPIO:%d\n",pin);
return -EBUSY;
}
gpio_direction_input(MXS_PIN_TO_GPIO(pin));
set_irq_type(gpio_to_irq(MXS_PIN_TO_GPIO(pin)),IRQ_TYPE_EDGE_FALLING);
*irq = gpio_to_irq(MXS_PIN_TO_GPIO(pin));
printk(KERN_ALERT "FLOW_PIN: irq number %d\n", *irq);
if (err = request_irq(*irq, handler, IRQF_TRIGGER_FALLING,
"flow_control", NULL)) {
printk(KERN_ALERT "flow control IRQ request failed: %d\n",err);
return -EBUSY;
}
return 0;
}
Спуститься к концу Подняться к началу
Персональная информация
alexsl
Добавлено 14.08.2012 10:46 Сообщение: 4
alexsl
0

Пункты: 4270
Регистрация: 26.10.2010
Никто с подобным явлением не сталкивался?
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 14.08.2012 11:17 Редактировалось 14.08.2012 11:18 Сообщение: 5
sasamy
4.71

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

Никто с подобным явлением не сталкивался?


Надо проверять на плате - странный результат и с кодом вроде все в порядке, до платы доберусь не раньше выходных. Прерывания от GPIO используются в драйвере сети и в тачскрине - но там такое не обнаружить просто так.
Спуститься к концу Подняться к началу
Персональная информация
alexsl
Добавлено 14.08.2012 11:40 Сообщение: 6
alexsl
0

Пункты: 4270
Регистрация: 26.10.2010
Смотрел драйвер сети(ks8851), там прерывания не по перепаду а по уровню.
Проверил свой драйвер на работу прерываний по уровню. С уронем все четко, однако в этом режиме нельзя фиксировать количество перепадов, точнее можно, постоянно меняя уровень при котором срабатывает прерывание. Но это извращение.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 14.08.2012 11:49 Сообщение: 7
sasamy
4.71

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

С уронем все четко


попробуйте внешний pullup поставить.
Спуститься к концу Подняться к началу
Персональная информация
alexsl
Добавлено 14.08.2012 13:00 Сообщение: 8
alexsl
0

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

С уронем все четко


попробуйте внешний pullup поставить.


Смысла нет, т.к. сигнал подается непосредственно с генератора. Выход у генератора 0 - 3.3V
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 16.08.2012 17:49 Редактировалось 16.08.2012 18:02 Сообщение: 9
sasamy
4.71

Пункты: 83556
Регистрация: 14.08.2009
Проверил у себя - нет никаких лишних срабатываний. Как тестил - замкнул перемычкой пины 35,37 (gpio 23 - пин который дрыгается в скрипте, gpio 91 - пин который генерирует прерывания), установил модуль, запустил скрипт
Цитата

# tftp -g -r tstdrv.ko 192.168.1.2
tstdrv.ko 100% |*******************************| 4608 --:--:-- ETA
# insmod tstdrv.ko
[ 294.540000] TSTDRV: driver init
[ 294.540000] GPIO pin: 91
# ./tst.sh 23 1000
219: 1 - IRQ_PIN
pulse count: 1000
219: 1001 - IRQ_PIN
# ./tst.sh 23 20000
219: 1001 - IRQ_PIN
pulse count: 20000
219: 21001 - IRQ_PIN


тестовый скрипт
Код

#!/bin/sh

echo "$1" > /sys/class/gpio/export
echo "low" > /sys/class/gpio/gpio$1/direction

cat /proc/interrupts | grep "IRQ_PIN"

for N in $(seq 1 $2)
do
echo "1" > /sys/class/gpio/gpio$1/value
echo "0" > /sys/class/gpio/gpio$1/value
done

echo "pulse count: $N"

cat /proc/interrupts | grep "IRQ_PIN"


тестовый драйвер
Код

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/gpio.h>
#include "pinctrl.h"

#define PINID_GPMI_CE1N MXS_PIN_ENCODE(2, 27)
#define IRQ_PIN PINID_GPMI_CE1N

static irqreturn_t tstdrv_interrupt(int irq, void *dev_id)
{
return IRQ_HANDLED;
}

static int irq_init(void)
{
int ret;

ret = gpio_request(MXS_PIN_TO_GPIO(IRQ_PIN), "IRQ_PIN");
if (ret < 0) {
printk("TSTDRV: can't get GPIO pin: %d\n", IRQ_PIN);
return ret;
}
printk("GPIO pin: %d\n", MXS_PIN_TO_GPIO(IRQ_PIN));

gpio_direction_input(MXS_PIN_TO_GPIO(IRQ_PIN));
set_irq_type(gpio_to_irq(MXS_PIN_TO_GPIO(IRQ_PIN)), IRQ_TYPE_EDGE_FALLING);

ret = request_irq(gpio_to_irq(MXS_PIN_TO_GPIO(IRQ_PIN)),
tstdrv_interrupt, IRQF_TRIGGER_FALLING, "IRQ_PIN", NULL);
if (ret < 0) {
printk("TSTDRV: IRQ request failed: %d\n", ret);
return ret;
}

return 0;
}

static int __init driver_init(void)
{
printk("TSTDRV: driver init\n");
return irq_init();
}

static void __exit driver_exit(void)
{
printk("TSTDRV: driver exit\n");
free_irq(gpio_to_irq(MXS_PIN_TO_GPIO(IRQ_PIN)), NULL);
}

module_init(driver_init);
module_exit(driver_exit);
MODULE_LICENSE("GPL");


архив - все вместе http://sasamy.narod.ru/tstdrv.tar.gz
ядро на котором тестировал - http://starterkit-org.googlecode.com/files/linux-2.6.35.3-11.09.01-sk.tar.bz2
Спуститься к концу Подняться к началу
Персональная информация
alexsl
Добавлено 16.08.2012 19:43 Сообщение: 10
alexsl
0

Пункты: 4270
Регистрация: 26.10.2010
Спасибо, завтра попробую проверить.
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Отладочные платы » SK-iMX233