Не так давно в основную ветку ядра включили поддержку kgdb. Захотелось посмотреть как работает на нашей плате. После прочтения док сделал все как там написано и обнаружил что ничего не работает :) Прочитал еще раз и понял что драйвер atmel_serial не поддерживает poll ф-ции которые необходимы для отладки через последовательный порт. Посмотрел как это реализовано на других архитектурах, понял что все просто и поправил немного драйвер:
добавил
Код
1
#ifdef CONFIG_CONSOLE_POLL
static int atmel_poll_get_char(struct uart_port *port)
{
while (!(UART_GET_CSR(port) & ATMEL_US_RXRDY));
и в структуре static struct uart_ops atmel_pops добавил в конце
Код
1
..............
.pm = atmel_serial_pm,
#ifdef CONFIG_CONSOLE_POLL
.poll_get_char = atmel_poll_get_char,
.poll_put_char = atmel_poll_put_char,
#endif
};
Собрал insight (gdb с графическим фронтендом) c параметрами
./configure --prefix=/usr --target=arm-unknown-linux-uclibc
В ядре в строку инициализации добавил
kgdboc=ttyS0 kgdbwait
ядро как и полагается приостановило загрузку для ожидания дебаггера и все заработало. Можно ставить брейкпоинты, смотреть память, регистры, стек, наблюдать за переменными. Ядро пересобрал с поддержкой kgdb и отладочной информацией. В insight нужно загружать полученный большой vmlinux из корневой директории исходников ядра, в плату отправляется маленький zlinux - все как при обычной загрузке. В gdb (insight) указал параметры удаленного подключения - порт тот же на котором висит minicom (у меня это /dev/ttyUSB0) и скорость 115200 - то же что и в minicom. minicom номармально делит и порт и консоль с gdb.
Нужно отключать терминал после того как ядро пишет что ожидает подключения gdb и после этого устанавливать соединение из gdb иначе потом все глючит. В общем лучше бы вообще консоль на другой порт перевести - но у нас это не так просто.
Все нормально заработало, такой вопрос, не нашел в документации можно ли сделать так что бы можно было прервать ожидание подключения gdb и ядро продолжило работу без отладки.