- 论坛徽章:
- 0
|
static s32 memap_init(void)
{
lcd_dat.mmap_ptr = (u8 *)__get_free_pages(GFP_KERNEL , 2) ;
if(lcd_dat.mmap_ptr == NULL)
{
printk("kernel mem get pages error \n") ;
kfree(lcd_dat.dis_ptr) ;
return(1) ;
}
SetPageReserved(virt_to_page((void *)lcd_dat.mmap_ptr));
return(0) ;
}
static int mmap(struct file *file, struct vm_area_struct *vma)
{
unsigned long start = vma->vm_start;
unsigned long size = vma->vm_end - vma->vm_start;
if (remap_pfn_range(vma, start, (virt_to_phys(lcd_dat.mmap_ptr))>>PAGE_SHIFT, size, vma->vm_page_prot))
{
return -EAGAIN;
}
return 0;
}
/*----------------------------------------------------------
*函数名称 : mamap_dis
*功能 : 显示内核中的数据区内容
*参数输出 :
*参数输入 :
*
*-----------------------------------------------------------
*/
static void mamap_dis(void)
{
u32 i ;
u32 j ;
printk("\n") ;
for(i = 0 ; i < LCD_ROWNUM; i++)
{
printk("line %d\n", i) ;
for(j = 0; j < 81 ;j++)
{
printk("%02x", lcd_dat.mmap_ptr[i*81 + j]) ;
}
}
}
用户空间测试函数
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
enum ioctl_comm{
DIS_BUF ,
DIS_UPDAT ,
DIS_CLR ,
} ;
#define LCDDEV "/dev/lcd160"
int main(void)
{
int lcdfd ;
unsigned char *ptr ;
lcdfd = open(LCDDEV, O_RDWR) ;
if(lcdfd == -1)
{
printf("open file error \n") ;
}
if ((ptr = mmap(0, 160*81, PROT_READ | PROT_WRITE,
MAP_SHARED, lcdfd, 0)) == MAP_FAILED)
{
printf("mamp error") ;
exit(1) ;
}
ioctl(lcdfd , DIS_CLR) ;
// memset(ptr + 81*50 , 0xff , 81*10) ;
memset(ptr , 0xff , 81*100) ;
ioctl(lcdfd , DIS_BUF) ;
ioctl(lcdfd , DIS_UPDAT) ;
munmap(ptr , 160*81) ;
close(lcdfd) ;
}
|
[ 本帖最后由 dreamice 于 2009-1-5 15:01 编辑 ] |
|