我想知道如何找到驱动程序信息。我想知道在启动或重新启动 Beaglebone Black 时是否可以延迟驱动程序初始化。
答案1
如果可以修改驱动的话可以看我的回答这里。
我的解决方案是usleep_range(1000000, 12000000);
放入探测驱动程序中的函数,这样驱动程序将延迟 10 - 12 秒。这探测函数是驱动程序开始执行/初始化的地方。
答案2
设备驱动程序是开源的吗?如果是这样,您需要下载源代码以便修改它。
利用多个系统时钟,您可以使用以下代码片段从内部延迟驱动程序方向:
while (time_before(jiffies, j1))
cpu_relax();
j1
是延迟到期时 jiffies 的值,
cpu_relax
是专门调用架构以指示空闲处理器的调用。
同样,所有这些都依赖于驱动程序源代码。
答案3
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
是该函数应该运行的 jiffy 时间。 注意:结构中省略的字段timer_list
是本讨论不需要的实现细节。
然后,调用add_timer()
将timer_list 条目插入到队列中(例如“启动”计时器)。
另一种可能性是使用类似的东西wait_event()
,它会等到内核检查到某些条件后再释放等待,其中不是等待任意时间,而是等待直到发生 TBD