Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1119922
  • 博文数量: 185
  • 博客积分: 495
  • 博客等级: 下士
  • 技术积分: 1418
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-02 15:12
个人简介

治肾虚不含糖,专注内核性能优化二十年。 https://github.com/KnightKu

文章分类

全部博文(185)

文章存档

2019年(1)

2018年(12)

2017年(5)

2016年(23)

2015年(1)

2014年(22)

2013年(82)

2012年(39)

分类: LINUX

2014-02-18 11:45:04

写了一个模块想模拟一下pcie slot的外部按钮事件,想法是通过改pcie插槽的寄存器的状态,然后有pciehp的中断/轮询机制来触发 对应的处理流程,可是实验过程中没有出现预期的结果...,功力尚浅~~

点击(此处)折叠或打开

  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/pci.h>
  4. #include <linux/kernel.h>
  5. #define PCI_EXP_SLTSTA_PDS 0x0040 /* Presence Detect State */
  6. #define PCI_EXP_SLTSTA_PDC 0x0008 /* Presence Detect Changed */
  7. #define PCI_EXP_SLTSTA 26 /* Slot Status */
  8. #define PCI_EXP_SLTCTL_PCC 0x0400 /* Power Controller Control */
  9. #define POWER_OFF PCI_EXP_SLTCTL_PCC
  10. #define PCI_EXP_SLTCTL 24 /* Slot Control */
  11. static struct pci_dev *dev;
  12. static struct pci_bus *bus;
  13. static int domain = 0x0000;
  14. static int busnr = 0;
  15. module_param(domain, int, 0644);
  16. module_param(busnr, int, 0644);
  17. MODULE_LICENSE("GPL");
  18. MODULE_AUTHOR("GuZheng cengku@gmail.com");
  19. static int __init pcie_conf_init(void)
  20. {
  21. int retval = 0;
  22. u16 slot_ctrl;
  23. u16 slot_cmd;
  24. u16 cmd_mask;
  25. bus = pci_find_bus(domain, busnr);
  26. if (!bus) {
  27. printk("==can not get pci_bus==\\n");
  28. return -1;
  29. }
  30. printk("Succeed get pci bus:%s\\n", bus->name);
  31. dev = bus->self;
  32. if (!dev) {
  33. printk("==can not get dev==\\n");
  34. return -1;
  35. }
  36. retval = pcie_capability_read_word(dev, PCI_EXP_SLTCTL, &slot_ctrl);
  37. if (retval) {
  38. printk("%s can not read pcie register!\\n", __func__);
  39. return retval;
  40. }
  41. printk("Succeed read pcie slot register!\\n");
  42. cmd_mask = PCI_EXP_SLTCTL_PCC;
  43. slot_cmd = POWER_OFF;
  44. slot_ctrl &= ~cmd_mask;
  45. slot_ctrl |= (cmd_mask & slot_cmd);
  46. retval = pcie_capability_write_word(dev, PCI_EXP_SLTCTL, slot_ctrl);
  47. if (retval) {
  48. printk("%s can not read pcie register!\\n", __func__);
  49. return retval;
  50. }
  51. printk("Succeed write pcie slot register!\\n");
  52. return retval;
  53. }
  54. static void __exit pcie_conf_exit(void)
  55. {
  56. printk("exit module!\\n");
  57. return;
  58. }
  59. module_init(pcie_conf_init);
  60. module_exit(pcie_conf_exit);

阅读(1145) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~