📄 lcd.c
字号:
#ifndef _KERNEL_
#define _KERNEL_
#endif
#ifndef MODULE
#define MODULE
#endif
/*
powerpc-linux-gcc -02 -D_KERNEL_ -DMODULE -I/usr/src/power-linux/include\
-c hello_lcd.c\
-o /tftpboot/powerpc-rootfs/tmp/hello_lcd.o
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/8xx_immap.h>
#define MODULE_VERSION "1.0"
#define MODULE_NAME "hello_lcd"
volatile immap_t *immap;
static void *io_base;
#define MAJOR_NUM 200
#define EXPANSIONPORT 0x80000000
#define EXPANSIONPORTLEN 16
#define PA0 0x8000
/*
const char *device_name="dev_name";
*/
static int _init init_module(void)
{
unsigned char i;
/*get immap value*/
immap=(immap_t *)(mfspr(struct IMMR)&0xFFFF0000);
/*sets up CSS for memory at 0x80000000,man 16.4.1*/
immap->im_memctl.memc_br7=0x80000401;
/*man 16.4.2*/
immap->im_memctl.memc_or7=0x80000FF6;
io_base=ioremap_nocache(EXPANSIONPORT,EXPANSIONPORTLEN);
/*toggle CSS and RD,WR*/
i=readb(io_base);
writeb(0xAA,io_base);
/*set PA0 to general I/O*/
immap->im_ioport.iop_papar&=~PA0;
immap->im_ioport.iop_padir|=PA0;
/*clear PA0,toggle for bit test*/
immap->im_ioport.iop_padat &=~PA0;
immap->im_ioport.iop_padat |=PA0;
/*print out register value*/
printk("immr =0x%08x\n",immap);
printk("io_base=0x%08x\n",io_base);
printk("BR5 =0x%08x\n",immap->im_memctl.memc_br7);
printk("or5 =0x%08x\n",immap->im_memctl.memc_or7);
printk("PAPAR =0x%04x\n",immap->im_ioport.iop_papar);
printk("PADIR =0x%04x\n",immap->im_ioport.iop_pardir);
/*everything initialized*/
printk(KERN_INFO "%s %s initialized\n",MODULE_NAME,MODULE_VERSION);
return 0;
/* int err;
err=register_blkdev(MAJOR_NUM,device_name,&device_ops);
if (err!=0)
primtk("Install the %s fail",device_name);
return err;*/
}
static void _exit cleanup_module(void)
{
unsigned char i;
/*toggle CSS again for testing*/
i=readb(io_base);
writeb(0xAA,io_base);
/*clear PA0 ,toggle for bit test*/
immap->im_ioport.iop_padat &=~PA0;
/*set PA0,toggle for bit test*/
immap->im_ioport.iop_padat |= PA0;
immap->im_ioport.iop_padir &=~PA0;
/*release the ioremap*/
iounmap(io_base);
printk(KERN_INFO "%s %s removed\n",MODULE_NAME,MODULE_VERSION);
/*int err;
err=unregister_blkdev(MAJOR_NUM,device_name);
if (err!=0)
printk("UnInstall the %s fail",device_name);
*/}
module_init(init_module);
module_exit(cleanup_module);
MODULE_AUTHOR("A0317170 gxguo");
MODULE_DESCRIPTION("hello_lcd");
EXPORT_NO_SYMBOLS;
/*
static int device_open(struct inode *inode,struct file *file)
{
/*to implement the open_file operation
mod_buffer=kmalloc(BUFFER_SIZE,GFP_KERNEL);
/*......
MOD_INC_USE_COUNT;
}
int device_release(struct inode *inode,struct file *file)
{
/*...
kfree(mod_buffer);
MOD_DEC_USE_COUNT;
return 0;
}
ssize_t device_read(struct file *file,char *buffer,size_t length,loff_t *offset)
{
/*...
if (offset>=BUFFER_SIZE)
{return 0;}
if ((offset+length)>BUFFER_SIZE)
return 0;
else
copy_to_user(buffer,mod_buffer+offset,length);
/*....
}
ssize_t device_write(struct file *file,const char *buffer,size_t length, loff_t *offset)
{
/*....
int len;
/*deal with buffer length here
/*...
copy_from_user(mod_buffer,buffer,length);
/*...
}
int device_ioctl(struct inode *inode,
struct file *file,
unsigned int ioctl_num,
unsigned long ioctl_param)
{
switch(ioctl_num)
{
case xxxx:
break;
default:
/*...
}
return 0;
}
int main()
{
/*initialize the variable
int fd;
fd=open("/dev/dev_name",O_RDWR);
nbyte=write(fd,buffer,BUFFER_SIZE);
/*other function
close(fd);
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -