【精品】8255驱动程式-具有中断处理功能87.docVIP

【精品】8255驱动程式-具有中断处理功能87.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
【精品】8255驱动程式-具有中断处理功能87

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至少需要四個參數,例如: mknod /dev/c8255_driver c 42 0 第一個引數是節點名稱,其後的三個引數分別是裝置類型(c代表char device)、主編號、以及次編號。就像任何儲存在磁碟上的普通檔案一樣,mknod所產生的裝置節點會被保存下來,除非刻意用rm命令刪除它們。我們在驅動程式主程式中做以下定義及宣告: #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_nocac

文档评论(0)

bodkd + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档