EmbLogic's Blog

Module code to show how to write data in a single quantum using copy_from_user() function.

RCS file: writef.c,v
Working file: writef.c
head: 1.15
branch:
locks: strict
root: 1.15
access list:
symbolic names:
keyword substitution: kv
total revisions: 15;    selected revisions: 15
description:
chardev_write() function reside here.
—————————-
revision 1.15    locked by: root;
date: 2014/03/01 11:19:07;  author: root;  state: Exp;  lines: +5 -0
One printk statement is added to test whether the data is actually copied into the kernel buffer or not.
Testing……….
—————————-
revision 1.14
date: 2014/03/01 11:13:18;  author: root;  state: Exp;  lines: +15 -7
The copy_from_user() function is used to copy a block of data from user space into the kernel buffer.copy_from_user() function contains 3 arguments:
1.A destination buffer,
2.A source buffer,and
3.length in bytes.
—————————-
revision 1.13
date: 2014/03/01 11:06:21;  author: root;  state: Exp;  lines: +2 -1
Done memset().
Testing the code…..
—————————-
revision 1.12
date: 2014/03/01 11:01:16;  author: root;  state: Exp;  lines: +54 -5
Implemented the create_quantums() function that will create the required number of quantums.
Kmalloc() is used to allocate memory for each quantum.
Filling the memory allocated using kmalloc() with memset() so that it does not contain any garbage.
—————————-
revision 1.11
date: 2014/03/01 10:39:39;  author: root;  state: Exp;  lines: +1 -0
memset() function is used to fill the memory allocated for the qset array to ”.
—————————-
revision 1.10
date: 2014/03/01 10:36:59;  author: root;  state: Exp;  lines: +14 -4
Using kmalloc() memory is allocated to the required number of qsets.
Checking whether it is working fine or not.
—————————-
revision 1.9
date: 2014/03/01 10:26:27;  author: root;  state: Exp;  lines: +36 -2
Implemented create_scullqset() function.Now checking the number of qsets that needs to created by using the size argument of the chardev_write().After determining the number of qsets that needs to be created create_qset() function is called.
—————————-
revision 1.8
date: 2014/03/01 10:07:44;  author: root;  state: Exp;  lines: +2 -1
memset() function is used to fill the memory allocated using kmalloc() with ” .
—————————-
revision 1.7
date: 2014/03/01 10:04:21;  author: root;  state: Exp;  lines: +10 -0
Allocating memory for 1 scullqset to check whether the create_scullqset() function is working properly or not.
—————————-
revision 1.6
date: 2014/03/01 09:56:22;  author: root;  state: Exp;  lines: +22 -2
After finding out the number of scullqsets,create_scullqset() function is called to create the specified number of scullqsets.
Checking whether the function calling is taking place or not……
—————————-
revision 1.5
date: 2014/03/01 09:47:56;  author: root;  state: Exp;  lines: +19 -0
The size argument that specifies the size of the buffer pointed to by ubuff is used to find the number of scullqsets that needs to be created.
After finding out the exact number of scullqsets that needs to be created,the number of scullqsets are printed.
Creating scullqsets…….
—————————-
revision 1.4
date: 2014/03/01 09:32:34;  author: root;  state: Exp;  lines: +1 -1
Fixed the warning by type-casting size_t to int.
—————————-
revision 1.3
date: 2014/03/01 09:28:31;  author: root;  state: Exp;  lines: +6 -1
Checking whether the ubuff pointer is actually pointing to the buffer in the application.Also checking the size field inside the 3rd argument of chardev_write().
—————————-
revision 1.2
date: 2014/03/01 09:20:00;  author: root;  state: Exp;  lines: +9 -1
Printing the address inside filep->private_data to check whether it matches with the address returned by container_of() macro.
A local variable of type Sculldev is declared which will store the address that is present inside filep->private_data.
—————————-
revision 1.1
date: 2014/02/28 21:33:05;  author: root;  state: Exp;
Initial revision
=============================================================================
RCS file: openf.c,v
Working file: openf.c
head: 1.6
branch:
locks: strict
root: 1.6
access list:
symbolic names:
keyword substitution: kv
total revisions: 6;    selected revisions: 6
description:
The functionality of chardev_open() is implemented here inside this file.Whenever the application calls the open function,this is always the first operation performed on the device file.
—————————-
revision 1.6    locked by: root;
date: 2014/03/01 08:45:54;  author: root;  state: Exp;  lines: +5 -1
Printing the address stored inside the lsculldev to check whether it matches with the filep->private data address printed inside the chardev_release() function.
—————————-
revision 1.5
date: 2014/03/01 08:33:40;  author: root;  state: Exp;  lines: +1 -0
Once the Sculldev structure is found by the container_of() macro,a pointer to the scull is stored in the private_data field of the file structure for easier access    .
—————————-
revision 1.4
date: 2014/03/01 08:25:52;  author: root;  state: Exp;  lines: +11 -4
A local variable of type struct Sculldev is declared.
Used container_of() inside the open function.This macro has 3 arguments:
1.A pointer to a field named container_field.
2.This container field within a structure of type container_type,and
3.ccontainer field.
On success it returns a pointer to the containing structure.
—————————-
revision 1.3
date: 2014/02/28 18:51:08;  author: root;  state: Exp;  lines: +2 -0
Included the prototype of chardev_open() using extern.
—————————-
revision 1.2
date: 2014/02/28 18:42:56;  author: root;  state: Exp;  lines: +15 -0
Two printk statements are used to test that whether the open function is actually begin and ended.\
—————————-
revision 1.1
date: 2014/02/28 18:33:28;  author: root;  state: Exp;
Initial revision
=============================================================================
RCS file: header.h,v
Working file: header.h
head: 1.17
branch:
locks: strict
root: 1.17
access list:
symbolic names:
keyword substitution: kv
total revisions: 17;    selected revisions: 17
description:
Base header file that includes the definitions of all the macros,structures and contains the necessary header files required by the module code.
—————————-
revision 1.17    locked by: root;
date: 2014/03/01 11:21:47;  author: root;  state: Exp;  lines: +1 -0
Header file:<asm/uaccess.h> is added to support copy_from_user() function.
—————————-
revision 1.16
date: 2014/02/28 17:13:48;  author: root;  state: Exp;  lines: +2 -0
Header file:<linux/types.h> is added to support dev_t type.
—————————-
revision 1.15
date: 2014/02/28 16:58:15;  author: root;  state: Exp;  lines: +6 -0
Two macros are defined called MAJOR_NO and MINOR_NO.
—————————-
revision 1.14
date: 2014/02/28 15:44:56;  author: root;  state: Exp;  lines: +2 -2
The macro DEVICE_NAME is changed to DRIVER_NAME and the header file:<string.h> is removed.
—————————-
revision 1.13
date: 2014/02/28 15:41:31;  author: root;  state: Exp;  lines: +1 -1
Header file:<linux/cdev.h> is added to support a cdev structure.The cdev structure is used to register the driver with the kernel.
—————————-
revision 1.12
date: 2014/02/28 15:33:59;  author: root;  state: Exp;  lines: +1 -0
Header file:<string.h> is added to support memset() function.
—————————-
revision 1.11
date: 2014/02/28 15:18:15;  author: root;  state: Exp;  lines: +16 -0
Four macros are defined namely:DEVICE_SIZE , DATA_SIZE , QUANTUM and QSET.
These macros are used to initialize the fields inside the Scull_Dev structure.
—————————-
revision 1.10
date: 2014/02/28 15:10:35;  author: root;  state: Exp;  lines: +16 -0
Two structures are defined of type Sculldev and Scullqset.Sculldev is a structure that is used to hold device information.Scullqset is a structure that holds a pointer to the qset array and another pointer to a structure of Scullqset type.
—————————-
revision 1.9
date: 2014/02/27 21:07:42;  author: root;  state: Exp;  lines: +1 -0
Header file:<linux/slab.h> is added to support kmalloc() and kfree() functions.
—————————-
revision 1.8
date: 2014/02/27 20:02:53;  author: root;  state: Exp;  lines: +1 -0
Header file:<linux/moduleparam.h> is added to support the module_param() macro.With the help of this macro parameters can be passed to a module while loading it.
—————————-
revision 1.7
date: 2014/02/27 19:28:38;  author: root;  state: Exp;  lines: +4 -0
A macro called DEVICE_NAME is defined using #define.
—————————-
revision 1.6
date: 2014/02/27 19:20:01;  author: root;  state: Exp;  lines: +1 -0
Header file:<linux/fs.h> is added to the base header file to support various functions like alloc_chrdev_region(),unregister_chrdev_region(),etc.
—————————-
revision 1.5
date: 2014/02/27 18:44:36;  author: root;  state: Exp;  lines: +4 -0
A macro called DEBUG is defined using #define.
—————————-
revision 1.4
date: 2014/02/27 18:41:13;  author: root;  state: Exp;  lines: +2 -0
A special macro called MODULE_LICENSE is used to tell the kernel that the module bears a free license without such a decleration the kernel complains.
—————————-
revision 1.3
date: 2014/02/27 18:38:11;  author: root;  state: Exp;  lines: +1 -1
Header file:<linux/module.h> is added to the base header file to provide support for a great many number of macros like:MODULE_LICENSE , MODULE_AUTHOR,etc.
—————————-
revision 1.2
date: 2014/02/27 18:36:07;  author: root;  state: Exp;  lines: +2 -0
Header file:<linux/init.h> is added to the base header file to provide support for module_init() and module_exit() macros.
—————————-
revision 1.1
date: 2014/02/27 18:35:18;  author: root;  state: Exp;
Initial revision
=============================================================================
RCS file: closef.c,v
Working file: closef.c
head: 1.2
branch:
locks: strict
root: 1.2
access list:
symbolic names:
keyword substitution: kv
total revisions: 2;    selected revisions: 2
description:
chardev_release() function live here.
—————————-
revision 1.2    locked by: root;
date: 2014/02/28 20:37:55;  author: root;  state: Exp;  lines: +2 -2
chardev_release() function is called when the application calls close() system call.
Two printk statements are used as debug statements to find out whether this function is called or not.
—————————-
revision 1.1
date: 2014/02/28 20:37:08;  author: root;  state: Exp;
Initial revision
=============================================================================
RCS file: cleanup.c,v
Working file: cleanup.c
head: 1.6
branch:
locks: strict
root: 1.6
access list:
symbolic names:
keyword substitution: kv
total revisions: 6;    selected revisions: 6
description:
File that contains the cleanup function which returns all the resources back to the system.
—————————-
revision 1.6    locked by: root;
date: 2014/02/28 15:35:01;  author: root;  state: Exp;  lines: +1 -0
kfree() function is used for freeing the memory.
—————————-
revision 1.5
date: 2014/02/27 20:15:39;  author: root;  state: Exp;  lines: +3 -1
A variable of type int representing the number of devices is included here using extern.
—————————-
revision 1.4
date: 2014/02/27 19:36:03;  author: root;  state: Exp;  lines: +1 -0
A variable dev of type dev_t storing the device number is included here using extern.
—————————-
revision 1.3
date: 2014/02/27 19:33:49;  author: root;  state: Exp;  lines: +3 -1
Called unregister_chrdev_region() which is having 2 arguments: device number and the total number of device numbers to unregister.
—————————-
revision 1.2
date: 2014/02/27 18:58:02;  author: root;  state: Exp;  lines: +14 -0
module_exit() macro is used to define which function is to be called at module removal time.\
The function specified by the module_exit() macro is declared static because it is not meant to be visible outside the file.
—————————-
revision 1.1
date: 2014/02/27 18:55:42;  author: root;  state: Exp;
Initial revision
=============================================================================

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>