ata.c 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "ata.h"
  2. #include "../../common/kprint.h"
  3. #include "../interrupt/apic/apic.h"
  4. struct apic_IO_APIC_RTE_entry entry;
  5. /**
  6. * @brief 硬盘中断上半部处理程序
  7. *
  8. * @param irq_num
  9. * @param param
  10. * @param regs
  11. */
  12. void ata_disk_handler(ul irq_num, ul param, struct pt_regs *regs)
  13. {
  14. struct ata_identify_device_data info;
  15. kdebug("irq_num=%ld", irq_num);
  16. // 从端口读入磁盘配置信息
  17. io_insw(PORT_DISK0_DATA, &info, 256);
  18. kdebug("General_Config=%#018lx", info.General_Config);
  19. printk("Serial number:");
  20. unsigned char buf[64];
  21. int js=0;
  22. //printk("%d", info.Serial_Number);
  23. printk("sizeof short=%d\n", sizeof(ushort));
  24. for(int i = 0;i<10;i++)
  25. {
  26. printk("[%d] %d \n",js, ((info.Serial_Number[i])));
  27. printk("[%d] %d shift 8\n",js, ((info.Serial_Number[i]) >> 8));
  28. printk("[%d] %d and 0xff\n",js, ((info.Serial_Number[i]) >> 8)&0xff);
  29. buf[js++]=((info.Serial_Number[i]) >> 8) & 0xff;
  30. buf[js++]=(info.Serial_Number[i] & 0xff);
  31. }
  32. buf[js] = '\0';
  33. printk("xxx");
  34. printk("buf[0]=%d", buf[0]);
  35. printk("buf[0]=%c", buf[0]);
  36. printk("%s", buf);
  37. printk("\n");
  38. }
  39. hardware_intr_controller ata_disk_intr_controller =
  40. {
  41. .enable = apic_ioapic_enable,
  42. .disable = apic_ioapic_disable,
  43. .install = apic_ioapic_install,
  44. .uninstall = apic_ioapic_uninstall,
  45. .ack = apic_ioapic_edge_ack,
  46. };
  47. /**
  48. * @brief 初始化ATA磁盘驱动程序
  49. *
  50. */
  51. void ata_init()
  52. {
  53. entry.vector = 0x2e;
  54. entry.deliver_mode = IO_APIC_FIXED;
  55. entry.dest_mode = DEST_PHYSICAL;
  56. entry.deliver_status = IDLE;
  57. entry.polarity = POLARITY_HIGH;
  58. entry.remote_IRR = IRR_RESET;
  59. entry.trigger_mode = EDGE_TRIGGER;
  60. entry.mask = MASKED;
  61. entry.reserved = 0;
  62. entry.destination.physical.reserved1 = 0;
  63. entry.destination.physical.reserved2 = 0;
  64. entry.destination.physical.phy_dest = 0; // 投递至BSP
  65. irq_register(entry.vector, &entry, &ata_disk_handler, 0, &ata_disk_intr_controller, "ATA Disk 1");
  66. io_out8(PORT_DISK0_STATUS_CTRL_REG, 0); // 使能中断请求
  67. io_out8(PORT_DISK0_ERR_STATUS, 0);
  68. io_out8(PORT_DISK0_SECTOR_CNT, 0);
  69. io_out8(PORT_DISK0_LBA_7_0, 0);
  70. io_out8(PORT_DISK0_LBA_15_8, 0);
  71. io_out8(PORT_DISK0_LBA_23_16, 0);
  72. io_out8(PORT_DISK0_DEVICE_CONFIGURE_REG, 0);
  73. io_out8(PORT_DISK0_CONTROLLER_STATUS_CMD, 0xec); // 获取硬件设备识别信息
  74. }