<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>EmbLogic &#187; spatlou</title>
	<atom:link href="https://www.emblogic.com/blog/author/spatlou/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.emblogic.com/blog</link>
	<description>Embedded System and ARM Training</description>
	<lastBuildDate>Tue, 03 Mar 2020 13:00:06 +0000</lastBuildDate>
	<language>en-US</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.9.1</generator>
	<item>
		<title>Character Device Driver &#8211; Capabilities. Restricted Permissions</title>
		<link>https://www.emblogic.com/blog/12/character-device-driver-capabilities-restricted-permissions/</link>
		<comments>https://www.emblogic.com/blog/12/character-device-driver-capabilities-restricted-permissions/#comments</comments>
		<pubDate>Wed, 24 Dec 2014 07:04:40 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=11956</guid>
		<description><![CDATA[Access to a device is controlled by the permissions on the device file(s), and the driver is not normally involved in permissions checking. There are situations, however, where any user is granted read/write permission on the device, but some control &#8230; <a href="https://www.emblogic.com/blog/12/character-device-driver-capabilities-restricted-permissions/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p align="JUSTIFY">Access to a device is controlled by the permissions on the device file(s), and the driver is not normally involved in permissions checking. There are situations, however, where any user is granted read/write permission on the device, but some control operations should still be denied. I some cases the driver must perform additional checks to be sure that the user is capable of performing the requested operation.</p>
<p align="JUSTIFY">Unix systems have traditionally restricted privileged operations to the superuser account. This meant that privilege was an all-or- othing thing—the superuser can do absolutely anything, but all other users are highly restricted. The Linux kernel provides a more flexible system called capabilities. A capability-based system leaves the all-or-nothing mode behind and breaks down privileged operations into separate subgroups. In this way, a particular user (or program) can be empowered to perform a specific privileged operation without giving away the ability to perform other, unrelated operations. The kernel uses capabilities exclusively for permissions management and exports two system calls capget and capset, to allow them to be managed from user space.</p>
<p align="JUSTIFY">The full set of capabilities can be found in &lt;linux/capability.h&gt;. These are the only capabilities known to the system; it is not possible for driver authors or system administrators to define new ones without modifying the kernel source. A subset of those capabilities that might be of interest to device driver writers includes the following:</p>
<p align="JUSTIFY">CAP_DAC_OVERRIDE</p>
<p align="JUSTIFY">The ability to override access restrictions (data access control, or DAC) on files and directories.</p>
<p align="JUSTIFY">CAP_NET_ADMIN</p>
<p align="JUSTIFY">The ability to perform network administration tasks, including those that affect network interfaces.</p>
<p align="JUSTIFY">CAP_SYS_MODULE</p>
<p align="JUSTIFY">The ability to load or remove kernel modules.</p>
<p align="JUSTIFY">CAP_SYS_RAWIO</p>
<p align="JUSTIFY">The ability to perform “raw” I/O operations. Examples include accessing device ports or communicating directly with USB devices.</p>
<p align="JUSTIFY">CAP_SYS_ADMIN</p>
<p align="JUSTIFY">A catch-all capability that provides access to many system administration operations.</p>
<p align="JUSTIFY">CAP_SYS_TTY_CONFIG</p>
<p align="JUSTIFY">The ability to perform tty configuration tasks.</p>
<p align="JUSTIFY">Before performing a privileged operation, a device driver should check that the calling process has the appropriate capability; failure to do so could result user processes performing unauthorized operations with bad results on system stability or security. Capability checks are performed with the capable function (defined in &lt;linux/sched.h&gt;):</p>
<p align="JUSTIFY">int capable(int capability);</p>
<p align="JUSTIFY">In the scull sample driver, any user is allowed to query the quantum and quantum set sizes. Only privileged users, however, may change those values, since inappropriate values could badly affect system performance. When needed, the scull implementation of ioctl checks a user’s privilege level as follows:</p>
<p align="JUSTIFY">if (! capable (CAP_SYS_ADMIN))</p>
<p align="JUSTIFY">return -EPERM;</p>
<p align="JUSTIFY">In the absence of a more specific capability for this task, CAP_SYS_ADMIN was chosen for this test.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/12/character-device-driver-capabilities-restricted-permissions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Character Device Driver &#8211; Blocking IO using wait queues</title>
		<link>https://www.emblogic.com/blog/12/character-device-driver-blocking-io-using-wait-queues/</link>
		<comments>https://www.emblogic.com/blog/12/character-device-driver-blocking-io-using-wait-queues/#comments</comments>
		<pubDate>Wed, 24 Dec 2014 06:59:42 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=11953</guid>
		<description><![CDATA[How does a driver respond if it cannot immediately satisfy the request? A call to read may come when no data is available, but more is expected in the future. Or a process could attempt to write, but your device &#8230; <a href="https://www.emblogic.com/blog/12/character-device-driver-blocking-io-using-wait-queues/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>How does a driver respond if it cannot immediately satisfy the request? A call to read may come when no data is available, but more is expected in the future. Or a process could attempt to write, but your device is not ready to accept the data, because your output buffer is full. The calling process usually does not care about such issues; the programmer simply expects to call read or write and have the call return after the necessary work has been done. So, in such cases, your driver should (by default) block the process, putting it to sleep until the request can proceed.</p>
<p align="JUSTIFY">When a process is put to sleep, it is marked as being in a special state and removed from the scheduler’s run queue. Until something comes along to change that state, the process will not be scheduled on any CPU and, therefore, will not run. A sleeping process has been shunted off to the side of the system, waiting for some future event to happen.</p>
<p align="JUSTIFY">Causing a process to sleep is an easy thing for a Linux device driver to do. There are, however, a couple of rules that you must keep in mind to be able to code sleeps in a safe manner.</p>
<p align="JUSTIFY">The first of these rules is: never sleep when you are running in an atomic context. An atomic context is simply a state where multiple steps must be performed without any sort of concurrent access. What that means, with regard to sleeping, is that your driver cannot sleep while holding a spinlock, seqlock, or RCU lock. You also cannot sleep if you have disabled interrupts. It is legal to sleep while holding a semaphore, but you should look very carefully at any code that does so. If code sleeps while holding a semaphore, any other thread waiting for that semaphore also sleeps. So any sleeps that happen while holding semaphores should be short, and you should convince yourself that, by holding the semaphore, you are not blocking the process that will eventually wake you up.</p>
<p align="JUSTIFY">Another thing to remember with sleeping is that, when you wake up, you never know how long your process may have been out of the CPU or what may have changed in the mean time. You also do not usually know if another process may have been sleeping for the same event; that process may wake before you and grab whatever resource you were waiting for. The end result is that you can make no assumptions about the state of the system after you wake up, and you must check to ensure that the condition you were waiting for is, indeed, true.</p>
<p align="JUSTIFY">One other relevant point, of course, is that your process cannot sleep unless it is assured that somebody else, somewhere, will wake it up. The code doing the awakening must also be able to find your process to be able to do its job. Making sure that a wakeup happens is a matter of thinking through your code and knowing, for each sleep, exactly what series of events will bring that sleep to an end. Making it possible for your sleeping process to be found is, instead, accomplished through a data structure called a wait queue. A wait queue is just what it sounds like: a list of processes, all waiting for a specific event.</p>
<p align="JUSTIFY">In Linux, a wait queue is managed by means of a “wait queue head,” a structure of type wait_queue_head_t, which is defined in &lt;linux/wait.h&gt;. A wait queue head can be defined and initialized statically with:</p>
<p align="JUSTIFY">DECLARE_WAIT_QUEUE_HEAD(name);</p>
<p align="JUSTIFY">or dynamicly as follows:</p>
<p align="JUSTIFY">Wait_queue_head_t my_queue;</p>
<p align="JUSTIFY">init_waitqueue_head(&amp;my_queue);</p>
<p align="JUSTIFY">When a process sleeps, it does so in expectation that some condition will become true in the future. As we noted before, any process that sleeps must check to be sure that the condition it was waiting for is really true when it wakes up again. The simplest way of sleeping in the Linux kernel is a macro called wait_event, it combines handling the details of sleeping with a check on the condition a process is waiting for. The forms of wait_event are:</p>
<p align="JUSTIFY">wait_event(queue, condition)</p>
<p align="JUSTIFY">wait_event_interruptible(queue, condition)</p>
<p align="JUSTIFY">wait_event_timeout(queue, condition, timeout)</p>
<p align="JUSTIFY">wait_event_interruptible_timeout(queue, condition, timeout)</p>
<p align="JUSTIFY">In all of the above forms, queue is the wait queue head to use. Notice that it is passed “by value.” The condition is an arbitrary boolean expression that is evaluated by the macro before and after sleeping; until condition evaluates to a true value, the process continues to sleep. Note that condition may be evaluated an arbitrary number of times, so it should not have any side effects.</p>
<p align="JUSTIFY">If you use wait_event, your process is put into an uninterruptible sleep which, as we have mentioned before, is usually not what you want. The preferred alternative is wait_event_interruptible, which can be interrupted by signals. This version returns an integer value that you should check; a nonzero value means your sleep was interrupted by some sort of signal, and your driver should probably return -ERESTARTSYS.</p>
<p align="JUSTIFY">The final versions (wait_event_timeout and wait_event_interruptible_timeout) wait for a limited time; after that time period expires, the macros return with a value of 0 regardless of how condition evaluates.</p>
<p align="JUSTIFY">The other half of the picture, of course, is waking up. Some other thread of execution has to perform the wakeup for you, since your process is, of course, asleep. The basic function that wakes up sleeping processes is called wake_up. It comes in several forms:</p>
<p align="JUSTIFY">void wake_up(wait_queue_head_t *queue);</p>
<p align="JUSTIFY">void wake_up_interruptible(wait_queue_head_t *queue);</p>
<p align="JUSTIFY">wake_up wakes up all processes waiting on the given queue. The other form (wake_up_interruptible) restricts itself to processes performing an interruptible sleep. In general, the two are indistinguishable. in practice, the convention is to use wake_up if you are using wait_event and wake_up_interruptible if you use wait_event_interruptible.</p>
<p align="JUSTIFY">We now know enough to look at a simple example of sleeping and waking up. In the sample source, you can find a module called sleepy. It implements a device with simple behavior: any process that attempts to read from the device is put to sleep.</p>
<p align="JUSTIFY">Whenever a process writes to the device, all sleeping processes are awakened. This behavior is implemented with the following read and write methods:</p>
<p align="JUSTIFY">static DECLARE_WAIT_QUEUE_HEAD(wq);</p>
<p align="JUSTIFY">static int flag = 0;</p>
<p align="JUSTIFY">ssize_t sleepy_read (struct file *filp, char __user *buf, size_t count, loff_t *pos)</p>
<p align="JUSTIFY"><span style="font-family: 'Century Schoolbook L', serif;"><span style="font-size: x-large;">{</span></span></p>
<p align="JUSTIFY">printk(KERN_DEBUG &#8220;process %i (%s) going to sleep\n&#8221;,</p>
<p align="JUSTIFY">current-&gt;pid, current-&gt;comm);</p>
<p align="JUSTIFY">wait_event_interruptible(wq, flag != 0);</p>
<p align="JUSTIFY">flag = 0;</p>
<p align="JUSTIFY">printk(KERN_DEBUG &#8220;awoken %i (%s)\n&#8221;, current-&gt;pid, current-&gt;comm);</p>
<p align="JUSTIFY">return 0; /* EOF */</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY">ssize_t sleepy_write (struct file *filp, const char __user *buf, size_t count, loff_t *pos)</p>
<p align="JUSTIFY">{</p>
<p align="JUSTIFY">printk(KERN_DEBUG &#8220;process %i (%s) awakening the readers&#8230;\n&#8221;,</p>
<p align="JUSTIFY">current-&gt;pid, current-&gt;comm);</p>
<p align="JUSTIFY">flag = 1;</p>
<p align="JUSTIFY">wake_up_interruptible(&amp;wq);</p>
<p align="JUSTIFY">return count; /* succeed, to avoid retrial */</p>
<p align="JUSTIFY">}</p>
<p align="JUSTIFY">Note the use of the flag variable in this example. Since wait_event_interruptible checks for a condition that must become true, we use flag to create that condition.</p>
<p align="JUSTIFY">It is interesting to consider what happens if two processes are waiting when sleepy_write is called. Since sleepy_read resets flag to 0 once it wakes up, you might think that the second process to wake up would immediately go back to sleep. On a single- rocessor system, that is almost always what happens. But it is important to understand why you cannot count on that behavior. The wake_up_interruptible call will cause both sleeping processes to wake up. It is entirely possible that they will both note that flag is nonzero before either has the opportunity to reset it. For this trivial module, this race condition is unimportant. In a real driver, this kind of race can create rare crashes that are difficult to diagnose. If correct operation required that exactly one process see the nonzero value, it would have to be tested in an atomic manner.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/12/character-device-driver-blocking-io-using-wait-queues/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Atomic Variables in Device Drivers</title>
		<link>https://www.emblogic.com/blog/12/atomic-variables-in-device-drivers/</link>
		<comments>https://www.emblogic.com/blog/12/atomic-variables-in-device-drivers/#comments</comments>
		<pubDate>Tue, 23 Dec 2014 14:30:45 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Character Driver]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=11947</guid>
		<description><![CDATA[Sometimes, a shared resource is a simple integer value. Suppose your driver maintains a shared variable shrd that tells how many device operations are currently outstanding. Normally, even a simple operation such as: sgrd++; would require locking. Some processors might &#8230; <a href="https://www.emblogic.com/blog/12/atomic-variables-in-device-drivers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p align="JUSTIFY"><span style="color: #333333;">Sometimes, a shared resource is a simple integer value. Suppose your driver maintains a shared variable shrd that tells how many device operations are currently outstanding. Normally, even a simple operation such as: sgrd++; would require locking. Some processors might perform that sort of increment in an atomic manner, but you can’t count on it. But a full locking regime seems like overhead for a simple integer value. For cases like this, the kernel provides an atomic integer type called atomic_t, defined in &lt;asm/atomic.h&gt;.</span></p>
<p align="JUSTIFY"><span style="color: #333333;">An atomic_t holds an int value on all supported architectures. Because of the way this type works on some processors, however, the full integer range may not be available; thus, you should not count on an atomic_t holding more than 24 bits. The following operations are defined for the type and are guaranteed to be atomic with respect to all processors of an SMP computer. The operations are very fast, because they compile to a single machine instruction whenever possible.</span></p>
<p align="JUSTIFY"><span style="color: #333333;">void atomic_set(atomic_t *v, int i);</span></p>
<p align="JUSTIFY"><span style="color: #333333;">atomic_t v = ATOMIC_INIT(0);</span></p>
<p align="JUSTIFY"><span style="color: #333333;">Set the atomic variable v to the integer value i. You can also initialize atomic values at compile time with the ATOMIC_INIT macro.</span></p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/12/atomic-variables-in-device-drivers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Log file for nested structures</title>
		<link>https://www.emblogic.com/blog/12/log-file-for-nested-structures/</link>
		<comments>https://www.emblogic.com/blog/12/log-file-for-nested-structures/#comments</comments>
		<pubDate>Thu, 12 Dec 2013 05:41:25 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Data Structures with C]]></category>

		<guid isPermaLink="false">http://www.emblogic.com/blog/?p=7716</guid>
		<description><![CDATA[RCS file: dist_add.c,v Working file: dist_add.c head: 1.4 branch: locks: strict access list: symbolic names: keyword substitution: kv total revisions: 4; selected revisions: 4 description: This is the base file for adding distances using structures. ---------------------------- revision 1.4 date: 2013/12/12 &#8230; <a href="https://www.emblogic.com/blog/12/log-file-for-nested-structures/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<pre>RCS file: dist_add.c,v
Working file: dist_add.c
head: 1.4
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 4;	selected revisions: 4
description:
This is the base file for adding distances using structures.
----------------------------
revision 1.4
date: 2013/12/12 05:34:44;  author: root;  state: Exp;  lines: +13 -0
Modified the struct distance, added aa new element struct mks *.
allocated space for mks for one struct distance d1.
----------------------------
revision 1.3
date: 2013/12/12 05:26:18;  author: root;  state: Exp;  lines: +20 -8
Total usage of pointers for adding distances using structures.
----------------------------
revision 1.2
date: 2013/12/12 05:10:18;  author: root;  state: Exp;  lines: +14 -7
used structure pointer for adding distances.
Also used malloc () for allocating memory.
Inckuded stdlib.h for supporting malloc().
----------------------------
revision 1.1
date: 2013/12/12 04:31:18;  author: root;  state: Exp;
Initial revision
=============================================================================</pre>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/12/log-file-for-nested-structures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PC16550D UART with FIFO</title>
		<link>https://www.emblogic.com/blog/03/pc16550d-uart-with-fifo/</link>
		<comments>https://www.emblogic.com/blog/03/pc16550d-uart-with-fifo/#comments</comments>
		<pubDate>Sat, 09 Mar 2013 10:19:45 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Serial Port Driver]]></category>

		<guid isPermaLink="false">http://emblogic.org/blog/?p=6291</guid>
		<description><![CDATA[The PC16550D is an improved version of he original 16450 USRT functionally identical to 16450 on powerup (Character Mode). The PC16550D can be put into an alternative mode, (FIFO mode) to relieve the CPU of  excessive software overhead.]]></description>
				<content:encoded><![CDATA[<p>The PC16550D is an improved version of he original 16450 USRT functionally identical to 16450 on powerup (Character Mode). The PC16550D can be put into an alternative mode, (FIFO mode) to relieve the CPU of  excessive software overhead.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/03/pc16550d-uart-with-fifo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Project 04: Client-Server using Threads and Sockets</title>
		<link>https://www.emblogic.com/blog/11/project-04-client-server-using-threads-and-sockets/</link>
		<comments>https://www.emblogic.com/blog/11/project-04-client-server-using-threads-and-sockets/#comments</comments>
		<pubDate>Fri, 02 Nov 2012 17:01:17 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Project 04: FTP based Client Server using Threads and Sockets]]></category>

		<guid isPermaLink="false">http://emblogic.org/blog/?p=5636</guid>
		<description><![CDATA[Threads are &#8220;light weight processes&#8221; (LWPs). The process has five fundamental parts: code (&#8220;text&#8221;), data (VM), stack, file I/O, and signal tables. &#8220;Heavy-weight processes&#8221; (HWPs) have a significant amount of overhead when switching: all the tables have to be flushed &#8230; <a href="https://www.emblogic.com/blog/11/project-04-client-server-using-threads-and-sockets/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Threads are &#8220;light weight processes&#8221; (LWPs). The process has five fundamental parts: code (&#8220;text&#8221;), data (VM), stack, file I/O, and signal tables. &#8220;Heavy-weight processes&#8221; (HWPs) have a significant amount of overhead when switching: all the tables have to be flushed from the processor for each task switch. Also, the only way to achieve shared information between HWPs is through pipes and &#8220;shared memory&#8221;. If a HWP spawns a child HWP using fork(), the only part that is shared is the text.</p>
<p><a href="http://emblogic.org/blog/11/project-04-client-server-using-threads-and-sockets/sockets-9/" rel="attachment wp-att-5637"><img class="alignright size-medium wp-image-5637" title="sockets" src="http://emblogic.org/blog/wp-content/uploads/2012/11/sockets-300x123.jpg" alt="" width="300" height="123" /></a> Sockets are interfaces that can &#8220;plug into&#8221; each other over a network. Once so &#8220;plugged in&#8221;, the programs so connected communicate.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/11/project-04-client-server-using-threads-and-sockets/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Project 05: Character Device Driver</title>
		<link>https://www.emblogic.com/blog/11/project-05-character-device-driver/</link>
		<comments>https://www.emblogic.com/blog/11/project-05-character-device-driver/#comments</comments>
		<pubDate>Fri, 02 Nov 2012 16:52:39 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Character Driver]]></category>
		<category><![CDATA[char driver]]></category>
		<category><![CDATA[Character Device Driver]]></category>
		<category><![CDATA[Device Drivers]]></category>
		<category><![CDATA[EmbeddedTraining]]></category>
		<category><![CDATA[EmbLogic]]></category>
		<category><![CDATA[Linux Device Drivers Training]]></category>

		<guid isPermaLink="false">http://emblogic.org/blog/?p=5628</guid>
		<description><![CDATA[Makefile for a basic kernel module

obj-m += hello-1.o

all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean <a href="https://www.emblogic.com/blog/11/project-05-character-device-driver/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Modules are pieces of code that can be loaded and unloaded into the kernel upon demand. They extend the functionality of the kernel without the need to reboot the<a href="http://emblogic.org/blog/11/project-05-character-device-driver/cdd2/" rel="attachment wp-att-5630"><img class="alignright size-medium wp-image-5630" title="cdd2" src="http://emblogic.org/blog/wp-content/uploads/2012/11/cdd2-e1351875063299-300x108.jpg" alt="" width="300" height="108" /></a> system. For example, one type of module is the device driver, which allows the kernel to access hardware connected to the system. Without modules, we would have to build monolithic kernels and add new functionality directly into the kernel image. Besides having larger kernels, this has the disadvantage of requiring us to rebuild and reboot the kernel every time we want new functionality.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/11/project-05-character-device-driver/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Writing device drivers in Linux</title>
		<link>https://www.emblogic.com/blog/03/writing-device-drivers-in-linux/</link>
		<comments>https://www.emblogic.com/blog/03/writing-device-drivers-in-linux/#comments</comments>
		<pubDate>Thu, 01 Mar 2012 11:20:21 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Character Driver]]></category>

		<guid isPermaLink="false">http://emblogic.org/blog/?p=2034</guid>
		<description><![CDATA[Pre-requisites In order to develop Linux device drivers, it is necessary to have an understanding of the following: C programming. Some in-depth knowledge of C programming is needed, like pointer usage, bit manipulating functions, etc. Microprocessor programming. It is necessary &#8230; <a href="https://www.emblogic.com/blog/03/writing-device-drivers-in-linux/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<h1>Pre-requisites</h1>
<p>In order to develop Linux device drivers, it is necessary to have an understanding of the following:</p>
<ul>
<li><strong>C programming</strong>. Some in-depth knowledge of C programming is needed, like pointer usage, bit manipulating functions, etc.</li>
<li><strong>Microprocessor programming</strong>. It is necessary to know how microcomputers work internally: memory addressing, interrupts, etc. All of these concepts should be familiar to an assembler programmer.</li>
</ul>
<p>There are several different devices in Linux. For simplicity, this brief tutorial will only cover type <code>char</code> devices loaded as modules. Kernel 2.6.x will be used (in particular, kernel 2.6.8 under Debian Sarge, which is now Debian Stable).</p>
<h1>User space and kernel space</h1>
<p>When you write device drivers, it’s important to make the distinction between “user space” and “kernel space”.</p>
<ul>
<li><strong>Kernel space</strong>. Linux (which is a kernel) manages the machine&#8217;s hardware in a simple and efficient manner, offering the user a simple and uniform programming interface. In the same way, the kernel, and in particular its device drivers, form a bridge or interface between the end-user/programmer and the hardware. Any subroutines or functions forming part of the kernel (modules and device drivers, for example) are considered to be part of kernel space.</li>
<li><strong>User space</strong>. End-user programs, like the UNIX <code>shell</code> or other GUI based applications (<code>kpresenter</code> for example), are part of the user space. Obviously, these applications need to interact with the system&#8217;s hardware . However, they don’t do so directly, but through the kernel supported functions.</li>
<li>
<h1>Interfacing functions between user space and kernel space</h1>
<p>The kernel offers several subroutines or functions in user space, which allow the end-user application programmer to interact with the hardware. Usually, in UNIX or Linux systems, this dialogue is performed through functions or subroutines in order to read and write files. The reason for this is that in Unix devices are seen, from the point of view of the user, as files.</p>
<p>On the other hand, in kernel space Linux also offers several functions or subroutines to perform the low level interactions directly with the hardware, and allow the transfer of information from kernel to user space.<img src="data:image/png;base64,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" alt="" /></p>
<p>Usually, for each function in user space (allowing the use of devices or files), there exists an equivalent in kernel space (allowing the transfer of information from the kernel to the user and vice-versa). This is shown in Table 1, which is, at this point, empty. It will be filled when the different device drivers concepts are introduced.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/03/writing-device-drivers-in-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What is Device Drivers</title>
		<link>https://www.emblogic.com/blog/01/what-is-device-drivers/</link>
		<comments>https://www.emblogic.com/blog/01/what-is-device-drivers/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 19:34:04 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Device Drivers]]></category>
		<category><![CDATA[Linux Device Drivers]]></category>
		<category><![CDATA[Linux Device Drivers Training]]></category>

		<guid isPermaLink="false">http://emblogic.org/blog/?p=1621</guid>
		<description><![CDATA[People new to Linux often hear that it has excellent support for all kinds of cards and that the device drivers are stable and fast. Sometimes, though, setting up devices under Linux is often not all plug-and-play. Everything is a &#8230; <a href="https://www.emblogic.com/blog/01/what-is-device-drivers/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>People new to Linux often hear that it has excellent support for all kinds of cards and that the device drivers are stable and fast. Sometimes, though, setting up devices under Linux is often not all plug-and-play.<strong></strong></p>
<p><strong>Everything is a file</strong></p>
<p>Many modern operating systems have a method for installing special files to make hardware work. On the Apple Mac, for instance, the drivers for the hardware devices are usually special files that go in the System Extensions folder. Linux also has special files that it uses to control the hardware.</p>
<p>Linux device drivers work through special kernel code that directly accesses the hardware. To make the services that the card or other device offers available to normal user programs, the kernel uses the special files in<code> /dev</code></p>
<p>One end of the file in <code>/dev</code> can be opened normally and the other end is attached to the kernel. That is of course an oversimplification, but I think you get the general idea: hardware, kernel, special file, user program and the same path back from user program to hardware. There are two forms of the kernel portion of this equation: compiled-in drivers that are coded in permanently when the kernel is built, and modules.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/01/what-is-device-drivers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>What is Embedded Linux</title>
		<link>https://www.emblogic.com/blog/01/what-is-embedded-linux/</link>
		<comments>https://www.emblogic.com/blog/01/what-is-embedded-linux/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 16:02:09 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Embedded Linux]]></category>
		<category><![CDATA[EmbeddedTraining]]></category>
		<category><![CDATA[EmbLogic]]></category>

		<guid isPermaLink="false">http://emblogic.org/blog/?p=1611</guid>
		<description><![CDATA[Over the last decade, a sea change has occurred in the world of embedded systems, driven by the appearance of sophisticated new products such as PDAs and cell phones and by the continual increase in the amount of resources that &#8230; <a href="https://www.emblogic.com/blog/01/what-is-embedded-linux/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<div id="attachment_1614" style="width: 310px" class="wp-caption alignleft"><a href="http://emblogic.org/blog/01/what-is-embedded-linux/logo-final-large/" rel="attachment wp-att-1614"><img class="size-medium wp-image-1614" title="EmbLogic" src="http://emblogic.org/blog/wp-content/uploads/2012/01/logo-final-large-300x300.png" alt="Embedded Linux" width="300" height="300" /></a><p class="wp-caption-text">Embedded Linux</p></div>
<p>Over the last decade, a sea change has occurred in the world of embedded systems, driven by the appearance of sophisticated new products such as PDAs and cell phones and by the continual increase in the amount of resources that can be packed into a small form factor. The traditional small, narrowly focused embedded systems retain their significant presence, but these newer arrivals can capitalize on embedding a full-featured operating system. The operating system provides a wide selection of capabilities from which to choose. For example, wireless Internet connectivity and a GUI already are built in. Only a few years ago, embedded operating systems typically were found only at the high end of the embedded system spectrum.</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/01/what-is-embedded-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PLEASE CHOOSE CATEGORY</title>
		<link>https://www.emblogic.com/blog/10/please-choose-category/</link>
		<comments>https://www.emblogic.com/blog/10/please-choose-category/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 06:49:04 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Word from Admin]]></category>

		<guid isPermaLink="false">http://emblogic.org/blog/?p=1002</guid>
		<description><![CDATA[All of you are requested to &#8220;add category&#8221; to your posts. Thank You]]></description>
				<content:encoded><![CDATA[<p>All of you are requested to &#8220;add category&#8221; to your posts. Thank You</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/10/please-choose-category/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pseudo driver 2.4 kernel</title>
		<link>https://www.emblogic.com/blog/09/pseudo-driver-2-4-kernel/</link>
		<comments>https://www.emblogic.com/blog/09/pseudo-driver-2-4-kernel/#comments</comments>
		<pubDate>Thu, 23 Sep 2010 13:04:11 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
		
		<guid isPermaLink="false">http://emblogic.org/blog/?p=130</guid>
		<description><![CDATA[Starting to write Pseudo Driver using 2.4 kernel ? Any doughts Please let me know]]></description>
				<content:encoded><![CDATA[<p>Starting to write Pseudo Driver using 2.4 kernel ?</p>
<p>Any doughts Please let me know</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/09/pseudo-driver-2-4-kernel/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Client Server using fifo</title>
		<link>https://www.emblogic.com/blog/08/client-server-using-fifo/</link>
		<comments>https://www.emblogic.com/blog/08/client-server-using-fifo/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 13:24:51 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://emblogic.org/blog/?p=84</guid>
		<description><![CDATA[Please give the updates]]></description>
				<content:encoded><![CDATA[<p>Please give the updates</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/08/client-server-using-fifo/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Client Server using Pipes</title>
		<link>https://www.emblogic.com/blog/08/client-server-using-pipes/</link>
		<comments>https://www.emblogic.com/blog/08/client-server-using-pipes/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 05:46:23 +0000</pubDate>
		<dc:creator><![CDATA[spatlou]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://emblogic.org/blog/?p=67</guid>
		<description><![CDATA[Any updates for client server application using pipes]]></description>
				<content:encoded><![CDATA[<p>Any updates for client server application using pipes</p>
]]></content:encoded>
			<wfw:commentRss>https://www.emblogic.com/blog/08/client-server-using-pipes/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>
