有什麼方法可以延遲 Beaglebone Black 上的驅動程式初始化嗎?

有什麼方法可以延遲 Beaglebone Black 上的驅動程式初始化嗎?

我想知道如何找到驅動程式資訊。我想知道在啟動或重新啟動 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

相關內容