switch (attr) { case TRIGGER_TTY_RX:
state = trigger_data->mode_rx; break; case TRIGGER_TTY_TX:
state = trigger_data->mode_tx; break; case TRIGGER_TTY_CTS:
state = trigger_data->mode_cts; break; case TRIGGER_TTY_DSR:
state = trigger_data->mode_dsr; break; case TRIGGER_TTY_DCD:
state = trigger_data->mode_dcd; break; case TRIGGER_TTY_RNG:
state = trigger_data->mode_rng; break;
}
staticvoid ledtrig_tty_work(struct work_struct *work)
{ struct ledtrig_tty_data *trigger_data =
container_of(work, struct ledtrig_tty_data, dwork.work); enum led_trigger_tty_state state = TTY_LED_DISABLE; unsignedlong interval = LEDTRIG_TTY_INTERVAL; bool invert = false; int status; int ret;
if (!trigger_data->ttyname) goto out;
/* try to get the tty corresponding to $ttyname */ if (!trigger_data->tty) {
dev_t devno; struct tty_struct *tty; int ret;
ret = tty_dev_name_to_number(trigger_data->ttyname, &devno); if (ret < 0) /* * A device with this name might appear later, so keep * retrying.
*/ goto out;
tty = tty_kopen_shared(devno); if (IS_ERR(tty) || !tty) /* What to do? retry or abort */ goto out;
trigger_data->tty = tty;
}
status = tty_get_tiocm(trigger_data->tty); if (status > 0) { if (trigger_data->mode_cts) { if (status & TIOCM_CTS)
state = TTY_LED_ENABLE;
}
if (trigger_data->mode_dsr) { if (status & TIOCM_DSR)
state = TTY_LED_ENABLE;
}
if (trigger_data->mode_dcd) { if (status & TIOCM_CAR)
state = TTY_LED_ENABLE;
}
if (trigger_data->mode_rng) { if (status & TIOCM_RNG)
state = TTY_LED_ENABLE;
}
}
/* * The evaluation of rx/tx must be done after the evaluation * of TIOCM_*, because rx/tx has priority.
*/ if (trigger_data->mode_rx || trigger_data->mode_tx) { struct serial_icounter_struct icount;
ret = tty_get_icount(trigger_data->tty, &icount); if (ret) goto out;
if (trigger_data->mode_tx && (icount.tx != trigger_data->tx)) {
trigger_data->tx = icount.tx;
invert = state == TTY_LED_ENABLE;
state = TTY_LED_BLINK;
}
if (trigger_data->mode_rx && (icount.rx != trigger_data->rx)) {
trigger_data->rx = icount.rx;
invert = state == TTY_LED_ENABLE;
state = TTY_LED_BLINK;
}
}
out: switch (state) { case TTY_LED_BLINK:
led_blink_set_oneshot(trigger_data->led_cdev, &interval,
&interval, invert); break; case TTY_LED_ENABLE:
led_set_brightness(trigger_data->led_cdev,
trigger_data->led_cdev->blink_brightness); break; case TTY_LED_DISABLE:
fallthrough; default:
led_set_brightness(trigger_data->led_cdev, LED_OFF); break;
}
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.