SB16.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <Kernel/Devices/CharacterDevice.h>
  8. #include <Kernel/Interrupts/IRQHandler.h>
  9. #include <Kernel/Memory/PhysicalPage.h>
  10. #include <Kernel/PhysicalAddress.h>
  11. #include <Kernel/WaitQueue.h>
  12. namespace Kernel {
  13. class SB16;
  14. class SB16 final : public IRQHandler
  15. , public CharacterDevice {
  16. public:
  17. SB16();
  18. virtual ~SB16() override;
  19. static void detect();
  20. static void create();
  21. static SB16& the();
  22. // ^CharacterDevice
  23. virtual bool can_read(const FileDescription&, size_t) const override;
  24. virtual KResultOr<size_t> read(FileDescription&, u64, UserOrKernelBuffer&, size_t) override;
  25. virtual KResultOr<size_t> write(FileDescription&, u64, const UserOrKernelBuffer&, size_t) override;
  26. virtual bool can_write(const FileDescription&, size_t) const override { return true; }
  27. virtual StringView purpose() const override { return class_name(); }
  28. // ^Device
  29. virtual mode_t required_mode() const override { return 0220; }
  30. virtual String device_name() const override { return "audio"; }
  31. virtual KResult ioctl(FileDescription&, unsigned, Userspace<void*>) override;
  32. private:
  33. // ^IRQHandler
  34. virtual bool handle_irq(const RegisterState&) override;
  35. // ^CharacterDevice
  36. virtual StringView class_name() const override { return "SB16"; }
  37. void initialize();
  38. void wait_for_irq();
  39. void dma_start(uint32_t length);
  40. void set_sample_rate(uint16_t hz);
  41. void dsp_write(u8 value);
  42. static u8 dsp_read();
  43. u8 get_irq_line();
  44. void set_irq_register(u8 irq_number);
  45. void set_irq_line(u8 irq_number);
  46. OwnPtr<Memory::Region> m_dma_region;
  47. int m_major_version { 0 };
  48. u16 m_sample_rate { 44100 };
  49. WaitQueue m_irq_queue;
  50. };
  51. }