staticvoid delay_until(ktime_t until)
{ /* * delta should never exceed 0.5 seconds (IR_MAX_DURATION) and on * m68k ndelay(s64) does not compile; so use s32 rather than s64.
*/
s32 delta;
while (true) {
delta = ktime_us_delta(until, ktime_get()); if (delta <= 0) return;
/* udelay more than 1ms may not work */ if (delta >= 1000) {
mdelay(delta / 1000); continue;
}
staticvoid gpio_ir_tx_modulated(struct gpio_ir *gpio_ir, uint *txbuf,
uint count)
{
ktime_t edge; /* * delta should never exceed 0.5 seconds (IR_MAX_DURATION) and on * m68k ndelay(s64) does not compile; so use s32 rather than s64.
*/
s32 delta; int i; unsignedint pulse, space;
/* Ensure the dividend fits into 32 bit */
pulse = DIV_ROUND_CLOSEST(gpio_ir->duty_cycle * (NSEC_PER_SEC / 100),
gpio_ir->carrier);
space = DIV_ROUND_CLOSEST((100 - gpio_ir->duty_cycle) *
(NSEC_PER_SEC / 100), gpio_ir->carrier);
edge = ktime_get();
for (i = 0; i < count; i++) { if (i % 2) { // space
edge = ktime_add_us(edge, txbuf[i]);
delay_until(edge);
} else { // pulse
ktime_t last = ktime_add_us(edge, txbuf[i]);
gpio_ir = devm_kmalloc(&pdev->dev, sizeof(*gpio_ir), GFP_KERNEL); if (!gpio_ir) return -ENOMEM;
rcdev = devm_rc_allocate_device(&pdev->dev, RC_DRIVER_IR_RAW_TX); if (!rcdev) return -ENOMEM;
gpio_ir->gpio = devm_gpiod_get(&pdev->dev, NULL, GPIOD_OUT_LOW); if (IS_ERR(gpio_ir->gpio)) return dev_err_probe(&pdev->dev, PTR_ERR(gpio_ir->gpio), "Failed to get gpio\n");
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.