<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://script.spoken-tutorial.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://script.spoken-tutorial.org/index.php?action=history&amp;feed=atom&amp;title=Embedded-Linux-Device-Driver%2FC3%2FKernel-Synchronization%2FEnglish</id>
		<title>Embedded-Linux-Device-Driver/C3/Kernel-Synchronization/English - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://script.spoken-tutorial.org/index.php?action=history&amp;feed=atom&amp;title=Embedded-Linux-Device-Driver%2FC3%2FKernel-Synchronization%2FEnglish"/>
		<link rel="alternate" type="text/html" href="https://script.spoken-tutorial.org/index.php?title=Embedded-Linux-Device-Driver/C3/Kernel-Synchronization/English&amp;action=history"/>
		<updated>2026-05-13T15:46:26Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.23.17</generator>

	<entry>
		<id>https://script.spoken-tutorial.org/index.php?title=Embedded-Linux-Device-Driver/C3/Kernel-Synchronization/English&amp;diff=54658&amp;oldid=prev</id>
		<title>Nancyvarkey at 19:47, 8 January 2021</title>
		<link rel="alternate" type="text/html" href="https://script.spoken-tutorial.org/index.php?title=Embedded-Linux-Device-Driver/C3/Kernel-Synchronization/English&amp;diff=54658&amp;oldid=prev"/>
				<updated>2021-01-08T19:47:27Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://script.spoken-tutorial.org/index.php?title=Embedded-Linux-Device-Driver/C3/Kernel-Synchronization/English&amp;amp;diff=54658&amp;amp;oldid=54597&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Nancyvarkey</name></author>	</entry>

	<entry>
		<id>https://script.spoken-tutorial.org/index.php?title=Embedded-Linux-Device-Driver/C3/Kernel-Synchronization/English&amp;diff=54597&amp;oldid=prev</id>
		<title>Nirmala Venkat: Created page with &quot; {| border=&quot;1&quot; |-  || '''Visual cue :''' || '''Narration :''' |- || Slide 1:  Welcome slide: || Welcome to the spoken tutorial on''' Kernel synchronization.''' |-  || Slide 2...&quot;</title>
		<link rel="alternate" type="text/html" href="https://script.spoken-tutorial.org/index.php?title=Embedded-Linux-Device-Driver/C3/Kernel-Synchronization/English&amp;diff=54597&amp;oldid=prev"/>
				<updated>2020-12-21T12:31:04Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot; {| border=&amp;quot;1&amp;quot; |-  || &amp;#039;&amp;#039;&amp;#039;Visual cue :&amp;#039;&amp;#039;&amp;#039; || &amp;#039;&amp;#039;&amp;#039;Narration :&amp;#039;&amp;#039;&amp;#039; |- || Slide 1:  Welcome slide: || Welcome to the spoken tutorial on&amp;#039;&amp;#039;&amp;#039; Kernel synchronization.&amp;#039;&amp;#039;&amp;#039; |-  || Slide 2...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
|| '''Visual cue :'''&lt;br /&gt;
|| '''Narration :'''&lt;br /&gt;
|-&lt;br /&gt;
|| Slide 1:&lt;br /&gt;
&lt;br /&gt;
Welcome slide:&lt;br /&gt;
|| Welcome to the spoken tutorial on''' Kernel synchronization.'''&lt;br /&gt;
|- &lt;br /&gt;
|| Slide 2 :&lt;br /&gt;
&lt;br /&gt;
Learning objectives:&lt;br /&gt;
|| In this tutorial, we will learn about* '''Synchronization''' techniques provided by '''Linux kernel'''.&lt;br /&gt;
* '''Binary''' '''semaphore''' technique and&lt;br /&gt;
* How to control''' '''the shared resource from concurrent access&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| Slide 3 :&lt;br /&gt;
&lt;br /&gt;
System Requirements:&lt;br /&gt;
|| To record this tutorial, I am using,* VirtualBox 5.2.&lt;br /&gt;
* Ubuntu Linux 18.04 LTS Operating System.&lt;br /&gt;
* Linux kernel version 5.0.0-31 generic.&lt;br /&gt;
* gedit text editor.&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| Slide 4 :&lt;br /&gt;
&lt;br /&gt;
Prerequisites:&lt;br /&gt;
|| To follow this tutorial, you should be familiar with:* C programming language and&lt;br /&gt;
* Basics of Linux kernel&lt;br /&gt;
&lt;br /&gt;
If not, then go through the C/C++ and Linux spoken tutorials on this website&lt;br /&gt;
|- &lt;br /&gt;
|| Slide 5:&lt;br /&gt;
&lt;br /&gt;
'''Synchronization''' mechanism&lt;br /&gt;
&lt;br /&gt;
|| '''Synchronization''' mechanism:* It is a mechanism used to protect the shared''' '''resources from concurrent access.&lt;br /&gt;
* The '''kernel '''provides''' synchronization '''mechanisms for system and kernel programming&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
|| We will see the different types of '''kernel synchronization '''techniques.&lt;br /&gt;
|- &lt;br /&gt;
|| Slide 6:&lt;br /&gt;
&lt;br /&gt;
'''Types of Synchronization''' &lt;br /&gt;
|| '''Atomic Operations''' - It occur individually with no other operations occurring concurrently&lt;br /&gt;
&lt;br /&gt;
'''Spinlock''' - These are used in code that is not permitted to sleep.&lt;br /&gt;
&lt;br /&gt;
'''Semaphore''' - This can be used to lock threads. &lt;br /&gt;
&lt;br /&gt;
Such threads sleep until they are activated again&lt;br /&gt;
&lt;br /&gt;
'''Mutex''' - It is the same as binary semaphore. &lt;br /&gt;
&lt;br /&gt;
It prevents simultaneous activation of multiple threads&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
|| In this tutorial, we will see how to use&lt;br /&gt;
&lt;br /&gt;
'''binary semaphore.'''&lt;br /&gt;
|- &lt;br /&gt;
|| Slide 7 :&lt;br /&gt;
&lt;br /&gt;
Binary Semaphore:&lt;br /&gt;
&lt;br /&gt;
|| For example, the user program '''uwrite.c''' writes the data to the '''buffer'''.&lt;br /&gt;
&lt;br /&gt;
At the same time, another process '''uread.c''' tries to read the data from the same buffer.&lt;br /&gt;
&lt;br /&gt;
The '''semaphore''' will block the '''uread.c '''till the '''write''' operation is completed. &lt;br /&gt;
|- &lt;br /&gt;
|| Point to the '''folder''' and''' file''' in '''desktop'''&lt;br /&gt;
&lt;br /&gt;
Point to the '''files.'''&lt;br /&gt;
|| Go to the '''DeviceDriver folder''' in the desktop which we have created earlier.&lt;br /&gt;
&lt;br /&gt;
In this directory, I have created a''' '''directory named''' Synchronization.'''&lt;br /&gt;
&lt;br /&gt;
Here, I have saved '''my_driver dot c driver file and Makefile.'''&lt;br /&gt;
&lt;br /&gt;
'''uread dot c '''and''' uwrite dot c '''are the user program files.&lt;br /&gt;
&lt;br /&gt;
I’ll use these files''' '''for demonstration.&lt;br /&gt;
|- &lt;br /&gt;
|| Slide :&lt;br /&gt;
&lt;br /&gt;
'''Code files''':&lt;br /&gt;
|| * The files used in this tutorial are available in the '''Code Files '''link on this tutorial page.&lt;br /&gt;
* Please download and extract them&lt;br /&gt;
* Make a copy and then use them while practising&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| Open the '''termin&lt;br /&gt;
&lt;br /&gt;
Type &amp;gt;&amp;gt; '''cd Desktop/DeviceDriver/ Synchronization'''&lt;br /&gt;
|| Open the terminal by pressing '''ALT+Ctrl+T '''keys simultaneously.&lt;br /&gt;
&lt;br /&gt;
Go to the directory where '''Synchronization '''is saved on your system.&lt;br /&gt;
&lt;br /&gt;
Press Enter key after every command'''.'''&lt;br /&gt;
&lt;br /&gt;
Let us open '''my_driver dot c driver file'''&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
Type &amp;gt;&amp;gt; '''gedit my_driver.c'''&lt;br /&gt;
&lt;br /&gt;
Shown opened '''file'''&lt;br /&gt;
|| Type''' gedit space my_driver dot c.'''&lt;br /&gt;
&lt;br /&gt;
In this file, I have defined the '''open''',''' read, write '''and''' close functions '''for''' new_device. '''&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
Highlight''' #include&amp;lt;linux/semaphore.h&amp;gt;'''&lt;br /&gt;
Highlight '''delay.h'''&lt;br /&gt;
&lt;br /&gt;
|| We have to include the '''semaphore.h'''. header file&lt;br /&gt;
&lt;br /&gt;
The''' semaphore '''related '''kernel''' '''functions''' are declared in this file.&lt;br /&gt;
&lt;br /&gt;
'''delay dot h '''file is included in which the '''kernel''' delay '''functions''' are defined.&lt;br /&gt;
|- &lt;br /&gt;
|| Highlight static '''struct semaphore lock'''&lt;br /&gt;
&lt;br /&gt;
Highlight '''lock'''&lt;br /&gt;
|| The''' struct semaphore''' is a structure that represents '''semaphores.'''&lt;br /&gt;
&lt;br /&gt;
We will use a semaphore''' lock''' to avoid the concurrent access.&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
Highlight''' sema_init(struct semaphore *, int) '''&lt;br /&gt;
&lt;br /&gt;
Highlight '''struct semaphore *'''&lt;br /&gt;
&lt;br /&gt;
Highlight '''int'''&lt;br /&gt;
|| In the '''initialization function''' of the '''driver,''' the function''' sema_init '''is declared.&lt;br /&gt;
This function is used to initialize the '''semaphore'''.&lt;br /&gt;
&lt;br /&gt;
The first parameter is a '''semaphore structure pointer.'''&lt;br /&gt;
&lt;br /&gt;
'''int''' is the initial value assigned to the semaphore for the number of resources.&lt;br /&gt;
|- &lt;br /&gt;
|| Highlight''' sema_init(lock, 0)'''&lt;br /&gt;
&lt;br /&gt;
Highlight '''0'''&lt;br /&gt;
|| '''Lock''' is the semaphore structure pointer and zero is the initial value of the semaphore'''.'''&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
|| Let us see the important '''semaphore '''related '''functions''' provided by the''' kernel.'''&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
'''down_interruptible(struct semaphore *)''' &lt;br /&gt;
&lt;br /&gt;
|| The '''function down_interruptible()''' in the read function attempts to acquire the given '''semaphore'''.&lt;br /&gt;
&lt;br /&gt;
It acquires the given '''semaphore''' with '''interruptible '''sleep.&lt;br /&gt;
&lt;br /&gt;
The initial value of semaphore is zero. So '''down_interruptible function''' will decrement it.&lt;br /&gt;
&lt;br /&gt;
The value becomes less than zero.&lt;br /&gt;
&lt;br /&gt;
So the''' user program''' which will try to '''read''' data will get blocked.&lt;br /&gt;
|- &lt;br /&gt;
|| '''up(struct semaphore *) '''&lt;br /&gt;
&lt;br /&gt;
'''up(&amp;amp;lock)'''&lt;br /&gt;
|| The '''up() function''' is used in the write '''function'''.&lt;br /&gt;
&lt;br /&gt;
It''' '''releases the '''semaphore '''and wakes a waiting task, if any.&lt;br /&gt;
&lt;br /&gt;
This will release the '''semaphore''' after completing the write operation on the resource.&lt;br /&gt;
&lt;br /&gt;
Here, the '''semaphore structure pointer '''is passed as a parameter.&lt;br /&gt;
&lt;br /&gt;
Now another user can acquire the '''semaphore''' and get access to the shared resource.&lt;br /&gt;
&lt;br /&gt;
Using '''semaphore''', only one process can get the access of a shared resource at a time.&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
Highlight''' ssleep(10).'''&lt;br /&gt;
|| '''ssleep() function '''is used, so that the '''write function '''sleeps for some time.&lt;br /&gt;
&lt;br /&gt;
Practically''' drivers''' should not go into sleep mode.&lt;br /&gt;
&lt;br /&gt;
You should not use '''ssleep'''() function in a driver. &lt;br /&gt;
&lt;br /&gt;
For demonstration purposes, I have used '''ssleep'''() to show the output.&lt;br /&gt;
&lt;br /&gt;
Save and close the''' '''file'''.'''&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
Type &amp;gt;&amp;gt; '''gedit uread.c'''&lt;br /&gt;
&lt;br /&gt;
Highlight '''open, read '''and''' close'''&lt;br /&gt;
&lt;br /&gt;
Save and close the '''file.'''&lt;br /&gt;
&lt;br /&gt;
|| Let us now open the '''user program''' '''uread dot c'''&lt;br /&gt;
&lt;br /&gt;
Type''' gedit space uread dot c.'''&lt;br /&gt;
&lt;br /&gt;
This program opens the '''new_device file''', reads data and closes the '''device file'''.&lt;br /&gt;
&lt;br /&gt;
Now, save and close the''' program.'''&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
Type &amp;gt;&amp;gt; '''gedit uwrite.c'''&lt;br /&gt;
&lt;br /&gt;
Highlight '''open, write '''and''' close'''&lt;br /&gt;
|| Next let us now open the '''user program uwrite''' dot c.&lt;br /&gt;
&lt;br /&gt;
Type''' gedit space uwrite dot c.'''&lt;br /&gt;
&lt;br /&gt;
This program opens the '''new_device file,''' writes data and closes the '''device file.'''&lt;br /&gt;
|- &lt;br /&gt;
|| Save and close the '''file.'''&lt;br /&gt;
&lt;br /&gt;
Clear the '''screen.'''&lt;br /&gt;
|| Now, save and close the file'''.'''&lt;br /&gt;
&lt;br /&gt;
Clear the''' '''screen'''.'''&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
Type gedit space '''Makefile'''&lt;br /&gt;
|| Let us create a '''Makefile''' to compile the '''driver'''.&lt;br /&gt;
&lt;br /&gt;
Type '''gedit space Makefile'''&lt;br /&gt;
&lt;br /&gt;
Type the code as shown here or you can use downloaded '''Makefile'''.&lt;br /&gt;
&lt;br /&gt;
Save and close the file. Clear the screen.&lt;br /&gt;
|- &lt;br /&gt;
|| Type &amp;gt;&amp;gt; '''sudo su.'''&lt;br /&gt;
&lt;br /&gt;
Type &amp;gt;&amp;gt;''' system password '''&lt;br /&gt;
|| To be a '''superuser''', type '''sudo space su.''' &lt;br /&gt;
&lt;br /&gt;
Now type the '''system password. '''&lt;br /&gt;
|- &lt;br /&gt;
|| Type &amp;gt;&amp;gt; '''make all'''&lt;br /&gt;
&lt;br /&gt;
Type &amp;gt;&amp;gt; '''clear'''&lt;br /&gt;
&lt;br /&gt;
Type &amp;gt;&amp;gt;''' insmod my_driver.ko'''&lt;br /&gt;
&lt;br /&gt;
Type &amp;gt;&amp;gt; '''clear'''&lt;br /&gt;
|| Let us '''compile''' the '''driver.'''&lt;br /&gt;
&lt;br /&gt;
Type '''make space all.'''&lt;br /&gt;
Clear the screen&lt;br /&gt;
&lt;br /&gt;
Now let’s load the '''driver '''into the''' kernel.'''&lt;br /&gt;
&lt;br /&gt;
Type '''insmod space my_driver dot ko.'''&lt;br /&gt;
&lt;br /&gt;
Clear the screen.&lt;br /&gt;
|- &lt;br /&gt;
|| Type &amp;gt;&amp;gt; '''dmesg | grep my_driver'''&lt;br /&gt;
&lt;br /&gt;
Highlight the '''output'''&lt;br /&gt;
&lt;br /&gt;
Type &amp;gt;&amp;gt; '''clear'''&lt;br /&gt;
|| Let us see the loaded '''printk '''messages.&lt;br /&gt;
&lt;br /&gt;
Type '''dmesg command''' as shown here.&lt;br /&gt;
&lt;br /&gt;
The output shows that the '''semaphore''' is initialized successfully.&lt;br /&gt;
&lt;br /&gt;
Clear the screen.&lt;br /&gt;
|- &lt;br /&gt;
|| Type '''gcc -c uread.c uwrite.c'''&lt;br /&gt;
&lt;br /&gt;
Type '''gcc -o uread uread.o'''&lt;br /&gt;
&lt;br /&gt;
Type''' gcc -o uwrite uwrite.o'''&lt;br /&gt;
|| Now let us compile the two '''user programs.'''&lt;br /&gt;
&lt;br /&gt;
Type '''gcc hyphen c uread dot c space uwrite dot c.'''&lt;br /&gt;
&lt;br /&gt;
Type '''gcc hyphen o uread space uread.o'''&lt;br /&gt;
&lt;br /&gt;
Type '''gcc hyphen o uwrite uwrite.o'''&lt;br /&gt;
&lt;br /&gt;
Clear the screen.&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|| Now let us execute the''' uwrite and uread''' '''user program '''in two terminals.&lt;br /&gt;
&lt;br /&gt;
Let us name this terminal as '''A.'''&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
Type '''sudo su''' and''' system password'''&lt;br /&gt;
&lt;br /&gt;
Type''' &amp;gt;&amp;gt; ./uwrite'''&lt;br /&gt;
|| Open another '''termina'''l by pressing''' Ctrl+ALT+T keys '''simultaneously'''. '''&lt;br /&gt;
&lt;br /&gt;
Let us name this terminal as''' B.'''&lt;br /&gt;
&lt;br /&gt;
Go to the '''synchronization folder''' where you have saved the '''files'''.&lt;br /&gt;
&lt;br /&gt;
Now, type''' sudo su''' and''' password.'''&lt;br /&gt;
&lt;br /&gt;
Switch back to terminal''' A.'''&lt;br /&gt;
&lt;br /&gt;
Type '''dot slash uwrite in '''terminal''' A.'''&lt;br /&gt;
|- &lt;br /&gt;
|| Type &amp;gt;&amp;gt;''' ./uread'''&lt;br /&gt;
|| Switch back to '''terminal B.'''&lt;br /&gt;
&lt;br /&gt;
Type '''dot slash uread.'''&lt;br /&gt;
&lt;br /&gt;
Press the enter key in both the terminals to execute the program.&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
Highlight respective outputs &lt;br /&gt;
Close the '''terminal B'''&lt;br /&gt;
|| After waiting for some time, we can see the output on both terminals.&lt;br /&gt;
&lt;br /&gt;
See the output in terminal A.&lt;br /&gt;
&lt;br /&gt;
The output shows that the '''Linux Device Driver''' string writes to the '''device''' successfully.&lt;br /&gt;
&lt;br /&gt;
Check the output in terminal B.&lt;br /&gt;
&lt;br /&gt;
It shows that the same string is read from the '''device''' successfully.&lt;br /&gt;
&lt;br /&gt;
Close the terminal B.&lt;br /&gt;
|- &lt;br /&gt;
|| Type &amp;gt;&amp;gt; '''clear'''&lt;br /&gt;
|| Clear the screen'''.'''&lt;br /&gt;
|- &lt;br /&gt;
|| Type &amp;gt;&amp;gt; '''dmesg | grep my_driver'''&lt;br /&gt;
&lt;br /&gt;
Highlight the '''output'''&lt;br /&gt;
&lt;br /&gt;
Highlight''' printk '''messages&lt;br /&gt;
|| Type '''dmesg '''command as shown.&lt;br /&gt;
&lt;br /&gt;
The output message shows that the '''semaphore''' is acquired by the user '''uread.c.'''&lt;br /&gt;
&lt;br /&gt;
The''' user program uread.c''' is blocked by the unavailable '''semaphore'''.&lt;br /&gt;
&lt;br /&gt;
The''' user program uwrite.c''' writes data in a '''buffer''' and then releases''' semaphore'''.&lt;br /&gt;
|- &lt;br /&gt;
|| Highlight the '''printk messages.'''&lt;br /&gt;
&lt;br /&gt;
'''Type &amp;gt;&amp;gt; clear'''&lt;br /&gt;
|| As soon as the '''semaphore''' releases, the '''uread.c '''acquires it.&lt;br /&gt;
&lt;br /&gt;
The output message shows that the '''uread.c '''program reads the data from the '''buffer'''.&lt;br /&gt;
&lt;br /&gt;
It indicates that at a time only one process is available to access the shared '''buffer.'''&lt;br /&gt;
&lt;br /&gt;
Clear the screen.&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
&lt;br /&gt;
Type''' rmmod my_driver.ko'''&lt;br /&gt;
&lt;br /&gt;
|| Now lets unload the '''driver.'''&lt;br /&gt;
&lt;br /&gt;
Type '''rmmod space my_driver dot ko.'''&lt;br /&gt;
|- &lt;br /&gt;
|| &lt;br /&gt;
|| With this, we come to the end of this tutorial. Let us summarise.&lt;br /&gt;
|- &lt;br /&gt;
|| Slide :&lt;br /&gt;
&lt;br /&gt;
Summary:&lt;br /&gt;
|| In this tutorial, we learnt* '''Synchronization''' techniques provided by the''' Linux kernel'''.&lt;br /&gt;
* '''Binary''' '''semaphore''' technique and&lt;br /&gt;
* How to control''' '''the shared resources from concurrent access&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| Slide :&lt;br /&gt;
&lt;br /&gt;
Assignment : &lt;br /&gt;
|| As an assignment:# Change the '''Data''' in the '''uwrite.c'''&lt;br /&gt;
# Compile, load the''' driver '''and execute the '''user programs. '''&lt;br /&gt;
# See the output using '''dmesg command.'''&lt;br /&gt;
# Unload the '''driver''' from the '''kernel.'''&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| Slide :&lt;br /&gt;
&lt;br /&gt;
About Spoken Tutorial Project:&lt;br /&gt;
|| * The video at the following link summarizes the Spoken Tutorial project.&lt;br /&gt;
* Please download and watch it.&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| Slide :&lt;br /&gt;
&lt;br /&gt;
Spoken Tutorial workshops :&lt;br /&gt;
|| The''' Spoken Tutorial Project''' Team:* conducts workshops and&lt;br /&gt;
* gives certificates.&lt;br /&gt;
&lt;br /&gt;
For more details, please write to us.&lt;br /&gt;
|- &lt;br /&gt;
|| Slide :&lt;br /&gt;
&lt;br /&gt;
Forum questions :&lt;br /&gt;
|| * Please post your timed queries in this forum&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| Slide :&lt;br /&gt;
&lt;br /&gt;
Forum for specific questions :&lt;br /&gt;
&lt;br /&gt;
|| * Do you have any general or technical questions on Embedded Linux Device Driver?&lt;br /&gt;
* Please visit the FOSSEE forum and post your question.&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
|| Slide :&lt;br /&gt;
&lt;br /&gt;
Acknowledgment:&lt;br /&gt;
|| The Spoken Tutorial Project is funded by MHRD, Government of India.&lt;br /&gt;
|- &lt;br /&gt;
|| Slide :&lt;br /&gt;
&lt;br /&gt;
Thank you slide:&lt;br /&gt;
&lt;br /&gt;
|| This tutorial has been contributed by FOSSEE and Spoken Tutorial Project, IIT Bombay. &lt;br /&gt;
&lt;br /&gt;
This is Usha signing off.Thanks for watching.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Nirmala Venkat</name></author>	</entry>

	</feed>