Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/fs.h>
- #include <asm/uaccess.h>
- #define MAX_BUF_SIZE 1024
- #define DEVICE_NAME "MY_AUDIO_DEVICE"
- #define TRUE 1
- #define FALSE !TRUE
- static ssize_t device_read(struct file*, char*, size_t, loff_t*);
- static ssize_t device_write(struct file*, const char*, size_t, loff_t*);
- static int device_open(struct inode*, struct file*);
- static int device_release(struct inode*, struct file*);
- static char audio_buffer[MAX_BUF_SIZE] = {"THIS BUFFER DOES NOT REALLY INCLUDE AUDIO DATA"};
- static struct file_operations fops =
- {
- .read = device_read,
- .write = device_write,
- .open = device_open,
- .release = device_release
- };
- static int major_number = 0;
- static char is_opened = FALSE;
- static int driver_init(void)
- {
- if ((major_number = register_chrdev(0, DEVICE_NAME, &fops)) < 0)
- {
- printk("register_chrdev failed with status = %d\n", major_number);
- return major_number;
- }
- printk("Device driver was successfully loaded. The major number is: %d\n", major_number);
- printk("'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, major_number);
- return 0;
- }
- static void driver_cleanup(void)
- {
- unregister_chrdev(major_number, DEVICE_NAME);
- }
- static int device_open(struct inode* node, struct file* f)
- {
- if (is_opened)
- return -EBUSY;
- is_opened = TRUE;
- return 0;
- }
- static int device_release(struct inode* node, struct file* f)
- {
- is_opened = FALSE;
- return 0;
- }
- static ssize_t device_write(struct file* file, const char* buffer, size_t length, loff_t* offset)
- {
- printk("Write operation is not supported on this device.\n");
- return -EINVAL;
- }
- static ssize_t device_read(struct file* file, char* buffer, size_t length, loff_t* offset)
- {
- if (length >= MAX_BUF_SIZE)
- length = MAX_BUF_SIZE - 1;
- if (copy_to_user(buffer, audio_buffer, length))
- return -EINVAL;
- return length;
- }
- module_init(driver_init);
- module_exit(driver_cleanup);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement