📄 lcd_12232f.c
字号:
break;
case IOCTL_READ: //从LCD设备中读取内容到ioclt_param 地址所在的空间
i = device_read(file, (char *)ioctl_param, 99, 0);
put_user('\0', (char *)ioctl_param + i);
break;
case IOCTL_LCD_ON:
case IOCTL_LCD_OFF:
WriteNios(ADR_LCD_COMMAND,LCD_CMD_ONOFF);
mdelay(1);
break;
case IOCTL_LCD_CLEAR:
WriteNios(ADR_LCD_COMMAND,LCD_CMD_CLEAR);
mdelay(2);
break;
case IOCTL_LCD_RESET :
WriteNios(ADR_LCD_COMMAND,LCD_COM_RESET);
mdelay(5);
break;
case IOCTL_LCD_HOME:
WriteNios(ADR_LCD_COMMAND,LCD_CMD_HOME);
mdelay(1);
break;
case IOCTL_LCD_CURSOR_LEFT:
WriteNios(ADR_LCD_COMMAND,LCD_CMD_MODES);
mdelay(1);
break;
case IOCTL_LCD_CURSOR_RIGHT:
WriteNios(ADR_LCD_COMMAND,LCD_CMD_MODES | LCD_CMD_MODES_SHIFT);
mdelay(1);
break;
case IOCTL_LCD_CURSOR_ON:
WriteNios(ADR_LCD_COMMAND,LCD_CMD_ONOFF | LCD_CMD_ONOFF_CURSOR);
mdelay(1);
break;
case IOCTL_LCD_DISP_SHOW_ON:
WriteNios(ADR_LCD_COMMAND,LCD_CMD_ONOFF | LCD_CMD_ONOFF_DISP);
mdelay(1);
break;
case IOCTL_LCD_CURSOR_GET:
break;
case IOCTL_LCD_CURSOR_SET:
break;
case IOCTL_LCD_GET_CURSOR_POS:
break;
case IOCTL_LCD_SET_CURSOR_POS:
break;
case IOCTL_LCD_CURSOR_BLINK:
WriteNios(ADR_LCD_COMMAND,LCD_CMD_ONOFF | LCD_CMD_ONOFF_BLINK);
mdelay(1);
break;
case IOCTL_LCD_ROW1_BLINK: WriteNios(ADR_LCD_COMMAND,LCD_CMD_FUNC | LCD_CMD_FUNC_EXPANSION);
mdelay(1); WriteNios(ADR_LCD_COMMAND,LCD_CMD_ROW1_BLINK);
mdelay(1);
break;
case IOCTL_LCD_DISP_LEFT:
break;
case IOCTL_LCD_DISP_RIGHT:
break;
case IOCTL_LCD_DISP_ON:
break;
case IOCTL_LCD_DISP_OFF:
break;
case IOCTL_LCD_LINE1: WriteNios(ADR_LCD_COMMAND,ADR_LCD_LINE1_OFFSET); line=1;
udelay(50);
break;
case IOCTL_LCD_LINE2:
WriteNios(ADR_LCD_COMMAND,ADR_LCD_LINE2_OFFSET); line=2;
udelay(50);
WriteNios(ADR_LCD_DATA,0xbb);
udelay(50);
WriteNios(ADR_LCD_DATA,0xb6);
udelay(50);
WriteNios(ADR_LCD_DATA,0xd3);
udelay(50);
WriteNios(ADR_LCD_DATA,0xad);
udelay(50);
WriteNios(ADR_LCD_DATA,0xc4);
udelay(50);
WriteNios(ADR_LCD_DATA,0xfa);
udelay(50);
break;
case IOCTL_LED_NORMAL:
WriteNios(0x02010850,LED_STATE_NORMAL);
udelay(50);
break;
case IOCTL_LCD_BACKGROUND_LED_OFF:
WriteNios(0x02010850,0x02);
udelay(50);
break;
case IOCTL_LCD_WARNING_LED_ON:
WriteNios(0x02010850,0x01);
udelay(50);
break;
}
return SUCCESS;
}
/* Module Declarations */
struct file_operations Fops = {
.read = device_read,
.write = device_write,
.ioctl = device_ioctl,
.open = device_open,
.release = device_release,
};
/*
* Initialize the module - Register the character device
*/
int init_module()
{
int ret_val;
ret_val = register_chrdev(MAJOR_NUM, DEVICE_NAME, &Fops);
if (ret_val < 0) {
printk(KERN_ALERT "%s failed with %d\n",
"Sorry, registering the character device ", ret_val);
return ret_val;
}
printk(KERN_INFO "Device %s registered\n", DEVICE_FILE_NAME);
mdelay(20);
WriteNios(ADR_LCD_COMMAND,LCD_COM_RESET);
mdelay(5);
WriteNios(ADR_LCD_COMMAND,LCD_COM_RESET);
udelay(200);
WriteNios(ADR_LCD_COMMAND,LCD_COM_RESET);
udelay(200); //在此之前,不能检查BF标志
WriteNios(ADR_LCD_COMMAND,LCD_NUMROWS | LCD_INTERFACE | LCD_CMD_FUNC); //00111000
udelay(50);
WriteNios(ADR_LCD_COMMAND,LCD_CMD_ONOFF); //显示状态开
udelay(50);
WriteNios(ADR_LCD_COMMAND,LCD_CMD_CLEAR); //清屏
mdelay(2);
//WriteNios(ADR_LCD_COMMAND,LCD_CMD_ONOFF | LCD_CMD_ONOFF_DISP | LCD_CMD_ONOFF_CURSOR | LCD_CMD_ONOFF_BLINK); WriteNios(ADR_LCD_COMMAND,LCD_CMD_ONOFF | LCD_CMD_ONOFF_DISP);
udelay(50); WriteNios(0x02010850,LED_STATE_NORMAL); mdelay(200);
WriteNios(ADR_LCD_DATA,0xb1);
udelay(50);
WriteNios(ADR_LCD_DATA,0xb1);
udelay(50);
WriteNios(ADR_LCD_DATA,0xbe);
udelay(50);
WriteNios(ADR_LCD_DATA,0xa9);
udelay(50);
WriteNios(ADR_LCD_DATA,0xbb);
udelay(50);
WriteNios(ADR_LCD_DATA,0xaa);
udelay(50);
WriteNios(ADR_LCD_DATA,0xc1);
udelay(50);
WriteNios(ADR_LCD_DATA,0xfa);
udelay(50);
WriteNios(ADR_LCD_DATA,0xcd);
udelay(50);
WriteNios(ADR_LCD_DATA,0xa8);
udelay(50);
WriteNios(ADR_LCD_COMMAND,ADR_LCD_LINE2_OFFSET);
udelay(50);
WriteNios(ADR_LCD_DATA,0xbb);
udelay(50);
WriteNios(ADR_LCD_DATA,0xb6);
udelay(50);
WriteNios(ADR_LCD_DATA,0xd3);
udelay(50);
WriteNios(ADR_LCD_DATA,0xad);
udelay(50);
WriteNios(ADR_LCD_DATA,0xc4);
udelay(50);
WriteNios(ADR_LCD_DATA,0xfa);
udelay(50);
return 0;
}
/*
* Cleanup - unregister the appropriate file from /proc
*/
void cleanup_module()
{
int ret;
ret = unregister_chrdev(MAJOR_NUM, DEVICE_NAME);
if (ret < 0)
printk(KERN_ALERT "Error: unregister_chrdev: %d\n", ret);
}
int WriteNios(unsigned long addr, unsigned long value)
{
int ret = 0;
unsigned long data;
unsigned long *p = (unsigned long *)addr;
data = (unsigned long)(value);
ret = put_user(data, p);
return ret;
}
int ReadNios(unsigned long addr, unsigned long * pValue)
{
int ret = 0;
unsigned long *p = (unsigned long *)addr;
if (get_user(*pValue, p))
return -EFAULT;
return ret;
}
module_init(init_module);
module_exit(cleanup_module);
#define author "HLT of TCB: Department 2"
#define description "A driver for LCD12232F device of the satellite project."
MODULE_AUTHOR(author);
MODULE_DESCRIPTION(description);
MODULE_SUPPORTED_DEVICE(DEVICE_NAME);
MODULE_LICENSE("GPL");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -