EmbLogic's Blog

Module code to show how to perform “trim” operation by calling chardev_trim() before the device is opened for writing.

RCS file: openf.c,v
Working file: openf.c
head: 1.14
branch:
locks: strict
root: 1.14
access list:
symbolic names:
keyword substitution: kv
total revisions: 14;    selected revisions: 14
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.14    locked by: root;
date: 2014/03/02 13:54:57;  author: root;  state: Exp;  lines: +0 -8
Status : chardev_trim() is working fine.

The chardev_trim() function is called to perform an operation of truncating the device to a length of 0 when the device is opened for writing.
For checking purposes,chardev_trim() function is called twice.One inside the chardev_open() and one inside the chardev_release().
—————————-
revision 1.13
date: 2014/03/01 20:24:26;  author: root;  state: Exp;  lines: +12 -4
Compilation successfull and chardev_trim() function is working fine.
Issue:Trying the free the memory that is not allocated in case of quantum.
Logical error fixed.
—————————-
revision 1.12
date: 2014/03/01 19:41:54;  author: root;  state: Exp;  lines: +4 -0
kernel crash taking place inside chardev_trim() function.
Issue inside chardev_trim() function.
Debugging……………………………
—————————-
revision 1.11
date: 2014/03/01 19:38:30;  author: root;  state: Exp;  lines: +1 -1
Syntax error fixed.
Issue:Missing semicolon.
—————————-
revision 1.10
date: 2014/03/01 19:37:04;  author: root;  state: Exp;  lines: +12 -4
One bug fixed.
Issue:qset_size variable is included using extern.
Debugging…..
—————————-
revision 1.9
date: 2014/03/01 13:09:52;  author: root;  state: Exp;  lines: +49 -3
Implementing chardev_trim() function.Inside this function,firstly certain checks are made to make sure that Sculldec , scullqset , qset and quantums exist or not.
If any of such things do not exist an error message is reported.Now performing trimming………..
—————————-
revision 1.8
date: 2014/03/01 12:08:22;  author: root;  state: Exp;  lines: +23 -1
Two printk statements are added inside the chardev_trim() function to mark its beginning and end.
Checking……….
—————————-
revision 1.7
date: 2014/03/01 11:57:45;  author: root;  state: Exp;  lines: +5 -0
O_ACCMODE is a macro that stands for a mask that can be bitwise-ANDed with the file status flag value to produce a value representing the file access mode.The mode will be O_WRONLY,O_RDONLY or O_RDWR.
The O_ACCMODE macro is used inside the chardev_open() function to find out the file access mode.
—————————-
revision 1.6
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: initial.c,v
Working file: initial.c
head: 1.13
branch:
locks: strict
root: 1.13
access list:
symbolic names:
keyword substitution: kv
total revisions: 13;    selected revisions: 13
description:
File containing the module’s initialization function that is called at module insertion time.
—————————-
revision 1.13    locked by: root;
date: 2014/02/28 18:56:45;  author: root;  state: Exp;  lines: +1 -1
Fixed the warning by giving void as an argument inside the initialize_parameters() function.
Compilation is successfull.
Checking the functionality by calling application……….
—————————-
revision 1.12
date: 2014/02/28 17:59:59;  author: root;  state: Exp;  lines: +1 -0
Header file:”file_opr.h” is added to include the file_operations structure.The file_operations structure is used to access the driver’s functions.
—————————-
revision 1.11
date: 2014/02/28 17:49:26;  author: root;  state: Exp;  lines: +15 -4
After a device number range has been obtained,the device needs to be activated by adding it to the character device database.This requires initializing an instance of cdev_init() followed by a call to cdev_add().cdev_add() tells te kernel about the cdev data structure.
—————————-
revision 1.10
date: 2014/02/28 17:16:31;  author: root;  state: Exp;  lines: +16 -0
Both the major and minor numbers are initialized to 0 inside the initialize_parameters() function.Macros like MAJOR() and MINOR() are used to extract the major and minor number from dev type variable.Another macro called MKDEV is used to create the device number.
Checking……
—————————-
revision 1.9
date: 2014/02/28 16:50:22;  author: root;  state: Exp;  lines: +25 -0
From the initialization function,another function is called to initialize the parameters such as device size, quantum_size ,qset_size and data_size.

Status:The parameters are initialized successfully.
Now before the kernel calls the device’s operations,a cdev structure must be initialized with cdev_init() and the kernel is being told about the initialization with cdev_add().Implementing this task….
—————————-
revision 1.8
date: 2014/02/28 15:46:09;  author: root;  state: Exp;  lines: +1 -1
Inside the alloc_chrdev_region(),the fourth argument is changed from DEVICE_NAME to DRIVER_NAME.
—————————-
revision 1.7
date: 2014/02/28 15:32:31;  author: root;  state: Exp;  lines: +1 -0
memset() is used to fill the memory allocated using kmalloc() function with ”.
—————————-
revision 1.6
date: 2014/02/28 15:26:38;  author: root;  state: Exp;  lines: +12 -1
kmalloc() function is used to allocate memory.kmalloc() function takes two arguments:
1.size ,and
2.set of flags.
On success,kmalloc returns a pointer to the allocated memory otherwise it returns NULL.
In the flag field,GFP_KERNEL is used.
—————————-
revision 1.5
date: 2014/02/27 20:12:29;  author: root;  state: Exp;  lines: +7 -1
module_param() macro is used.With the help of this macro parameters can be passed to the module while loading it,when using “insmod”.
module_param() macro takes three arguments:
1.The name of the variable,
2.The type of the variable,
3.Permissions.
—————————-
revision 1.4
date: 2014/02/27 19:58:09;  author: root;  state: Exp;  lines: +1 -1
alloc_chrdev_region() function is used to allocate dynamically a major number.On success,the first parameter of this function stores the first device number.
—————————-
revision 1.3
date: 2014/02/27 19:31:39;  author: root;  state: Exp;  lines: +11 -0
Header file: “decleration.h” is added to include all the variable declerations.
—————————-
revision 1.2
date: 2014/02/27 18:50:37;  author: root;  state: Exp;  lines: +7 -0
module_init() macro is used to define which function is called during module’s insertion time.
__init token hints to the kernel that the function is used only at the initialization time.
The function specified by the module_init() macro is declared static because it is not meant to be visible outside the file.
—————————-
revision 1.1
date: 2014/02/27 18:49:06;  author: root;  state: Exp;
Initial revision
=============================================================================
RCS file: closef.c,v
Working file: closef.c
head: 1.3
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 3;    selected revisions: 3
description:
chardev_release() function live here.
—————————-
revision 1.3
date: 2014/03/02 14:08:43;  author: root;  state: Exp;  lines: +9 -1
chardev_trim() function is called to truncate the device to a length 0 and also it is called here to check whether trimming is working properly or not.
—————————-
revision 1.2
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: 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
=============================================================================

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>