⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd_driver.c

📁 做好的基于arm的lcd 的驱动程序
💻 C
字号:
#include <linux/module.h>#include <linux/fs.h>#include <asm/io.h>#include <linux/init.h>#include <linux/kernel.h>#include <asm/uaccess.h>#include <linux/errno.h>#include <linux/types.h>MODULE_LICENSE("GPL");unsigned int  lcd_major = 0;static int open_lcd(struct inode *, struct file *);static ssize_t read_lcd(struct file *, char *, size_t , loff_t *);static int ioctl_lcd(struct inode *, struct file *, unsigned int cmd, unsigned long);static ssize_t write_lcd(struct file *, const char *, size_t, loff_t *);static int close_lcd(struct inode *, struct file *);static void delay();static int open_lcd(struct inode *inode, struct file *file){    return 0;}static ssize_t read_lcd(struct file *file, char *buf, size_t len, loff_t *off){    return 0;}static ssize_t write_lcd(struct file *file, const char *buf, size_t len, loff_t *off){    unsigned char *lcd_data_addr;    unsigned char data;    lcd_data_addr = ioremap((unsigned long)0x30000000, (unsigned long)1);    data = *buf;    writeb(data, lcd_data_addr);    iounmap((void *)lcd_data_addr);    return *off;}static int ioctl_lcd(struct inode *inode, struct file *file, 	unsigned int cmd, unsigned long arg){    unsigned char *lcd_row_addr;    unsigned char *lcd_list_addr;    unsigned char *lcd_control_addr;    unsigned char *lcd_data_addr;    unsigned char ctrl;    unsigned char row;    unsigned char list;    unsigned char data;    int i, j;    lcd_control_addr = ioremap((unsigned long)0x3000000c, (unsigned long)1);    lcd_row_addr = ioremap((unsigned long)0x30000004, (unsigned long)1);    lcd_list_addr = ioremap((unsigned long)0x30000008, (unsigned long)1);    lcd_data_addr = ioremap((unsigned long)0x30000000, (unsigned long)1);    switch(cmd)    {	case 1:	    //printk("before ctrl=0x%x\n", ctrl);	    copy_from_user(&ctrl, (unsigned char *)arg, sizeof(unsigned char));	    //printk("ofter ctrl=0x%x\n", ctrl);	    writeb(ctrl, lcd_control_addr);	    delay();	    break;	case 2:	    copy_from_user(&row, (unsigned char *)arg, sizeof(unsigned char));	    writeb(row, lcd_row_addr);	    delay();	    break;	case 3:	    copy_from_user(&list, (unsigned char *)arg, sizeof(unsigned char));	    writeb(list, lcd_list_addr);	    delay();	    break;	case 4:	    copy_from_user(&data, (unsigned char *)arg, sizeof(unsigned char));	    //printk("kernel data=0x%x\n", data);	    for(i = 0; i < 234; i++)	    {		writeb(row, lcd_row_addr);		delay();		writeb(list, lcd_list_addr);		delay();		writeb(list, lcd_list_addr);		delay();		for(j = 0; j < 320; j++)		{		    writeb(data, lcd_data_addr);		    delay();		}		row = row + 0x01;	    }    }	    iounmap((void *)lcd_control_addr);    iounmap((void *)lcd_row_addr);    iounmap((void *)lcd_list_addr);    iounmap((void *)lcd_data_addr);    return - ENOTTY;}static int close_lcd(struct inode *inode, struct file *file){    return 0;}struct file_operations lcd_fops ={	open:open_lcd,	read:read_lcd,	write:write_lcd,	ioctl:ioctl_lcd,	release:close_lcd,};int init_module(void){    int ret;    ret = register_chrdev(lcd_major, "lcd", &lcd_fops);    if(ret < 0)     {	printk("lcd register error\n !!!");	return ret;    }    else    {	if(lcd_major == 0)	{	    lcd_major = ret;	    printk("lcd register success,lcd major is %d !!!\n", ret);	}	else	{	    printk("lcd register success,lcd major is %d !!!\n", lcd_major); 	}    }    return 0;}void cleanup_module(void){    int ret;    ret = unregister_chrdev(lcd_major, "lcd");    if (ret < 0)    {	printk("test_var unregister failure !!!\n");    }    else        {	printk("test_var unregister success!!!\n");    }}void delay() {    int i,j;    for(i=0;i<=1;i++)	for(j=0;j<=100;j++)	{       	    ;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -