O'Reilly logo

Linux Device Drivers, Second Edition by Alessandro Rubini, Jonathan Corbet

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Quick Reference

This chapter introduced the following symbols related to hardware management.

#include <linux/kernel.h> , void barrier(void)

This “software” memory barrier requests the compiler to consider all memory volatile across this instruction.

#include <asm/system.h> , void rmb(void); , void wmb(void); , void mb(void);

Hardware memory barriers. They request the CPU (and the compiler) to checkpoint all memory reads, writes, or both, across this instruction.

#include <asm/io.h> , unsigned inb(unsigned port); , void outb(unsigned char byte, unsigned port); , unsigned inw(unsigned port); , void outw(unsigned short word, unsigned port); , unsigned inl(unsigned port); , void outl(unsigned doubleword, unsigned port);

These functions are used to read and write I/O ports. They can also be called by user-space programs, provided they have the right privileges to access ports.

unsigned inb_p(unsigned port); , ...

The statement SLOW_DOWN_IO is sometimes needed to deal with slow ISA boards on the x86 platform. If a small delay is needed after an I/O operation, you can use the six pausing counterparts of the functions introduced in the previous entry; these pausing functions have names ending in _p.

void insb(unsigned port, void *addr, unsigned long count); , void outsb(unsigned port, void *addr, unsigned long count); , void insw(unsigned port, void *addr, unsigned long count); , void outsw(unsigned port, void *addr, unsigned long count); , void insl(unsigned port, void *addr, unsigned long count); , void outsl(unsigned port, void *addr, unsigned long count);

The “string functions” are optimized to transfer data from an input port to a region of memory, or the other way around. Such transfers are performed by reading or writing the same port count times.

#include <linux/ioport.h> , int check_region(unsigned long start, unsigned long len); , void request_region(unsigned long start, unsigned long len, char *name); , void release_region(unsigned long start, unsigned long len);

Resource allocators for I/O ports. The check function returns 0 for success and less than 0 in case of error.

int check_mem_region(unsigned long start, unsigned long len); , void request_mem_region(unsigned long start, unsigned long len, char *name); , void release_mem_region(unsigned long start, unsigned long len);

These functions handle resource allocation for memory regions.

#include <asm/io.h> , void *ioremap(unsigned long phys_addr, unsigned long size); , void *ioremap_nocache(unsigned long phys_addr, unsigned long size); , void iounmap(void *virt_addr);

ioremap remaps a physical address range into the processor’s virtual address space, making it available to the kernel. iounmap frees the mapping when it is no longer needed.

#include <linux/io.h> , unsigned readb(address); , unsigned readw(address); , unsigned readl(address); , void writeb(unsigned value, address); , void writew(unsigned value, address); , void writel(unsigned value, address); , memset_io(address, value, count); , memcpy_fromio(dest, source, nbytes); , memcpy_toio(dest, source, nbytes);

These functions are used to access I/O memory regions, either low ISA memory or high PCI buffers.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required