Я хотел бы знать, как я могу найти информацию о драйверах. И я хотел бы знать, можно ли отложить инициализацию драйвера при загрузке или перезагрузке Beaglebone Black.
Beaglebone а?.. у вас есть доступ к моду dev.код водителя? Является ли разработчик. драйвер открытый? Если да, мальчик, у меня есть решение для вас. :)
Используя системные часы, кратные системным часам, вы задерживаете направление водителя изнутри с помощью следующего фрагмента кода:
while (time_before(jiffies, j1))
cpu_relax( );
j1
— значение jiffies по истечении задержки
cpu_relax
— это вызов, который вызывает архитектуру специально для указания незанятого процессора.
Опять же, все зависит от драйвера OpenSource.
Если вы можете изменить драйвер, вы можете посмотреть мой ответ здесь .
Мое решение состоит в том, чтобы поместить usleep_range(1000000, 12000000);
в функцию probe в вашем драйвере, чтобы драйвер задержался на 10 -12 секунд. Функция probe — это место, где драйвер начинает выполнение/инициализацию.
Вместо цикла занятости, который вызывает cpu_relax()
или schedule()
, которые имеют потенциальные недостатки, лучше использовать функции таймера, предназначенные для ожидания без потенциально неблагоприятных побочных эффектов (, таких как блокирование других действий в таких случаях. способ, который может быть в лучшем случае неудобным, а в худшем может привести к заклиниванию устройства ).
Для более коротких задержек (, например, при решении проблем с короткими задержками ),они могут использоваться:
#include <linux/delay.h>
void ndelay(unsigned long nsecs);
void udelay(unsigned long usecs);
void mdelay(unsigned long msecs);
Хотя, вероятно, это бесполезно в этом сценарии, когда инициализация драйвера должна блокироваться и не возвращаться к ОС до тех пор, пока драйвер не будет инициализирован, как правило, когда вам нужно запланировать действие на более позднее время, не блокируя текущий процесс, таймеры ядра путь.
#include <linux/timer.h>
struct timer_list {
/*... */
unsigned long expires;
void (*function)(unsigned long);
unsigned long data;
};
struct timer_list TIMER_INITIALIZER(_function, _expires, _data);
void init_timer(struct timer_list *timer);
void add_timer(struct timer_list * timer);
int del_timer(struct timer_list * timer);
int mod_timer(struct timer_list *timer, unsigned long expires);
int timer_pending(const struct timer_list * timer);
Чтобы их использовать, инициализируйте запись timer_list
. TIMER_INITIALIZER()
— это удобная функция для этого, где ей передается указатель на функцию для выполнения, непрозрачные данные для передачи в функцию, а время _expires
— это момент времени, когда функция должна выполняться. Примечание. :Поля со штрихами в структуре timer_list
представляют собой детали реализации, которые не нужны для данного обсуждения.
Затем вызов add_timer()
вставляет запись списка таймера _в очередь (, например. «запускает» таймер ).
Другая возможность состоит в том, чтобы использовать что-то вроде wait_event()
, которое ждет, пока некое условие будет проверено ядром, прежде чем отменить ожидание, при этом вместо ожидания в течение произвольного промежутка времени оно ожидает, пока что-то не произойдет T.B.D.