1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN" 3"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" []> 4 5<book id="index"> 6<bookinfo> 7<title>The Userspace I/O HOWTO</title> 8 9<author> 10 <firstname>Hans-Jürgen</firstname> 11 <surname>Koch</surname> 12 <authorblurb><para>Linux developer, Linutronix</para></authorblurb> 13 <affiliation> 14 <orgname> 15 <ulink url="http://www.linutronix.de">Linutronix</ulink> 16 </orgname> 17 18 <address> 19 <email>hjk@linutronix.de</email> 20 </address> 21 </affiliation> 22</author> 23 24<copyright> 25 <year>2006-2008</year> 26 <holder>Hans-Jürgen Koch.</holder> 27</copyright> 28 29<legalnotice> 30<para> 31This documentation is Free Software licensed under the terms of the 32GPL version 2. 33</para> 34</legalnotice> 35 36<pubdate>2006-12-11</pubdate> 37 38<abstract> 39 <para>This HOWTO describes concept and usage of Linux kernel's 40 Userspace I/O system.</para> 41</abstract> 42 43<revhistory> 44 <revision> 45 <revnumber>0.8</revnumber> 46 <date>2008-12-24</date> 47 <authorinitials>hjk</authorinitials> 48 <revremark>Added name attributes in mem and portio sysfs directories. 49 </revremark> 50 </revision> 51 <revision> 52 <revnumber>0.7</revnumber> 53 <date>2008-12-23</date> 54 <authorinitials>hjk</authorinitials> 55 <revremark>Added generic platform drivers and offset attribute.</revremark> 56 </revision> 57 <revision> 58 <revnumber>0.6</revnumber> 59 <date>2008-12-05</date> 60 <authorinitials>hjk</authorinitials> 61 <revremark>Added description of portio sysfs attributes.</revremark> 62 </revision> 63 <revision> 64 <revnumber>0.5</revnumber> 65 <date>2008-05-22</date> 66 <authorinitials>hjk</authorinitials> 67 <revremark>Added description of write() function.</revremark> 68 </revision> 69 <revision> 70 <revnumber>0.4</revnumber> 71 <date>2007-11-26</date> 72 <authorinitials>hjk</authorinitials> 73 <revremark>Removed section about uio_dummy.</revremark> 74 </revision> 75 <revision> 76 <revnumber>0.3</revnumber> 77 <date>2007-04-29</date> 78 <authorinitials>hjk</authorinitials> 79 <revremark>Added section about userspace drivers.</revremark> 80 </revision> 81 <revision> 82 <revnumber>0.2</revnumber> 83 <date>2007-02-13</date> 84 <authorinitials>hjk</authorinitials> 85 <revremark>Update after multiple mappings were added.</revremark> 86 </revision> 87 <revision> 88 <revnumber>0.1</revnumber> 89 <date>2006-12-11</date> 90 <authorinitials>hjk</authorinitials> 91 <revremark>First draft.</revremark> 92 </revision> 93</revhistory> 94</bookinfo> 95 96<chapter id="aboutthisdoc"> 97<?dbhtml filename="aboutthis.html"?> 98<title>About this document</title> 99 100<sect1 id="translations"> 101<?dbhtml filename="translations.html"?> 102<title>Translations</title> 103 104<para>If you know of any translations for this document, or you are 105interested in translating it, please email me 106<email>hjk@linutronix.de</email>. 107</para> 108</sect1> 109 110<sect1 id="preface"> 111<title>Preface</title> 112 <para> 113 For many types of devices, creating a Linux kernel driver is 114 overkill. All that is really needed is some way to handle an 115 interrupt and provide access to the memory space of the 116 device. The logic of controlling the device does not 117 necessarily have to be within the kernel, as the device does 118 not need to take advantage of any of other resources that the 119 kernel provides. One such common class of devices that are 120 like this are for industrial I/O cards. 121 </para> 122 <para> 123 To address this situation, the userspace I/O system (UIO) was 124 designed. For typical industrial I/O cards, only a very small 125 kernel module is needed. The main part of the driver will run in 126 user space. This simplifies development and reduces the risk of 127 serious bugs within a kernel module. 128 </para> 129 <para> 130 Please note that UIO is not an universal driver interface. Devices 131 that are already handled well by other kernel subsystems (like 132 networking or serial or USB) are no candidates for an UIO driver. 133 Hardware that is ideally suited for an UIO driver fulfills all of 134 the following: 135 </para> 136<itemizedlist> 137<listitem> 138 <para>The device has memory that can be mapped. The device can be 139 controlled completely by writing to this memory.</para> 140</listitem> 141<listitem> 142 <para>The device usually generates interrupts.</para> 143</listitem> 144<listitem> 145 <para>The device does not fit into one of the standard kernel 146 subsystems.</para> 147</listitem> 148</itemizedlist> 149</sect1> 150 151<sect1 id="thanks"> 152<title>Acknowledgments</title> 153 <para>I'd like to thank Thomas Gleixner and Benedikt Spranger of 154 Linutronix, who have not only written most of the UIO code, but also 155 helped greatly writing this HOWTO by giving me all kinds of background 156 information.</para> 157</sect1> 158 159<sect1 id="feedback"> 160<title>Feedback</title> 161 <para>Find something wrong with this document? (Or perhaps something 162 right?) I would love to hear from you. Please email me at 163 <email>hjk@linutronix.de</email>.</para> 164</sect1> 165</chapter> 166 167<chapter id="about"> 168<?dbhtml filename="about.html"?> 169<title>About UIO</title> 170 171<para>If you use UIO for your card's driver, here's what you get:</para> 172 173<itemizedlist> 174<listitem> 175 <para>only one small kernel module to write and maintain.</para> 176</listitem> 177<listitem> 178 <para>develop the main part of your driver in user space, 179 with all the tools and libraries you're used to.</para> 180</listitem> 181<listitem> 182 <para>bugs in your driver won't crash the kernel.</para> 183</listitem> 184<listitem> 185 <para>updates of your driver can take place without recompiling 186 the kernel.</para> 187</listitem> 188</itemizedlist> 189 190<sect1 id="how_uio_works"> 191<title>How UIO works</title> 192 <para> 193 Each UIO device is accessed through a device file and several 194 sysfs attribute files. The device file will be called 195 <filename>/dev/uio0</filename> for the first device, and 196 <filename>/dev/uio1</filename>, <filename>/dev/uio2</filename> 197 and so on for subsequent devices. 198 </para> 199 200 <para><filename>/dev/uioX</filename> is used to access the 201 address space of the card. Just use 202 <function>mmap()</function> to access registers or RAM 203 locations of your card. 204 </para> 205 206 <para> 207 Interrupts are handled by reading from 208 <filename>/dev/uioX</filename>. A blocking 209 <function>read()</function> from 210 <filename>/dev/uioX</filename> will return as soon as an 211 interrupt occurs. You can also use 212 <function>select()</function> on 213 <filename>/dev/uioX</filename> to wait for an interrupt. The 214 integer value read from <filename>/dev/uioX</filename> 215 represents the total interrupt count. You can use this number 216 to figure out if you missed some interrupts. 217 </para> 218 <para> 219 For some hardware that has more than one interrupt source internally, 220 but not separate IRQ mask and status registers, there might be 221 situations where userspace cannot determine what the interrupt source 222 was if the kernel handler disables them by writing to the chip's IRQ 223 register. In such a case, the kernel has to disable the IRQ completely 224 to leave the chip's register untouched. Now the userspace part can 225 determine the cause of the interrupt, but it cannot re-enable 226 interrupts. Another cornercase is chips where re-enabling interrupts 227 is a read-modify-write operation to a combined IRQ status/acknowledge 228 register. This would be racy if a new interrupt occurred 229 simultaneously. 230 </para> 231 <para> 232 To address these problems, UIO also implements a write() function. It 233 is normally not used and can be ignored for hardware that has only a 234 single interrupt source or has separate IRQ mask and status registers. 235 If you need it, however, a write to <filename>/dev/uioX</filename> 236 will call the <function>irqcontrol()</function> function implemented 237 by the driver. You have to write a 32-bit value that is usually either 238 0 or 1 to disable or enable interrupts. If a driver does not implement 239 <function>irqcontrol()</function>, <function>write()</function> will 240 return with <varname>-ENOSYS</varname>. 241 </para> 242 243 <para> 244 To handle interrupts properly, your custom kernel module can 245 provide its own interrupt handler. It will automatically be 246 called by the built-in handler. 247 </para> 248 249 <para> 250 For cards that don't generate interrupts but need to be 251 polled, there is the possibility to set up a timer that 252 triggers the interrupt handler at configurable time intervals. 253 This interrupt simulation is done by calling 254 <function>uio_event_notify()</function> 255 from the timer's event handler. 256 </para> 257 258 <para> 259 Each driver provides attributes that are used to read or write 260 variables. These attributes are accessible through sysfs 261 files. A custom kernel driver module can add its own 262 attributes to the device owned by the uio driver, but not added 263 to the UIO device itself at this time. This might change in the 264 future if it would be found to be useful. 265 </para> 266 267 <para> 268 The following standard attributes are provided by the UIO 269 framework: 270 </para> 271<itemizedlist> 272<listitem> 273 <para> 274 <filename>name</filename>: The name of your device. It is 275 recommended to use the name of your kernel module for this. 276 </para> 277</listitem> 278<listitem> 279 <para> 280 <filename>version</filename>: A version string defined by your 281 driver. This allows the user space part of your driver to deal 282 with different versions of the kernel module. 283 </para> 284</listitem> 285<listitem> 286 <para> 287 <filename>event</filename>: The total number of interrupts 288 handled by the driver since the last time the device node was 289 read. 290 </para> 291</listitem> 292</itemizedlist> 293<para> 294 These attributes appear under the 295 <filename>/sys/class/uio/uioX</filename> directory. Please 296 note that this directory might be a symlink, and not a real 297 directory. Any userspace code that accesses it must be able 298 to handle this. 299</para> 300<para> 301 Each UIO device can make one or more memory regions available for 302 memory mapping. This is necessary because some industrial I/O cards 303 require access to more than one PCI memory region in a driver. 304</para> 305<para> 306 Each mapping has its own directory in sysfs, the first mapping 307 appears as <filename>/sys/class/uio/uioX/maps/map0/</filename>. 308 Subsequent mappings create directories <filename>map1/</filename>, 309 <filename>map2/</filename>, and so on. These directories will only 310 appear if the size of the mapping is not 0. 311</para> 312<para> 313 Each <filename>mapX/</filename> directory contains four read-only files 314 that show attributes of the memory: 315</para> 316<itemizedlist> 317<listitem> 318 <para> 319 <filename>name</filename>: A string identifier for this mapping. This 320 is optional, the string can be empty. Drivers can set this to make it 321 easier for userspace to find the correct mapping. 322 </para> 323</listitem> 324<listitem> 325 <para> 326 <filename>addr</filename>: The address of memory that can be mapped. 327 </para> 328</listitem> 329<listitem> 330 <para> 331 <filename>size</filename>: The size, in bytes, of the memory 332 pointed to by addr. 333 </para> 334</listitem> 335<listitem> 336 <para> 337 <filename>offset</filename>: The offset, in bytes, that has to be 338 added to the pointer returned by <function>mmap()</function> to get 339 to the actual device memory. This is important if the device's memory 340 is not page aligned. Remember that pointers returned by 341 <function>mmap()</function> are always page aligned, so it is good 342 style to always add this offset. 343 </para> 344</listitem> 345</itemizedlist> 346 347<para> 348 From userspace, the different mappings are distinguished by adjusting 349 the <varname>offset</varname> parameter of the 350 <function>mmap()</function> call. To map the memory of mapping N, you 351 have to use N times the page size as your offset: 352</para> 353<programlisting format="linespecific"> 354offset = N * getpagesize(); 355</programlisting> 356 357<para> 358 Sometimes there is hardware with memory-like regions that can not be 359 mapped with the technique described here, but there are still ways to 360 access them from userspace. The most common example are x86 ioports. 361 On x86 systems, userspace can access these ioports using 362 <function>ioperm()</function>, <function>iopl()</function>, 363 <function>inb()</function>, <function>outb()</function>, and similar 364 functions. 365</para> 366<para> 367 Since these ioport regions can not be mapped, they will not appear under 368 <filename>/sys/class/uio/uioX/maps/</filename> like the normal memory 369 described above. Without information about the port regions a hardware 370 has to offer, it becomes difficult for the userspace part of the 371 driver to find out which ports belong to which UIO device. 372</para> 373<para> 374 To address this situation, the new directory 375 <filename>/sys/class/uio/uioX/portio/</filename> was added. It only 376 exists if the driver wants to pass information about one or more port 377 regions to userspace. If that is the case, subdirectories named 378 <filename>port0</filename>, <filename>port1</filename>, and so on, 379 will appear underneath 380 <filename>/sys/class/uio/uioX/portio/</filename>. 381</para> 382<para> 383 Each <filename>portX/</filename> directory contains four read-only 384 files that show name, start, size, and type of the port region: 385</para> 386<itemizedlist> 387<listitem> 388 <para> 389 <filename>name</filename>: A string identifier for this port region. 390 The string is optional and can be empty. Drivers can set it to make it 391 easier for userspace to find a certain port region. 392 </para> 393</listitem> 394<listitem> 395 <para> 396 <filename>start</filename>: The first port of this region. 397 </para> 398</listitem> 399<listitem> 400 <para> 401 <filename>size</filename>: The number of ports in this region. 402 </para> 403</listitem> 404<listitem> 405 <para> 406 <filename>porttype</filename>: A string describing the type of port. 407 </para> 408</listitem> 409</itemizedlist> 410 411 412</sect1> 413</chapter> 414 415<chapter id="custom_kernel_module" xreflabel="Writing your own kernel module"> 416<?dbhtml filename="custom_kernel_module.html"?> 417<title>Writing your own kernel module</title> 418 <para> 419 Please have a look at <filename>uio_cif.c</filename> as an 420 example. The following paragraphs explain the different 421 sections of this file. 422 </para> 423 424<sect1 id="uio_info"> 425<title>struct uio_info</title> 426 <para> 427 This structure tells the framework the details of your driver, 428 Some of the members are required, others are optional. 429 </para> 430 431<itemizedlist> 432<listitem><para> 433<varname>const char *name</varname>: Required. The name of your driver as 434it will appear in sysfs. I recommend using the name of your module for this. 435</para></listitem> 436 437<listitem><para> 438<varname>const char *version</varname>: Required. This string appears in 439<filename>/sys/class/uio/uioX/version</filename>. 440</para></listitem> 441 442<listitem><para> 443<varname>struct uio_mem mem[ MAX_UIO_MAPS ]</varname>: Required if you 444have memory that can be mapped with <function>mmap()</function>. For each 445mapping you need to fill one of the <varname>uio_mem</varname> structures. 446See the description below for details. 447</para></listitem> 448 449<listitem><para> 450<varname>struct uio_port port[ MAX_UIO_PORTS_REGIONS ]</varname>: Required 451if you want to pass information about ioports to userspace. For each port 452region you need to fill one of the <varname>uio_port</varname> structures. 453See the description below for details. 454</para></listitem> 455 456<listitem><para> 457<varname>long irq</varname>: Required. If your hardware generates an 458interrupt, it's your modules task to determine the irq number during 459initialization. If you don't have a hardware generated interrupt but 460want to trigger the interrupt handler in some other way, set 461<varname>irq</varname> to <varname>UIO_IRQ_CUSTOM</varname>. 462If you had no interrupt at all, you could set 463<varname>irq</varname> to <varname>UIO_IRQ_NONE</varname>, though this 464rarely makes sense. 465</para></listitem> 466 467<listitem><para> 468<varname>unsigned long irq_flags</varname>: Required if you've set 469<varname>irq</varname> to a hardware interrupt number. The flags given 470here will be used in the call to <function>request_irq()</function>. 471</para></listitem> 472 473<listitem><para> 474<varname>int (*mmap)(struct uio_info *info, struct vm_area_struct 475*vma)</varname>: Optional. If you need a special 476<function>mmap()</function> function, you can set it here. If this 477pointer is not NULL, your <function>mmap()</function> will be called 478instead of the built-in one. 479</para></listitem> 480 481<listitem><para> 482<varname>int (*open)(struct uio_info *info, struct inode *inode) 483</varname>: Optional. You might want to have your own 484<function>open()</function>, e.g. to enable interrupts only when your 485device is actually used. 486</para></listitem> 487 488<listitem><para> 489<varname>int (*release)(struct uio_info *info, struct inode *inode) 490</varname>: Optional. If you define your own 491<function>open()</function>, you will probably also want a custom 492<function>release()</function> function. 493</para></listitem> 494 495<listitem><para> 496<varname>int (*irqcontrol)(struct uio_info *info, s32 irq_on) 497</varname>: Optional. If you need to be able to enable or disable 498interrupts from userspace by writing to <filename>/dev/uioX</filename>, 499you can implement this function. The parameter <varname>irq_on</varname> 500will be 0 to disable interrupts and 1 to enable them. 501</para></listitem> 502</itemizedlist> 503 504<para> 505Usually, your device will have one or more memory regions that can be mapped 506to user space. For each region, you have to set up a 507<varname>struct uio_mem</varname> in the <varname>mem[]</varname> array. 508Here's a description of the fields of <varname>struct uio_mem</varname>: 509</para> 510 511<itemizedlist> 512<listitem><para> 513<varname>int memtype</varname>: Required if the mapping is used. Set this to 514<varname>UIO_MEM_PHYS</varname> if you you have physical memory on your 515card to be mapped. Use <varname>UIO_MEM_LOGICAL</varname> for logical 516memory (e.g. allocated with <function>kmalloc()</function>). There's also 517<varname>UIO_MEM_VIRTUAL</varname> for virtual memory. 518</para></listitem> 519 520<listitem><para> 521<varname>unsigned long addr</varname>: Required if the mapping is used. 522Fill in the address of your memory block. This address is the one that 523appears in sysfs. 524</para></listitem> 525 526<listitem><para> 527<varname>unsigned long size</varname>: Fill in the size of the 528memory block that <varname>addr</varname> points to. If <varname>size</varname> 529is zero, the mapping is considered unused. Note that you 530<emphasis>must</emphasis> initialize <varname>size</varname> with zero for 531all unused mappings. 532</para></listitem> 533 534<listitem><para> 535<varname>void *internal_addr</varname>: If you have to access this memory 536region from within your kernel module, you will want to map it internally by 537using something like <function>ioremap()</function>. Addresses 538returned by this function cannot be mapped to user space, so you must not 539store it in <varname>addr</varname>. Use <varname>internal_addr</varname> 540instead to remember such an address. 541</para></listitem> 542</itemizedlist> 543 544<para> 545Please do not touch the <varname>kobj</varname> element of 546<varname>struct uio_mem</varname>! It is used by the UIO framework 547to set up sysfs files for this mapping. Simply leave it alone. 548</para> 549 550<para> 551Sometimes, your device can have one or more port regions which can not be 552mapped to userspace. But if there are other possibilities for userspace to 553access these ports, it makes sense to make information about the ports 554available in sysfs. For each region, you have to set up a 555<varname>struct uio_port</varname> in the <varname>port[]</varname> array. 556Here's a description of the fields of <varname>struct uio_port</varname>: 557</para> 558 559<itemizedlist> 560<listitem><para> 561<varname>char *porttype</varname>: Required. Set this to one of the predefined 562constants. Use <varname>UIO_PORT_X86</varname> for the ioports found in x86 563architectures. 564</para></listitem> 565 566<listitem><para> 567<varname>unsigned long start</varname>: Required if the port region is used. 568Fill in the number of the first port of this region. 569</para></listitem> 570 571<listitem><para> 572<varname>unsigned long size</varname>: Fill in the number of ports in this 573region. If <varname>size</varname> is zero, the region is considered unused. 574Note that you <emphasis>must</emphasis> initialize <varname>size</varname> 575with zero for all unused regions. 576</para></listitem> 577</itemizedlist> 578 579<para> 580Please do not touch the <varname>portio</varname> element of 581<varname>struct uio_port</varname>! It is used internally by the UIO 582framework to set up sysfs files for this region. Simply leave it alone. 583</para> 584 585</sect1> 586 587<sect1 id="adding_irq_handler"> 588<title>Adding an interrupt handler</title> 589 <para> 590 What you need to do in your interrupt handler depends on your 591 hardware and on how you want to handle it. You should try to 592 keep the amount of code in your kernel interrupt handler low. 593 If your hardware requires no action that you 594 <emphasis>have</emphasis> to perform after each interrupt, 595 then your handler can be empty.</para> <para>If, on the other 596 hand, your hardware <emphasis>needs</emphasis> some action to 597 be performed after each interrupt, then you 598 <emphasis>must</emphasis> do it in your kernel module. Note 599 that you cannot rely on the userspace part of your driver. Your 600 userspace program can terminate at any time, possibly leaving 601 your hardware in a state where proper interrupt handling is 602 still required. 603 </para> 604 605 <para> 606 There might also be applications where you want to read data 607 from your hardware at each interrupt and buffer it in a piece 608 of kernel memory you've allocated for that purpose. With this 609 technique you could avoid loss of data if your userspace 610 program misses an interrupt. 611 </para> 612 613 <para> 614 A note on shared interrupts: Your driver should support 615 interrupt sharing whenever this is possible. It is possible if 616 and only if your driver can detect whether your hardware has 617 triggered the interrupt or not. This is usually done by looking 618 at an interrupt status register. If your driver sees that the 619 IRQ bit is actually set, it will perform its actions, and the 620 handler returns IRQ_HANDLED. If the driver detects that it was 621 not your hardware that caused the interrupt, it will do nothing 622 and return IRQ_NONE, allowing the kernel to call the next 623 possible interrupt handler. 624 </para> 625 626 <para> 627 If you decide not to support shared interrupts, your card 628 won't work in computers with no free interrupts. As this 629 frequently happens on the PC platform, you can save yourself a 630 lot of trouble by supporting interrupt sharing. 631 </para> 632</sect1> 633 634<sect1 id="using_uio_pdrv"> 635<title>Using uio_pdrv for platform devices</title> 636 <para> 637 In many cases, UIO drivers for platform devices can be handled in a 638 generic way. In the same place where you define your 639 <varname>struct platform_device</varname>, you simply also implement 640 your interrupt handler and fill your 641 <varname>struct uio_info</varname>. A pointer to this 642 <varname>struct uio_info</varname> is then used as 643 <varname>platform_data</varname> for your platform device. 644 </para> 645 <para> 646 You also need to set up an array of <varname>struct resource</varname> 647 containing addresses and sizes of your memory mappings. This 648 information is passed to the driver using the 649 <varname>.resource</varname> and <varname>.num_resources</varname> 650 elements of <varname>struct platform_device</varname>. 651 </para> 652 <para> 653 You now have to set the <varname>.name</varname> element of 654 <varname>struct platform_device</varname> to 655 <varname>"uio_pdrv"</varname> to use the generic UIO platform device 656 driver. This driver will fill the <varname>mem[]</varname> array 657 according to the resources given, and register the device. 658 </para> 659 <para> 660 The advantage of this approach is that you only have to edit a file 661 you need to edit anyway. You do not have to create an extra driver. 662 </para> 663</sect1> 664 665<sect1 id="using_uio_pdrv_genirq"> 666<title>Using uio_pdrv_genirq for platform devices</title> 667 <para> 668 Especially in embedded devices, you frequently find chips where the 669 irq pin is tied to its own dedicated interrupt line. In such cases, 670 where you can be really sure the interrupt is not shared, we can take 671 the concept of <varname>uio_pdrv</varname> one step further and use a 672 generic interrupt handler. That's what 673 <varname>uio_pdrv_genirq</varname> does. 674 </para> 675 <para> 676 The setup for this driver is the same as described above for 677 <varname>uio_pdrv</varname>, except that you do not implement an 678 interrupt handler. The <varname>.handler</varname> element of 679 <varname>struct uio_info</varname> must remain 680 <varname>NULL</varname>. The <varname>.irq_flags</varname> element 681 must not contain <varname>IRQF_SHARED</varname>. 682 </para> 683 <para> 684 You will set the <varname>.name</varname> element of 685 <varname>struct platform_device</varname> to 686 <varname>"uio_pdrv_genirq"</varname> to use this driver. 687 </para> 688 <para> 689 The generic interrupt handler of <varname>uio_pdrv_genirq</varname> 690 will simply disable the interrupt line using 691 <function>disable_irq_nosync()</function>. After doing its work, 692 userspace can reenable the interrupt by writing 0x00000001 to the UIO 693 device file. The driver already implements an 694 <function>irq_control()</function> to make this possible, you must not 695 implement your own. 696 </para> 697 <para> 698 Using <varname>uio_pdrv_genirq</varname> not only saves a few lines of 699 interrupt handler code. You also do not need to know anything about 700 the chip's internal registers to create the kernel part of the driver. 701 All you need to know is the irq number of the pin the chip is 702 connected to. 703 </para> 704</sect1> 705 706</chapter> 707 708<chapter id="userspace_driver" xreflabel="Writing a driver in user space"> 709<?dbhtml filename="userspace_driver.html"?> 710<title>Writing a driver in userspace</title> 711 <para> 712 Once you have a working kernel module for your hardware, you can 713 write the userspace part of your driver. You don't need any special 714 libraries, your driver can be written in any reasonable language, 715 you can use floating point numbers and so on. In short, you can 716 use all the tools and libraries you'd normally use for writing a 717 userspace application. 718 </para> 719 720<sect1 id="getting_uio_information"> 721<title>Getting information about your UIO device</title> 722 <para> 723 Information about all UIO devices is available in sysfs. The 724 first thing you should do in your driver is check 725 <varname>name</varname> and <varname>version</varname> to 726 make sure your talking to the right device and that its kernel 727 driver has the version you expect. 728 </para> 729 <para> 730 You should also make sure that the memory mapping you need 731 exists and has the size you expect. 732 </para> 733 <para> 734 There is a tool called <varname>lsuio</varname> that lists 735 UIO devices and their attributes. It is available here: 736 </para> 737 <para> 738 <ulink url="http://www.osadl.org/projects/downloads/UIO/user/"> 739 http://www.osadl.org/projects/downloads/UIO/user/</ulink> 740 </para> 741 <para> 742 With <varname>lsuio</varname> you can quickly check if your 743 kernel module is loaded and which attributes it exports. 744 Have a look at the manpage for details. 745 </para> 746 <para> 747 The source code of <varname>lsuio</varname> can serve as an 748 example for getting information about an UIO device. 749 The file <filename>uio_helper.c</filename> contains a lot of 750 functions you could use in your userspace driver code. 751 </para> 752</sect1> 753 754<sect1 id="mmap_device_memory"> 755<title>mmap() device memory</title> 756 <para> 757 After you made sure you've got the right device with the 758 memory mappings you need, all you have to do is to call 759 <function>mmap()</function> to map the device's memory 760 to userspace. 761 </para> 762 <para> 763 The parameter <varname>offset</varname> of the 764 <function>mmap()</function> call has a special meaning 765 for UIO devices: It is used to select which mapping of 766 your device you want to map. To map the memory of 767 mapping N, you have to use N times the page size as 768 your offset: 769 </para> 770<programlisting format="linespecific"> 771 offset = N * getpagesize(); 772</programlisting> 773 <para> 774 N starts from zero, so if you've got only one memory 775 range to map, set <varname>offset = 0</varname>. 776 A drawback of this technique is that memory is always 777 mapped beginning with its start address. 778 </para> 779</sect1> 780 781<sect1 id="wait_for_interrupts"> 782<title>Waiting for interrupts</title> 783 <para> 784 After you successfully mapped your devices memory, you 785 can access it like an ordinary array. Usually, you will 786 perform some initialization. After that, your hardware 787 starts working and will generate an interrupt as soon 788 as it's finished, has some data available, or needs your 789 attention because an error occured. 790 </para> 791 <para> 792 <filename>/dev/uioX</filename> is a read-only file. A 793 <function>read()</function> will always block until an 794 interrupt occurs. There is only one legal value for the 795 <varname>count</varname> parameter of 796 <function>read()</function>, and that is the size of a 797 signed 32 bit integer (4). Any other value for 798 <varname>count</varname> causes <function>read()</function> 799 to fail. The signed 32 bit integer read is the interrupt 800 count of your device. If the value is one more than the value 801 you read the last time, everything is OK. If the difference 802 is greater than one, you missed interrupts. 803 </para> 804 <para> 805 You can also use <function>select()</function> on 806 <filename>/dev/uioX</filename>. 807 </para> 808</sect1> 809 810</chapter> 811 812<appendix id="app1"> 813<title>Further information</title> 814<itemizedlist> 815 <listitem><para> 816 <ulink url="http://www.osadl.org"> 817 OSADL homepage.</ulink> 818 </para></listitem> 819 <listitem><para> 820 <ulink url="http://www.linutronix.de"> 821 Linutronix homepage.</ulink> 822 </para></listitem> 823</itemizedlist> 824</appendix> 825 826</book> 827

