- 1、本文档共15页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
8255驱动程式-具有中断处理功能
8255驅動程式-具有中斷處理功能
Linux設備驅動程式在內部核心中,實際上是處理或操作硬體控制器的軟體。從本質上講,驅動程式是常駐記憶體的低級硬體處理程式的共用庫。驅動程式與對應的應用程式關係可用圖1表示。
圖1 驅動程式步驟流程圖
1註冊(register)/取消註冊(unregister)動作驅動程式註冊函數register_chrdev擺在init_module()副程式,以便在執行insmod指令時作註冊的動作:
if(register_chrdev(CHDRV_MAJOR, CHDRV_NAME, c8255_chdrv_fops)) {
printk(kernel: %s: Unable to register character device\n, CHDRV_NAME);
驅動程式啟動時需呼叫register_chrdev函式向Linux系統作註冊的動作:
int register_chrdev(unsigned int major , const char *name ,
struct file_operations *fops);
參數的定義如下:
1unsigned int major: major代表設備的主設備號。系統透過主設備和次設備號來標識設備。次設備號由系統自動分發。
2Const char *name : Name為設備在 /dev 下的名稱,應用程式使用 /dev/xxx 操作該設備。
3Struct file_operations *fops: 定義該設備的核心程式介面file_operations。
在驅動程式向核心完成了註冊之後,驅動程式的各項「作業方法」(operation)就與給定的主編號產生了關連性。每當有人對字元裝置檔進行某項操作時,核心就能從該裝置檔的主編號找出對應的驅動程式,並透過其file_operations結構來呼叫對應的作業方法。
下一個問題是如何給應用程式一個名稱,讓它們能利用此名稱來啟動驅動程式。這個名稱必須安插在 /dev/ 目錄下,而且必須關連到驅動程式的主編號與次編號。在檔案系統製作節點的命令是mknod,你必須有特權身分(root)才能使用此工具。mknod至少需要四個參數,例如:
#define CHDRV_MAJOR 42
char CHDRV_NAME[] = c8255_driver;
其中c8255_driver是我們使用的驅動程式名稱;c表示它是一個字元設備(Character Device)。我們系統實作時的驅動程式註冊的動作是在一個init_module程式中實現:
int init_module(void)
{
if(register_chrdev(CHDRV_MAJOR,CHDRV_NAME, c8255_chdrv_fops)) {
printk(kernel: %s: Unable to register character device\n, CHDRV_NAME);
return -EIO;
}
設定BWSCON暫存器位元[9 8]為00:
sfreg_base=ioremap_nocache(BWSCON, LENGTH);
// printk(remapped BWSCON address= 0x%8x\n, sfreg_base);
reg_data=readl(sfreg_base);
reg_data = 0xfffffcff;
writel(reg_data, sfreg_base);
設定BANKCON2暫存器位元[10 9 8]為101:
sfreg_base=ioremap_nocache(BANKCON2, LENGTH);
// printk(remapped BANKCON2X address= 0x%8x\n, sfreg_base);
reg_data=readl(sfreg_base);
reg_data = 0xfffffdff;
reg_data |= 0
writel(reg_data, sfreg_base);
printk(c8255_ctl..\n);
/* write data to 8255 CTL */
io_base=ioremap_nocache(PORTA, LENGTH);
// printk(remapped 8255 CTL address= 0x%8x\n, io_base+3);
writeb(0x90, io_base+3);
return 0;
}
在模組被卸載之前,它必須先釋放主標號,而這個動作可由unregister_chr
文档评论(0)