

<!DOCTYPE html>

<html lang="en-US">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=Edge">

  <link rel="stylesheet" href="/linux-driver-guide-tutorial/assets/css/just-the-docs-default.css">

  <link rel="stylesheet" href="/linux-driver-guide-tutorial/assets/css/just-the-docs-head-nav.css" id="jtd-head-nav-stylesheet">

  <style id="jtd-nav-activation">
  
    .site-nav ul li a {
      background-image: none;
    }

  </style>

  

  
    <script src="/linux-driver-guide-tutorial/assets/js/vendor/lunr.min.js"></script>
  

  <script src="/linux-driver-guide-tutorial/assets/js/just-the-docs.js"></script>

  <meta name="viewport" content="width=device-width, initial-scale=1">

  



  <!-- Begin Jekyll SEO tag v2.8.0 -->
<title>Linux Driver Development Guide | A comprehensive guide for embedded Linux driver development - from kernel modules to advanced subsystem drivers. Covers modern kernel 6.x APIs with practical examples.</title>
<meta name="generator" content="Jekyll v4.4.1" />
<meta property="og:title" content="Linux Driver Development Guide" />
<meta property="og:locale" content="en_US" />
<meta name="description" content="A comprehensive guide for embedded Linux driver development - from kernel modules to advanced subsystem drivers. Covers modern kernel 6.x APIs with practical examples." />
<meta property="og:description" content="A comprehensive guide for embedded Linux driver development - from kernel modules to advanced subsystem drivers. Covers modern kernel 6.x APIs with practical examples." />
<link rel="canonical" href="/linux-driver-guide-tutorial/assets/css/just-the-docs-head-nav.css" />
<meta property="og:url" content="/linux-driver-guide-tutorial/assets/css/just-the-docs-head-nav.css" />
<meta property="og:site_name" content="Linux Driver Development Guide" />
<meta property="og:type" content="website" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="Linux Driver Development Guide" />
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"WebPage","description":"A comprehensive guide for embedded Linux driver development - from kernel modules to advanced subsystem drivers. Covers modern kernel 6.x APIs with practical examples.","headline":"Linux Driver Development Guide","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"/linux-driver-guide-tutorial/assets/images/linux_driver_logo.png"}},"url":"/linux-driver-guide-tutorial/assets/css/just-the-docs-head-nav.css"}</script>
<!-- End Jekyll SEO tag -->


  <!-- Site logo - larger size with horizontal padding -->
<style>
  .site-title {
    height: 3.5rem !important;
  }
  .site-logo {
    min-height: 3.5rem !important;
    padding-left: 7% !important;
    padding-right: 7% !important;
  }
  @media (max-width: 50rem) {
    .site-title {
      height: 3rem !important;
    }
    .site-logo {
      min-height: 3rem !important;
    }
  }
</style>

<!-- Table styling for better visibility in dark mode -->
<style>
  /* Table borders - visible in dark mode */
  table {
    border-collapse: collapse !important;
    border: 1px solid #6b7280 !important;
  }

  table th,
  table td {
    border: 1px solid #6b7280 !important;
    padding: 8px 12px !important;
  }

  /* Table header - slightly different background */
  table th {
    background-color: rgba(107, 114, 128, 0.3) !important;
    font-weight: 600 !important;
  }

  /* Alternating row colors for readability */
  table tbody tr:nth-child(even) {
    background-color: rgba(107, 114, 128, 0.1) !important;
  }

  /* Hover effect */
  table tbody tr:hover {
    background-color: rgba(107, 114, 128, 0.2) !important;
  }
</style>

<!-- Mermaid diagrams with paper-like background -->
<style>
  /* Mermaid container - paper-like background */
  .mermaid,
  pre.mermaid,
  .language-mermaid,
  code.language-mermaid {
    background-color: #d5d0c8 !important;
    border-radius: 8px !important;
    padding: 16px !important;
    margin: 16px 0 !important;
    display: block !important;
  }

  /* All text in Mermaid - dark gray */
  .mermaid text,
  .mermaid tspan,
  .mermaid .nodeLabel,
  .mermaid .label,
  .mermaid .edgeLabel,
  .mermaid .cluster-label,
  .mermaid .messageText,
  .mermaid .loopText,
  .mermaid .noteText,
  .mermaid .labelText,
  .mermaid .actor {
    fill: #2c3e50 !important;
    color: #2c3e50 !important;
  }

  /* All lines and arrows - dark gray */
  .mermaid path,
  .mermaid .edgePath path,
  .mermaid .flowchart-link,
  .mermaid .messageLine0,
  .mermaid .messageLine1,
  .mermaid .relation {
    stroke: #4a5568 !important;
  }

  /* Sequence diagram actor lifelines - force visible */
  line[id^="actor"] {
    stroke: #000000 !important;
    stroke-width: 0.5px !important;
  }

  /* Sequence diagram message lines */
  .mermaid .messageText {
    fill: #2c3e50 !important;
  }

  .mermaid .messageLine0,
  .mermaid .messageLine1 {
    stroke: #4a5568 !important;
    stroke-width: 1.5px !important;
  }

  .mermaid marker path,
  .mermaid .arrowheadPath {
    fill: #4a5568 !important;
    stroke: #4a5568 !important;
  }

  /* Node backgrounds - paper tones */
  .mermaid .node rect,
  .mermaid .node circle,
  .mermaid .node ellipse,
  .mermaid .node polygon,
  .mermaid .node path {
    fill: #c5c0b8 !important;
    stroke: #8a8578 !important;
  }

  /* Cluster backgrounds */
  .mermaid .cluster rect {
    fill: #cac5bd !important;
    stroke: #8a8578 !important;
  }

  /* Actor boxes in sequence diagrams */
  .mermaid .actor-box,
  .mermaid rect.actor {
    fill: #c5c0b8 !important;
    stroke: #8a8578 !important;
  }

  /* Notes - slightly warmer */
  .mermaid .note {
    fill: #ddd8c8 !important;
    stroke: #a89878 !important;
  }

  /* Mindmap nodes */
  .mermaid .mindmap-node rect,
  .mermaid .mindmap-node circle {
    fill: #c5c0b8 !important;
    stroke: #8a8578 !important;
  }

  .mermaid .mindmap-edges path {
    stroke: #4a5568 !important;
    stroke-width: 2px !important;
  }
</style>

<!-- Fix sequence diagram lifelines after mermaid renders -->
<script>
(function() {
  function fixActorLines() {
    var lines = document.querySelectorAll('line[id^="actor"]');
    for (var i = 0; i < lines.length; i++) {
      lines[i].setAttribute('stroke', '#000000');
      lines[i].setAttribute('stroke-width', '0.5px');
    }
  }

  // Run after page fully loads
  if (document.readyState === 'complete') {
    setTimeout(fixActorLines, 500);
    setTimeout(fixActorLines, 1500);
  } else {
    window.addEventListener('load', function() {
      setTimeout(fixActorLines, 500);
      setTimeout(fixActorLines, 1500);
      setTimeout(fixActorLines, 3000);
    });
  }
})();
</script>


</head>

<body>
  <a class="skip-to-main" href="#main-content">Skip to main content</a>
  <svg xmlns="http://www.w3.org/2000/svg" class="d-none">
  <symbol id="svg-link" viewBox="0 0 24 24">
  <title>Link</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link">
    <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path>
  </svg>
</symbol>

  <symbol id="svg-menu" viewBox="0 0 24 24">
  <title>Menu</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu">
    <line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line>
  </svg>
</symbol>

  <symbol id="svg-arrow-right" viewBox="0 0 24 24">
  <title>Expand</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-right">
    <polyline points="9 18 15 12 9 6"></polyline>
  </svg>
</symbol>

  <!-- Feather. MIT License: https://github.com/feathericons/feather/blob/master/LICENSE -->
<symbol id="svg-external-link" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-external-link">
  <title id="svg-external-link-title">(external link)</title>
  <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line>
</symbol>

  
    <symbol id="svg-doc" viewBox="0 0 24 24">
  <title>Document</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-file">
    <path d="M13 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V9z"></path><polyline points="13 2 13 9 20 9"></polyline>
  </svg>
</symbol>

    <symbol id="svg-search" viewBox="0 0 24 24">
  <title>Search</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-search">
    <circle cx="11" cy="11" r="8"></circle><line x1="21" y1="21" x2="16.65" y2="16.65"></line>
  </svg>
</symbol>

  
  
    <!-- Bootstrap Icons. MIT License: https://github.com/twbs/icons/blob/main/LICENSE.md -->
<symbol id="svg-copy" viewBox="0 0 16 16">
  <title>Copy</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard" viewBox="0 0 16 16">
    <path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1h1a1 1 0 0 1 1 1V14a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V3.5a1 1 0 0 1 1-1h1v-1z"/>
    <path d="M9.5 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3zm-3-1A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3z"/>
  </svg>
</symbol>
<symbol id="svg-copied" viewBox="0 0 16 16">
  <title>Copied</title>
  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-clipboard-check-fill" viewBox="0 0 16 16">
    <path d="M6.5 0A1.5 1.5 0 0 0 5 1.5v1A1.5 1.5 0 0 0 6.5 4h3A1.5 1.5 0 0 0 11 2.5v-1A1.5 1.5 0 0 0 9.5 0h-3Zm3 1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-1a.5.5 0 0 1 .5-.5h3Z"/>
    <path d="M4 1.5H3a2 2 0 0 0-2 2V14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V3.5a2 2 0 0 0-2-2h-1v1A2.5 2.5 0 0 1 9.5 5h-3A2.5 2.5 0 0 1 4 2.5v-1Zm6.854 7.354-3 3a.5.5 0 0 1-.708 0l-1.5-1.5a.5.5 0 0 1 .708-.708L7.5 10.793l2.646-2.647a.5.5 0 0 1 .708.708Z"/>
  </svg>
</symbol>

  
</svg>

  
    <header class="side-bar">
  <div class="site-header">
    <a href="/linux-driver-guide-tutorial/" class="site-title lh-tight">
  <div class="site-logo" role="img" aria-label="Linux Driver Development Guide"></div>

</a>
    <button id="menu-button" class="site-button btn-reset" aria-label="Menu" aria-expanded="false">
      <svg viewBox="0 0 24 24" class="icon" aria-hidden="true"><use xlink:href="#svg-menu"></use></svg>
    </button>
  </div>

  <nav aria-label="Main" id="site-nav" class="site-nav">
  
  
    <ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/" class="nav-list-link">Home</a></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 1: Getting Started submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part1/" class="nav-list-link">Part 1: Getting Started</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part1/00-learning-paths.html" class="nav-list-link">Learning Paths</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part1/01-introduction.html" class="nav-list-link">1.1 Introduction</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part1/02-environment-setup.html" class="nav-list-link">1.2 Environment Setup</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part1/03-kernel-sources.html" class="nav-list-link">1.3 Kernel Sources</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part1/04-first-module.html" class="nav-list-link">1.4 First Module</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part1/05-qemu-testing.html" class="nav-list-link">1.5 QEMU Testing</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 2: Kernel Fundamentals submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part2/" class="nav-list-link">Part 2: Kernel Fundamentals</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part2/01-kernel-architecture.html" class="nav-list-link">2.1 Kernel Architecture</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part2/02-module-lifecycle.html" class="nav-list-link">2.2 Module Lifecycle</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part2/03-coding-style.html" class="nav-list-link">2.3 Coding Style</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part2/04-data-types.html" class="nav-list-link">2.4 Data Types</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part2/05-error-handling.html" class="nav-list-link">2.5 Error Handling</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part2/06-kernel-api.html" class="nav-list-link">2.6 Kernel API</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part2/07-data-structures.html" class="nav-list-link">2.7 Kernel Data Structures</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 3: Character Device Drivers submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part3/" class="nav-list-link">Part 3: Character Device Drivers</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part3/01-char-device-concepts.html" class="nav-list-link">3.1 Character Device Concepts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part3/02-file-operations.html" class="nav-list-link">3.2 File Operations</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part3/03-cdev-registration.html" class="nav-list-link">3.3 Device Registration</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part3/04-read-write.html" class="nav-list-link">3.4 Read and Write</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part3/05-ioctl.html" class="nav-list-link">3.5 IOCTL</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part3/06-poll-select.html" class="nav-list-link">3.6 Poll and Seek</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part3/07-misc-devices.html" class="nav-list-link">3.7 Misc Devices</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 4: Concurrency and Synchronization submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part4/" class="nav-list-link">Part 4: Concurrency and Synchronization</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/01-concurrency-concepts.html" class="nav-list-link">4.1 Concurrency Concepts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/02-spinlocks.html" class="nav-list-link">4.2 Spinlocks</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/03-mutexes.html" class="nav-list-link">4.3 Mutexes</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/04-semaphores.html" class="nav-list-link">4.4 Semaphores</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/05-atomic-operations.html" class="nav-list-link">4.5 Atomic Operations</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/06-rcu.html" class="nav-list-link">4.6 RCU</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/07-completions.html" class="nav-list-link">4.7 Completions</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/08-workqueues.html" class="nav-list-link">4.8 Work Queues</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/09-lockdep.html" class="nav-list-link">4.9 Lockdep</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/10-timers.html" class="nav-list-link">4.10 Kernel Timers</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/11-wait-queues.html" class="nav-list-link">4.11 Wait Queues</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part4/12-kthreads.html" class="nav-list-link">4.12 Kernel Threads</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 5: Memory Management submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part5/" class="nav-list-link">Part 5: Memory Management</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part5/01-memory-allocators.html" class="nav-list-link">5.1 Memory Allocators</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part5/02-gfp-flags.html" class="nav-list-link">5.2 GFP Flags</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part5/03-slab-allocator.html" class="nav-list-link">5.3 Slab Allocator</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part5/04-per-cpu-variables.html" class="nav-list-link">5.4 Per-CPU Variables</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part5/05-dma-coherent.html" class="nav-list-link">5.5 Coherent DMA</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part5/06-dma-streaming.html" class="nav-list-link">5.6 Streaming DMA</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part5/07-ioremap.html" class="nav-list-link">5.7 Memory-Mapped I/O</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part5/08-mmap.html" class="nav-list-link">5.8 mmap</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 6: Device Model and Driver Framework submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part6/" class="nav-list-link">Part 6: Device Model and Driver Framework</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part6/01-device-model.html" class="nav-list-link">6.1 Device Model Basics</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part6/02-kobjects.html" class="nav-list-link">6.2 Kobjects</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part6/03-platform-drivers.html" class="nav-list-link">6.3 Platform Drivers</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part6/04-probe-remove.html" class="nav-list-link">6.4 Probe and Remove</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part6/05-devres.html" class="nav-list-link">6.5 Managed Resources (devres)</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part6/06-device-attributes.html" class="nav-list-link">6.6 Device Attributes</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part6/07-deferred-probe.html" class="nav-list-link">6.7 Deferred Probe</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 7: Interrupt Handling submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part7/" class="nav-list-link">Part 7: Interrupt Handling</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part7/01-interrupt-concepts.html" class="nav-list-link">7.1 Interrupt Concepts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part7/02-requesting-irqs.html" class="nav-list-link">7.2 Requesting IRQs</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part7/03-interrupt-handlers.html" class="nav-list-link">7.3 Interrupt Handlers</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part7/04-top-bottom-halves.html" class="nav-list-link">7.4 Top and Bottom Halves</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part7/05-tasklets.html" class="nav-list-link">7.5 Tasklets</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part7/06-threaded-irqs.html" class="nav-list-link">7.6 Threaded IRQs</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part7/07-shared-interrupts.html" class="nav-list-link">7.7 Shared Interrupts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part7/08-interrupt-control.html" class="nav-list-link">7.8 Interrupt Control</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 8: Platform Bus and Device Tree submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part8/" class="nav-list-link">Part 8: Platform Bus and Device Tree</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part8/01-devicetree-basics.html" class="nav-list-link">8.1 Device Tree Basics</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part8/02-bindings.html" class="nav-list-link">8.2 Device Bindings</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part8/03-property-access.html" class="nav-list-link">8.3 Property Access</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part8/04-gpio-references.html" class="nav-list-link">8.4 GPIO in Device Tree</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part8/05-clock-regulator-refs.html" class="nav-list-link">8.5 Clocks and Regulators</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part8/06-overlays.html" class="nav-list-link">8.6 Device Tree Overlays</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part8/07-binding-docs.html" class="nav-list-link">8.7 Binding Documentation</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 9: I2C, SPI, and GPIO Drivers submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part9/" class="nav-list-link">Part 9: I2C, SPI, and GPIO Drivers</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part9/01-i2c-subsystem.html" class="nav-list-link">9.1 I2C Subsystem</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part9/02-i2c-client-driver.html" class="nav-list-link">9.2 I2C Client Driver</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part9/03-i2c-regmap.html" class="nav-list-link">9.3 I2C with Regmap</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part9/04-spi-subsystem.html" class="nav-list-link">9.4 SPI Subsystem</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part9/05-spi-driver.html" class="nav-list-link">9.5 SPI Driver</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part9/06-gpio-consumer.html" class="nav-list-link">9.6 GPIO Consumer API</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part9/07-gpio-provider.html" class="nav-list-link">9.7 GPIO Provider</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part9/08-pinctrl.html" class="nav-list-link">9.8 Pin Control Subsystem</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 10: PWM, Watchdog, HWMON, LED Drivers submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part10/" class="nav-list-link">Part 10: PWM, Watchdog, HWMON, LED Drivers</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part10/01-pwm-subsystem.html" class="nav-list-link">10.1 PWM Subsystem</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part10/02-pwm-provider.html" class="nav-list-link">10.2 PWM Provider</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part10/03-watchdog-subsystem.html" class="nav-list-link">10.3 Watchdog Subsystem</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part10/04-watchdog-driver.html" class="nav-list-link">10.4 Watchdog Driver</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part10/05-hwmon-subsystem.html" class="nav-list-link">10.5 HWMON Subsystem</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part10/06-hwmon-driver.html" class="nav-list-link">10.6 HWMON Driver</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part10/07-led-subsystem.html" class="nav-list-link">10.7 LED Subsystem</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part10/08-input-subsystem.html" class="nav-list-link">10.8 Input Subsystem</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 11: IIO, RTC, Regulator, Clock Drivers submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part11/" class="nav-list-link">Part 11: IIO, RTC, Regulator, Clock Drivers</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part11/01-iio-subsystem.html" class="nav-list-link">11.1 IIO Subsystem</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part11/02-iio-driver.html" class="nav-list-link">11.2 IIO Driver</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part11/03-iio-buffers.html" class="nav-list-link">11.3 IIO Buffers</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part11/04-rtc-subsystem.html" class="nav-list-link">11.4 RTC Subsystem</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part11/05-rtc-driver.html" class="nav-list-link">11.5 RTC Driver</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part11/06-regulator-subsystem.html" class="nav-list-link">11.6 Regulator Subsystem</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part11/07-regulator-driver.html" class="nav-list-link">11.7 Regulator Driver</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part11/08-clock-framework.html" class="nav-list-link">11.8 Clock Framework</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part11/09-clock-provider.html" class="nav-list-link">11.9 Clock Provider</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 12: Network Device Drivers submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part12/" class="nav-list-link">Part 12: Network Device Drivers</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part12/01-concepts.html" class="nav-list-link">12.1 Network Driver Concepts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part12/02-driver-skeleton.html" class="nav-list-link">12.2 Driver Skeleton</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part12/03-napi.html" class="nav-list-link">12.3 NAPI</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part12/04-ethtool.html" class="nav-list-link">12.4 Ethtool Operations</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part12/05-link-management.html" class="nav-list-link">12.5 Link State Management</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 13: Block Device Drivers submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part13/" class="nav-list-link">Part 13: Block Device Drivers</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part13/01-concepts.html" class="nav-list-link">13.1 Block Driver Concepts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part13/02-driver-skeleton.html" class="nav-list-link">13.2 Driver Skeleton</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part13/03-block-operations.html" class="nav-list-link">13.3 Block Device Operations</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part13/04-request-handling.html" class="nav-list-link">13.4 Request Handling</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 14: USB Drivers submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part14/" class="nav-list-link">Part 14: USB Drivers</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/01-concepts.html" class="nav-list-link">14.1 USB Concepts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/02-driver-skeleton.html" class="nav-list-link">14.2 Driver Skeleton</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/03-transfers.html" class="nav-list-link">14.3 USB Transfers</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/04-error-handling.html" class="nav-list-link">14.4 Error Handling</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/05-suspend-resume.html" class="nav-list-link">14.5 Suspend and Resume</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/06-user-interface.html" class="nav-list-link">14.6 User Space Interface</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/07-porting-guide.html" class="nav-list-link">14.7 Porting from Custom I/O</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/08-winusb-libusb.html" class="nav-list-link">14.8 WinUSB and libusb Compatibility</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/09-usb-class-drivers.html" class="nav-list-link">14.9 USB Class Drivers</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/10-usb-gadget.html" class="nav-list-link">14.10 USB Gadget Drivers</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part14/11-dynamic-gadget.html" class="nav-list-link">14.11 Dynamic USB Gadget Configuration</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 15: PCIe Drivers submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part15/" class="nav-list-link">Part 15: PCIe Drivers</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part15/01-concepts.html" class="nav-list-link">15.1 PCI Concepts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part15/02-driver-skeleton.html" class="nav-list-link">15.2 Driver Skeleton</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part15/03-msi-interrupts.html" class="nav-list-link">15.3 MSI/MSI-X Interrupts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part15/04-dma-operations.html" class="nav-list-link">15.4 DMA Operations</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part15/05-pcie-security.html" class="nav-list-link">15.5 PCIe Security: Attestation and Link Encryption</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Part 16: Power Management submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/part16/" class="nav-list-link">Part 16: Power Management</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part16/01-concepts.html" class="nav-list-link">16.1 PM Concepts</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part16/02-implementation.html" class="nav-list-link">16.2 PM Implementation</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part16/03-wakeup-sources.html" class="nav-list-link">16.3 Wakeup Sources</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/part16/04-system-sleep-states.html" class="nav-list-link">16.4 System Sleep States</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Appendix A: Debugging submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/appendices/debugging/" class="nav-list-link">Appendix A: Debugging</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/debugging/01-logging.html" class="nav-list-link">A.1 Logging</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/debugging/02-tracing.html" class="nav-list-link">A.2 Tracing</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/debugging/03-crash-analysis.html" class="nav-list-link">A.3 Crash Analysis</a></li></ul></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Appendix B: Kernel Interfaces submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/appendices/interfaces/" class="nav-list-link">Appendix B: Kernel Interfaces</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/interfaces/01-sysfs.html" class="nav-list-link">B.1 sysfs</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/interfaces/02-debugfs.html" class="nav-list-link">B.2 debugfs</a></li></ul></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/firmware/" class="nav-list-link">Appendix C: Firmware Loading</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/security/" class="nav-list-link">Appendix D: Security</a></li><li class="nav-list-item"><button class="nav-list-expander btn-reset" aria-label="Appendix E: Testing submenu" aria-expanded="false">
        <svg viewBox="0 0 24 24" aria-hidden="true"><use xlink:href="#svg-arrow-right"></use></svg>
      </button><a href="/linux-driver-guide-tutorial/appendices/testing/" class="nav-list-link">Appendix E: Testing</a><ul class="nav-list"><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/testing/01-kunit.html" class="nav-list-link">E.1 KUnit</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/testing/02-runtime-checks.html" class="nav-list-link">E.2 Runtime Checks</a></li></ul></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/upstreaming/" class="nav-list-link">Appendix F: Upstreaming</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/glossary.html" class="nav-list-link">Appendix G: Glossary</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/references.html" class="nav-list-link">Appendix H: References</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/jtag/" class="nav-list-link">Appendix I: JTAG Drivers</a></li><li class="nav-list-item"><a href="/linux-driver-guide-tutorial/appendices/userspace-drivers/" class="nav-list-link">Appendix J: User Space Drivers</a></li></ul>
  <ul class="nav-list"><li class="nav-list-item external">
          <a href="https://docs.kernel.org/" class="nav-list-link external"
            
          >
            Kernel Docs
            <svg viewBox="0 0 24 24" aria-labelledby="svg-external-link-title"><use xlink:href="#svg-external-link"></use></svg>
          </a>
        </li><li class="nav-list-item external">
          <a href="https://lwn.net/Kernel/" class="nav-list-link external"
            
          >
            LWN.net
            <svg viewBox="0 0 24 24" aria-labelledby="svg-external-link-title"><use xlink:href="#svg-external-link"></use></svg>
          </a>
        </li><li class="nav-list-item external">
          <a href="https://bootlin.com/training/" class="nav-list-link external"
            
          >
            Bootlin Training
            <svg viewBox="0 0 24 24" aria-labelledby="svg-external-link-title"><use xlink:href="#svg-external-link"></use></svg>
          </a>
        </li></ul>
</nav>


<div class="d-md-block d-none site-footer">
  
  
    This site uses <a href="https://github.com/just-the-docs/just-the-docs">Just the Docs</a>, a documentation theme for Jekyll.
  
  </div>
</header>

  
  <div class="main" id="top">
    <div id="main-header" class="main-header">
  
    

<div class="search" role="search">
  <div class="search-input-wrap">
    <input type="text" id="search-input" class="search-input" tabindex="0" placeholder="Search Linux Driver Development Guide" autocomplete="off">
    <label for="search-input" class="search-label">
      <span class="sr-only">Search Linux Driver Development Guide</span>
      <svg viewBox="0 0 24 24" class="search-icon" aria-hidden="true"><use xlink:href="#svg-search"></use></svg>
    </label>
  </div>
  <div id="search-results" class="search-results"></div>
</div>

  
  
  
    <nav aria-label="Auxiliary" class="aux-nav">
  <ul class="aux-nav-list">
    
      <li class="aux-nav-list-item">
        <a href="https://github.com/MichaelTien8901/linux-driver-dev-guide" class="site-button"
          
          target="_blank" rel="noopener noreferrer"
          
        >
          GitHub Repository
        </a>
      </li>
    
  </ul>
</nav>

  
</div>

    <div class="main-content-wrap">
      
      <div id="main-content" class="main-content">
        <main>
          
            <h.site-nav ul li a {
  background-image: linear-gradient(-90deg, rgb(31.6333333333, 30.8222222222, 34.8777777778) 0%, rgba(31.6333333333, 30.8222222222, 34.8777777778, 0.8) 80%, rgba(31.6333333333, 30.8222222222, 34.8777777778, 0) 100%);
}

          

          
            
          
        </main>
        
<hr>
<footer>
  
    <p><a href="#top" id="back-to-top">Back to top</a></p>
  

  <p class="text-small mb-0">Linux Driver Development Guide is a community resource for learning kernel driver development. Not affiliated with the Linux Foundation. Content provided for educational purposes.</p>

  <div class="d-md-none mt-4 fs-2">
    
    
      This site uses <a href="https://github.com/just-the-docs/just-the-docs">Just the Docs</a>, a documentation theme for Jekyll.
    
  </div>
</footer>

      </div>
    </div>
    
      

<div class="search-overlay"></div>

    
  </div>

  
    





<script type="module">
  
  import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@10.6.0/dist/mermaid.esm.min.mjs';
  

  var config = // Mermaid configuration with soft light background
mermaid.initialize({
  startOnLoad: true,
  theme: 'base',
  securityLevel: 'loose',
  themeVariables: {
    // Paper-like background (warm, unlit paper tone)
    background: '#d5d0c8',
    mainBkg: '#ccc7bf',

    // Primary colors - muted blue
    primaryColor: '#5a9bd5',
    primaryTextColor: '#2c3e50',
    primaryBorderColor: '#4a89c0',

    // Secondary colors - muted green
    secondaryColor: '#7ec88b',
    secondaryTextColor: '#2c3e50',
    secondaryBorderColor: '#5fb06f',

    // Tertiary colors - muted purple
    tertiaryColor: '#b08ed0',
    tertiaryTextColor: '#2c3e50',
    tertiaryBorderColor: '#9575b5',

    // Lines - dark gray for good contrast
    lineColor: '#4a5568',

    // Node backgrounds - paper tones
    nodeBkg: '#c5c0b8',
    nodeTextColor: '#2c3e50',
    nodeBorder: '#8a8578',

    // Text - dark gray (not pure black)
    textColor: '#2c3e50',

    // Clusters
    clusterBkg: '#cac5bd',
    clusterBorder: '#8a8578',

    // Notes - slightly warmer
    noteBkgColor: '#ddd8c8',
    noteTextColor: '#2c3e50',
    noteBorderColor: '#a89878',

    // Sequence diagram
    actorBkg: '#c5c0b8',
    actorBorder: '#8a8578',
    actorTextColor: '#2c3e50',
    actorLineColor: '#4a5568',
    signalColor: '#4a5568',
    signalTextColor: '#2c3e50',
    labelTextColor: '#2c3e50',

    // Edge labels
    edgeLabelBackground: '#d5d0c8',

    // Gantt
    sectionBkgColor: '#dde4ed',
    altSectionBkgColor: '#e8ebef',
    gridColor: '#b8c4d0',
    todayLineColor: '#e05252',
    critBkgColor: '#f8d7da',
    critBorderColor: '#dc3545',
    doneBkgColor: '#d4edda',
    doneBorderColor: '#28a745',

    // Git graph
    git0: '#5a9bd5',
    git1: '#7ec88b',
    git2: '#e05252',
    git3: '#f0ad4e'
  },
  flowchart: {
    useMaxWidth: true,
    htmlLabels: true,
    curve: 'basis',
    diagramPadding: 8
  },
  sequence: {
    diagramMarginX: 50,
    diagramMarginY: 10,
    actorMargin: 50,
    width: 150,
    height: 65,
    boxMargin: 10,
    boxTextMargin: 5,
    noteMargin: 10,
    messageMargin: 35
  },
  gantt: {
    titleTopMargin: 25,
    barHeight: 20,
    barGap: 4,
    topPadding: 50
  }
});
;
  mermaid.initialize(config);
  mermaid.run({
    querySelector: '.language-mermaid',
  });
</script>



  
</body>
</html>

