summaryrefslogtreecommitdiff
path: root/kernel-devel
diff options
context:
space:
mode:
authorHans J. Koch <hjk@linutronix.de>2009-06-22 01:24:09 +0200
committerHans J. Koch <hjk@linutronix.de>2009-06-22 01:24:09 +0200
commit719085c3dc98ab3df272476e16e983e4a16fe14b (patch)
tree7ad3d17369e19b0deb47be9cbb4a75bcd39acad0 /kernel-devel
parentf45f06860f0e60acd5ce3297581288f9b13f884a (diff)
Added kernel-devel/uio-driver/ presentation (English version)
Diffstat (limited to 'kernel-devel')
-rw-r--r--kernel-devel/uio-driver/Makefile10
-rw-r--r--kernel-devel/uio-driver/images/greg-all-hardware.jpgbin0 -> 76025 bytes
-rw-r--r--kernel-devel/uio-driver/images/greg-kernel-org.jpgbin0 -> 75068 bytes
-rw-r--r--kernel-devel/uio-driver/images/hjk-desperate.jpgbin0 -> 122993 bytes
-rw-r--r--kernel-devel/uio-driver/images/ioctl-vs-uio.pngbin0 -> 106503 bytes
-rw-r--r--kernel-devel/uio-driver/images/konventioneller-treiber.pngbin0 -> 104184 bytes
-rw-r--r--kernel-devel/uio-driver/images/uio-treiber.pngbin0 -> 126807 bytes
-rw-r--r--kernel-devel/uio-driver/pres_uio-driver_en.tex302
8 files changed, 312 insertions, 0 deletions
diff --git a/kernel-devel/uio-driver/Makefile b/kernel-devel/uio-driver/Makefile
new file mode 100644
index 0000000..d212291
--- /dev/null
+++ b/kernel-devel/uio-driver/Makefile
@@ -0,0 +1,10 @@
+all:
+ pdflatex pres_uio-driver_de.tex
+ pdflatex pres_uio-driver_en.tex
+ pdflatex hints_uio-driver_de.tex
+ pdflatex handout_uio-driver_de.tex
+ pdflatex handout_uio-driver_de.tex
+
+clean:
+ rm -f *.aux *.log *.pdf *.log *.snm *.toc *.vrb *.nav *.out
+
diff --git a/kernel-devel/uio-driver/images/greg-all-hardware.jpg b/kernel-devel/uio-driver/images/greg-all-hardware.jpg
new file mode 100644
index 0000000..f7ab989
--- /dev/null
+++ b/kernel-devel/uio-driver/images/greg-all-hardware.jpg
Binary files differ
diff --git a/kernel-devel/uio-driver/images/greg-kernel-org.jpg b/kernel-devel/uio-driver/images/greg-kernel-org.jpg
new file mode 100644
index 0000000..dbfb915
--- /dev/null
+++ b/kernel-devel/uio-driver/images/greg-kernel-org.jpg
Binary files differ
diff --git a/kernel-devel/uio-driver/images/hjk-desperate.jpg b/kernel-devel/uio-driver/images/hjk-desperate.jpg
new file mode 100644
index 0000000..740f574
--- /dev/null
+++ b/kernel-devel/uio-driver/images/hjk-desperate.jpg
Binary files differ
diff --git a/kernel-devel/uio-driver/images/ioctl-vs-uio.png b/kernel-devel/uio-driver/images/ioctl-vs-uio.png
new file mode 100644
index 0000000..8536934
--- /dev/null
+++ b/kernel-devel/uio-driver/images/ioctl-vs-uio.png
Binary files differ
diff --git a/kernel-devel/uio-driver/images/konventioneller-treiber.png b/kernel-devel/uio-driver/images/konventioneller-treiber.png
new file mode 100644
index 0000000..bea54da
--- /dev/null
+++ b/kernel-devel/uio-driver/images/konventioneller-treiber.png
Binary files differ
diff --git a/kernel-devel/uio-driver/images/uio-treiber.png b/kernel-devel/uio-driver/images/uio-treiber.png
new file mode 100644
index 0000000..caa2152
--- /dev/null
+++ b/kernel-devel/uio-driver/images/uio-treiber.png
Binary files differ
diff --git a/kernel-devel/uio-driver/pres_uio-driver_en.tex b/kernel-devel/uio-driver/pres_uio-driver_en.tex
new file mode 100644
index 0000000..8468894
--- /dev/null
+++ b/kernel-devel/uio-driver/pres_uio-driver_en.tex
@@ -0,0 +1,302 @@
+\documentclass{beamer}
+\usetheme{linutronix}
+\usepackage{german}
+\usepackage[utf8]{inputenc}
+\usepackage{pgf}
+\usepackage{graphicx}
+
+\title{The Userspace I/O Framework (UIO)}
+\author{Hans-Jürgen Koch}
+\institute{Linutronix GmbH}
+
+\begin{document}
+
+\maketitle
+
+% ----- Slide "Desperate programmer" ------------------
+\begin{frame}
+\includegraphics[width=11cm]{images/hjk-desperate.jpg}
+\end{frame}
+
+% ----- Slide "Linux device drivers" ------------------
+\begin{frame}
+\frametitle{Linux device drivers}
+\pause
+\begin{itemize}
+\item Standard devices
+\pause
+\item Non-standard devices
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Standard devices" -----------------------
+\begin{frame}
+\frametitle{Standard devices}
+\pause
+\begin{itemize}
+\item Handled by a kernel subsystem (USB, networking...)
+\pause
+\item Hardware specific part relatively small
+\pause
+\item Examples of similar drivers available
+\pause
+\item Can probably be included in mainline kernel
+\pause
+\begin{block}{Standard devices should not be handled by UIO !}
+\end{block}
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Problematic devices" -------------------
+\begin{frame}
+\frametitle{Problematic devices}
+\pause
+\begin{itemize}
+\item Doesn't fit into a standard kernel subsystem
+\pause
+\item Almost everything is hardware specific
+\pause
+\item Driver becomes large, no similar example drivers
+\pause
+\item Driver often invents its own ioctl based API
+\pause
+\item Will probably not be included in mainline kernel
+\pause
+\begin{block}{Drivers for such devices are often buggy and hard to maintain !}
+\end{block}
+\end{itemize}
+\end{frame}
+
+% ----- Slide "In-kernel driver" ------------------
+\begin{frame}
+\includegraphics[width=11cm]{images/konventioneller-treiber.png}
+\end{frame}
+
+% ----- Slide "UIO driver" ------------------
+\begin{frame}
+\includegraphics[width=11cm]{images/uio-treiber.png}
+\end{frame}
+
+% ----- Slide "How UIO works" --------------------------
+\begin{frame}
+\frametitle{How UIO works}
+\pause
+\begin{itemize}
+\item Device memory can be mapped to userspace
+\pause
+\item All data exchange is done through this memory
+\pause
+\item All device control is done through this memory
+\pause
+\item Interrupts are acknowledged in the kernel...
+\pause
+\item ...and then handled in userspace
+\pause
+\begin{block}{A small kernel module is still needed}
+\end{block}
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Kernel: interrupt handler" --------------------------
+\begin{frame}[fragile]
+\frametitle{Kernel: interrupt handler}
+\begin{verbatim}
+irqreturn_t my_handler(int irq, struct uio_info *dev_info)
+{
+ if (IRQ is not caused by my hardware)
+ return IRQ_NONE;
+
+ /* Disable interrupt */
+ (Perform some register access to silence the IRQ line)
+
+ return IRQ_HANDLED;
+}
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Kernel: probe() function" --------------------------
+\begin{frame}[fragile]
+\frametitle{Kernel: probe() function}
+\begin{verbatim}
+int pci_probe(struct pci_dev *dev,
+ const struct pci_device_id *id)
+{
+ ...
+ allocate and fill struct uio_info
+ ...
+ call uio_register_device()
+}
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Kernel: struct uio_info" --------------------------
+\begin{frame}[fragile]
+\frametitle{Kernel: struct uio\_info}
+\begin{verbatim}
+struct uio_info {
+ struct uio_device *uio_dev;
+ char *name;
+ char *version;
+ struct uio_mem mem[MAX_UIO_MAPS];
+ long irq;
+ unsigned long irq_flags;
+ void *priv;
+ irqreturn_t (*handler)(int irq, struct uio_info *dev_info);
+ int (*mmap)(struct uio_info *info, struct vm_area_struct *vma);
+ int (*open)(struct uio_info *info, struct inode *inode);
+ int (*release)(struct uio_info *info, struct inode *inode);
+};
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Kernel: struct uio_mem" --------------------------
+\begin{frame}[fragile]
+\frametitle{Kernel: struct uio\_mem}
+\begin{verbatim}
+struct uio_mem {
+ unsigned long addr;
+ unsigned long size;
+ int memtype;
+ void __iomem *internal_addr;
+ struct uio_map *map;
+};
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Userspace part of driver" --------------
+\begin{frame}
+\frametitle{Userspace: Overview}
+\pause
+\begin{itemize}
+\item Find device in sysfs (/sys/class/uio/...)
+\pause
+\item Get device information from sysfs
+\pause
+\item Open /dev/uioX
+\pause
+\item Use mmap() to get a pointer to the devices's memory
+\pause
+\item Initialize device, enable interrupt generation
+\pause
+\item Perform a blocking read() to wait for interrupts
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Hello UIO world" --------------
+\begin{frame}[fragile]
+\frametitle{Hello UIO world}
+\pause
+\begin{verbatim}
+int32_t irq_cnt;
+int fd = open("/dev/uio0", O_RDWR);
+u16 *mem = mmap(..., n*getpagesize());
+mem[...] = ...
+while (read(fd, &irq_cnt, 4)) {
+ printf("irq count = %d\n", irq_cnt);
+}
+\end{verbatim}
+\end{frame}
+
+% ----- Slide "Performance considerations" --------------
+\begin{frame}
+\frametitle{Performance considerations}
+\pause
+\begin{itemize}
+\item Interrupt latency
+\pause
+\item Memory/register access
+\end{itemize}
+\end{frame}
+
+% ----- Slide "ioctl vs. UIO" ------------------
+\begin{frame}
+\includegraphics[width=10cm]{images/ioctl-vs-uio.png}
+\end{frame}
+
+% ----- Slide "Publish your driver!" --------------
+\begin{frame}
+\frametitle{Publish your driver!}
+\pause
+\begin{itemize}
+\item Get rid of maintenance work!
+\pause
+\item Send your patch to the UIO maintainers
+\pause
+\item Cc: linux-kernel@vger.kernel.org
+\pause
+\item Publish your userspace code, if possible
+\pause
+\item Make it LGPL, if possible
+\pause
+\item An open driver helps selling your hardware!
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Greg: Support all hardware on earth" ---
+\begin{frame}
+\includegraphics[width=11cm]{images/greg-all-hardware.jpg}
+\end{frame}
+
+% ----- Slide "Greg: All drivers in kernel.org tree" --
+\begin{frame}
+\includegraphics[width=11cm]{images/greg-kernel-org.jpg}
+\end{frame}
+
+% ----- Slide "Legal issues" --------------------------
+\begin{frame}
+\frametitle{Legal issues}
+\pause
+\begin{itemize}
+\item Userspace code can be under any licence
+\pause
+\item Kernel module MUST be GPL
+\pause
+\item Avoid trickery and gray areas
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Tools" --------------------------
+\begin{frame}
+\frametitle{Tools}
+\pause
+\begin{itemize}
+\item lsuio
+\pause
+\item TODO: libuio (nearly ready)
+\end{itemize}
+\end{frame}
+
+% ----- Slide "OSADL" --------------------------
+\begin{frame}
+\frametitle{OSADL}
+\pause
+\begin{itemize}
+\item Open Source Automation Development Lab
+\pause
+\item http://www.osadl.org
+\pause
+\item Hosts some UIO code
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Future" --------------------------
+\begin{frame}
+\frametitle{Future}
+\pause
+\begin{itemize}
+\item DMA support
+\pause
+\item get UIO tools and libuio into Linux Distributions
+\end{itemize}
+\end{frame}
+
+% ----- Slide "Thanks for listening!" ----------
+\begin{frame}
+\frametitle{Thanks for listening!}
+\pause
+\begin{itemize}
+\item Questions ?
+\end{itemize}
+\end{frame}
+
+\end{document}