Hi nvidia team:
I’m trying to use GPIO07 && GPIO13 as interrupt in orin nx devkit carries board, but when i take the gpio07 pin to 3.3v/gnd the interrupt count didn’t increase, can you help check the config all right?
my dts config:
quadrature-encoder-0 {
compatible = "gpio-quadrature-encoder";
encoder-a-gpios = <&gpio TEGRA234_MAIN_GPIO(G, 6) GPIO_ACTIVE_HIGH>;
encoder-b-gpios = <&gpio TEGRA234_MAIN_GPIO(H, 0) GPIO_ACTIVE_HIGH>;
interrupt-parent = <&gpio>;
interrupts = <TEGRA234_MAIN_GPIO(G, 6) GPIO_ACTIVE_HIGH IRQ_TYPE_EDGE_BOTH>,
<TEGRA234_MAIN_GPIO(H, 0) GPIO_ACTIVE_HIGH IRQ_TYPE_EDGE_BOTH>;
};
driver:
static int gpio_qenc_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct gpio_qenc_priv *priv;
bool has_index;
int num_signals;
int num_synapses;
int ret;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
if (!priv)
return -ENOMEM;
spin_lock_init(&priv->lock);
priv->gpio_a = devm_gpiod_get(dev, "encoder-a", GPIOD_IN);
if (IS_ERR(priv->gpio_a))
return dev_err_probe(dev, PTR_ERR(priv->gpio_a),
"failed to get encoder-a GPIO\n");
priv->gpio_b = devm_gpiod_get(dev, "encoder-b", GPIOD_IN);
if (IS_ERR(priv->gpio_b))
return dev_err_probe(dev, PTR_ERR(priv->gpio_b),
"failed to get encoder-b GPIO\n");
pr_info("Got GPIOs for A(%d) and B(%d)\n", desc_to_gpio(priv->gpio_a), desc_to_gpio(priv->gpio_b));
priv->gpio_index = devm_gpiod_get_optional(dev, "encoder-index",
GPIOD_IN);
if (IS_ERR(priv->gpio_index))
return dev_err_probe(dev, PTR_ERR(priv->gpio_index),
"failed to get encoder-index GPIO\n");
has_index = !!priv->gpio_index;
priv->irq_a = gpiod_to_irq(priv->gpio_a);
if (priv->irq_a < 0)
return dev_err_probe(dev, priv->irq_a,
"failed to get IRQ for encoder-a\n");
priv->irq_b = gpiod_to_irq(priv->gpio_b);
if (priv->irq_b < 0)
return dev_err_probe(dev, priv->irq_b,
"failed to get IRQ for encoder-b\n");
pr_info("Got IRQs for A(%d) and B(%d)\n", priv->irq_a, priv->irq_b);
if (has_index) {
priv->irq_index = gpiod_to_irq(priv->gpio_index);
if (priv->irq_index < 0)
return dev_err_probe(dev, priv->irq_index,
"failed to get IRQ for encoder-index\n");
}
priv->prev_a = gpiod_get_value(priv->gpio_a);
priv->prev_b = gpiod_get_value(priv->gpio_b);
priv->function = GPIO_QENC_FUNC_QUAD_X4;
priv->direction = COUNTER_COUNT_DIRECTION_FORWARD;
num_signals = has_index ? 3 : 2;
priv->signals[GPIO_QENC_SIGNAL_A].id = GPIO_QENC_SIGNAL_A;
priv->signals[GPIO_QENC_SIGNAL_A].name = "Signal A";
priv->signals[GPIO_QENC_SIGNAL_B].id = GPIO_QENC_SIGNAL_B;
priv->signals[GPIO_QENC_SIGNAL_B].name = "Signal B";
if (has_index) {
priv->signals[GPIO_QENC_SIGNAL_INDEX].id =
GPIO_QENC_SIGNAL_INDEX;
priv->signals[GPIO_QENC_SIGNAL_INDEX].name = "Index";
}
num_synapses = num_signals;
priv->synapses[0].actions_list = gpio_qenc_synapse_actions;
priv->synapses[0].num_actions = ARRAY_SIZE(gpio_qenc_synapse_actions);
priv->synapses[0].signal = &priv->signals[GPIO_QENC_SIGNAL_A];
priv->synapses[1].actions_list = gpio_qenc_synapse_actions;
priv->synapses[1].num_actions = ARRAY_SIZE(gpio_qenc_synapse_actions);
priv->synapses[1].signal = &priv->signals[GPIO_QENC_SIGNAL_B];
if (has_index) {
priv->synapses[2].actions_list = gpio_qenc_synapse_actions;
priv->synapses[2].num_actions =
ARRAY_SIZE(gpio_qenc_synapse_actions);
priv->synapses[2].signal =
&priv->signals[GPIO_QENC_SIGNAL_INDEX];
}
priv->cnts.id = 0;
priv->cnts.name = "Position";
priv->cnts.functions_list = gpio_qenc_functions;
priv->cnts.num_functions = ARRAY_SIZE(gpio_qenc_functions);
priv->cnts.synapses = priv->synapses;
priv->cnts.num_synapses = num_synapses;
priv->cnts.ext = gpio_qenc_count_ext;
priv->cnts.num_ext = ARRAY_SIZE(gpio_qenc_count_ext);
priv->counter.priv = priv;
priv->counter.name = dev_name(dev);
priv->counter.parent = dev;
priv->counter.ops = &gpio_qenc_ops;
priv->counter.signals = priv->signals;
priv->counter.num_signals = num_signals;
priv->counter.counts = &priv->cnts;
priv->counter.num_counts = 1;
irq_set_status_flags(priv->irq_a, IRQ_NOAUTOEN);
ret = devm_request_irq(dev, priv->irq_a, gpio_qenc_a_isr,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
"gpio-qenc-a", priv);
if (ret)
return dev_err_probe(dev, ret,
"failed to request IRQ for encoder-a\n");
irq_set_status_flags(priv->irq_b, IRQ_NOAUTOEN);
ret = devm_request_irq(dev, priv->irq_b, gpio_qenc_b_isr,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
"gpio-qenc-b", priv);
if (ret)
return dev_err_probe(dev, ret,
"failed to request IRQ for encoder-b\n");
if (has_index) {
irq_set_status_flags(priv->irq_index, IRQ_NOAUTOEN);
ret = devm_request_irq(dev, priv->irq_index,
gpio_qenc_index_isr,
IRQF_TRIGGER_RISING,
"gpio-qenc-index", priv);
if (ret)
return dev_err_probe(dev, ret,
"failed to request IRQ for encoder-index\n");
}
ret = devm_counter_register(dev, &priv->counter);
if (ret < 0)
return dev_err_probe(dev, ret, "failed to add counter\n");
dev_info(dev, "GPIO quadrature encoder registered (signals: A, B%s)\n",
has_index ? ", Index" : "");
return 0;
}
boot log:
[ 911.097319] Got GPIOs for A(389) and B(391)
[ 911.097342] Got IRQs for A(264) and B(265)
[ 911.097495] gpio-quadrature-encoder quadrature-encoder-0: GPIO quadrature encoder registered (signals: A, B)
after change the gpio pin status, irq count didn’t changed:
tao@littTech:~$ cat /proc/interrupts | grep gpio
227: 10 0 0 0 0 0 0 0 2200000.gpio 35 Edge Force Recovery
228: 0 0 0 0 0 0 0 0 c2f0000.gpio 27 Edge Power
262: 0 0 0 0 0 0 0 0 2200000.gpio 131 Level 1-0025
264: 0 0 0 0 0 0 0 0 2200000.gpio 41 Edge gpio-qenc-a
265: 0 0 0 0 0 0 0 0 2200000.gpio 43 Edge gpio-qenc-b