ans-lcd.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
- /*
- * /dev/lcd driver for Apple Network Servers.
- */
- #include <linux/types.h>
- #include <linux/errno.h>
- #include <linux/kernel.h>
- #include <linux/miscdevice.h>
- #include <linux/fcntl.h>
- #include <linux/init.h>
- #include <linux/delay.h>
- #include <asm/uaccess.h>
- #include <asm/sections.h>
- #include <asm/prom.h>
- #include <asm/ans-lcd.h>
- #include <asm/io.h>
- #define ANSLCD_ADDR 0xf301c000
- #define ANSLCD_CTRL_IX 0x00
- #define ANSLCD_DATA_IX 0x10
- static unsigned long anslcd_short_delay = 80;
- static unsigned long anslcd_long_delay = 3280;
- static volatile unsigned char* anslcd_ptr;
- #undef DEBUG
- static void __pmac
- anslcd_write_byte_ctrl ( unsigned char c )
- {
- #ifdef DEBUG
- printk(KERN_DEBUG "LCD: CTRL byte: %02xn",c);
- #endif
- out_8(anslcd_ptr + ANSLCD_CTRL_IX, c);
- switch(c) {
- case 1:
- case 2:
- case 3:
- udelay(anslcd_long_delay); break;
- default: udelay(anslcd_short_delay);
- }
- }
- static void __pmac
- anslcd_write_byte_data ( unsigned char c )
- {
- out_8(anslcd_ptr + ANSLCD_DATA_IX, c);
- udelay(anslcd_short_delay);
- }
- static ssize_t __pmac
- anslcd_write( struct file * file, const char * buf,
- size_t count, loff_t *ppos )
- {
- const char * p = buf;
- int i;
- #ifdef DEBUG
- printk(KERN_DEBUG "LCD: writen");
- #endif
- if ( verify_area(VERIFY_READ, buf, count) )
- return -EFAULT;
- for ( i = *ppos; count > 0; ++i, ++p, --count )
- {
- char c;
- __get_user(c, p);
- anslcd_write_byte_data( c );
- }
- *ppos = i;
- return p - buf;
- }
- static int __pmac
- anslcd_ioctl( struct inode * inode, struct file * file,
- unsigned int cmd, unsigned long arg )
- {
- char ch, *temp;
- #ifdef DEBUG
- printk(KERN_DEBUG "LCD: ioctl(%d,%d)n",cmd,arg);
- #endif
- switch ( cmd )
- {
- case ANSLCD_CLEAR:
- anslcd_write_byte_ctrl ( 0x38 );
- anslcd_write_byte_ctrl ( 0x0f );
- anslcd_write_byte_ctrl ( 0x06 );
- anslcd_write_byte_ctrl ( 0x01 );
- anslcd_write_byte_ctrl ( 0x02 );
- return 0;
- case ANSLCD_SENDCTRL:
- temp = (char *) arg;
- __get_user(ch, temp);
- for (; ch; temp++) { /* FIXME: This is ugly, but should work, as a