8255驱动程式-具有中断处理功能.doc

  1. 1、本文档共15页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

bodkd + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档