2440按鍵恢復初始配置

2021-06-18 11:35:15 字數 3805 閱讀 9475

目的是實現,通過板子上一按鈕來控制系統恢復初始配置。 其實也就是在應用層將備份檔案 覆蓋 配置檔案這乙個操作而已。

按鍵恢復預設配置,其基本的思想是 中斷+ 應用阻塞。

前前後後花了挺多的時間,看了中斷的理論,看了暫存器的配置,還去看輸入子系統,有些步驟是不必要的,但是做的時候並不知道不需要。

最後的實驗,**的大部分都是借用人家的。自己僅看的懂**而已,如果自己去寫乙份,估計寫不出來。

連線如下:

自己在看對方**的時候,有許多地方不太明白,因此把查閱的一些資訊也都寫進**的注釋中了。

另外poll 是一種監聽機制,對自己方案的實現沒有任何作用(參閱部分資料後得出的結論)。所以就沒有註冊這個方法。

關於暫存器的操作時看 datasheet裡的,不過作業系統做了這部分的工作,自己畫蛇添足了。 而關於清中斷這一步,都說是要手動進行的,查了半天的資料都沒有看到相關的配置,於是也就放棄了。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define device_name "restore_button"

//#define s3c2410_gpf2 162

struct button_irq_desc

;// 這一部分還得看看具體情形才好。2不是被占用了麼?被加密晶元

//irq_eint2 = 16+2 =18

//s3c2410_gpf2 = 32x5+2 =162

//s3c2410_gpf2_eint2 = 0x02 << 4

//觸發設定為上公升沿觸發,因此

static struct button_irq_desc button=

;//設定等待佇列

static declare_wait_queue_head(button_waitq);

//按鍵進行記錄

static volatile int ev_press = 0;

//觸發設定為下降沿觸發

//中斷處理函式,由中斷號和中斷結構體組成。

static irqreturn_t irq_interrupt(int irq,void *dev_id)

// 表示中斷處理結束

return irq_retval(irq_handled);

}//register the interrupt,when failed ,quit;

static int irq_open(int irq,void *dev_id)

//釋放已經註冊的中斷

static int irq_close(struct inode* inode,struct file *file)

;static volatile char key_values=

static int irq_read(struct file* file,char __user *buff,size_t count)//)

// 將ev_press 重置為0

ev_press = 0;

// 將值傳遞到使用者空間,資料已經被讀取。

// 需要改動

err = copy_to_user(buff, (const void *)key_values,count));

// 即完成讀取這個過程即可,並不需要真正的資料傳輸

// 這裡返回的是什麼?

//return err ? -efault : min(sizeof(key_values), count);

// 直接返回0 ,表示程式執行完了。即可。

return 0;

};//監聽函式,即監聽當前程序,這裡沒有放入操作列表中。

//這裡沒有使用監聽函式實現

static unsigned int irq_poll(struct file *file,struct poll_table_struct * wait)

;static struct file_operations dev_fops =

;static struct miscdevice misc=

;static int __init dev_init(void)

// 查到資料說暫存器的設定,作業系統已經做好了,自己這一部分的工作就有點畫蛇添足了。

// 對中斷暫存器的設定,初始化部分

// intmod 中斷模式暫存器,設定為快中斷,為1

// intmask 中斷遮蔽暫存器,設定為0,表示響應中斷

// 其中還要對暫存器srcpend進行中斷清除,具體在**那個位置還需要商榷

// 要定位這些暫存器的位置在**,並且進行設定。

//#define s3c2410_srcpnd s3c2410_irqreg(0x000)

//#define s3c2410_intmod s3c2410_irqreg(0x004)

//#define s3c2410_intmsk s3c2410_irqreg(0x008)

// 暫存器設定使用方法。

// 設定管腳為中斷模式

//設定中斷模式和中斷遮蔽

//intmod = __raw_readl(s3c2410_intmod);

//將intmod 相應位 設定為1,即為快中斷,同時寫回暫存器中。

//具體哪一位,看 s3c2440 datasheet

//intmod = intmod|(1<<2);

//__raw_writel(intmod,s3c2410_intmod);

//將中斷服務設定為可服務

//其他位置保持不變。

//intmask = __raw_readl(s3c2410_intmsk);

//intmask = intmask&(~(1<<2));

//__raw_writel(intmask,s3c2410_intmsk);

return ret;

}static int __exit dev_exit(void)

module_init(dev_init);

module_exit(dev_exit);

module_license("gpl");

module_author("csw");

module_description("irq for restore ip");

/* 如果當前不可讀,那麼在sys_poll->do_poll中當前程序就會睡眠在等待佇列上,

* 這個等待佇列是由驅動程式提供的(就是poll_wait中傳入的那個)。當可讀的時候,

* 驅動程式可能有一部分**執行了(比如驅動的中斷服務程式),那麼在這部分**中,

* 就會喚醒等待佇列上的程序,也就是之前睡眠的那個,當那個程序被喚醒後do_poll會再一次的

* 呼叫驅動程式的poll函式,這個時候應用程式就知道是可讀的了。

* pool方法就是用來支援非阻塞式的訪問,當然是立即返回,但是它會把這次請求放入乙個等待

* 佇列中,當某個條件滿足時,核心會通知應用程式(應用程式的select函式會感知),然後就

* 會接著select操作

*poll_wait不會掛起當前程序,而是把自己註冊到某個事件等待佇列中.

*poll_wait()是用在select系統呼叫中的.

*/

應用程式部分就沒貼了,因為忘記從linux 的 home 路徑下拷貝過來了。

應用程式主要實現的就是去讀取對應的裝置檔案,當讀到字元的時候,就實現拷貝工作,讀取不到的時候就阻塞睡眠了。

fl2440按鍵中斷驅動

include include include include include include include include include include include copy to user include 核心時鐘 include atomic t include s3c2410 gpf...

GT2440按鍵驅動新增fasync機制

完整驅動 如下 include include include include include include include include include include include include include include include include include includ...

mini2440按鍵裸機程式編寫執行

1.開發環境 作業系統 linux 開發板 mini2440 2.原理圖 gpgcon控制暫存器功能說明 3.操作流程 只需要操作gpgcon暫存器即可操作k1按鍵 a 設定控制暫存器gpgcon為輸入功能 00 即 可讀取gpgdat暫存器的值 html view plain copy 按鍵 un...