|
上次是用文件方式操作io,这次换成了设备地址映射到虚拟地址,操作虚拟地址来操作io。但是这两种方式驱动oled都非常慢,有很明显的扫描感。不知道大家用什么方式操作f1c100s的io,理论上不应该这么慢的。
https://github.com/kekemuyu/f1c100s/tree/master/oled_spi
mmap部分代码:
- #include"devmem.h"
- int tempfd;
- void Openfile(){
- if((tempfd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
-
- }
- void Closefile(){
- close(tempfd);
- }
- void Writebit(long target,int bitsize ,char value){
-
- void *map_base, *virt_addr;
- unsigned long read_result, writeval;
- int fd;
- fd = fcntl(tempfd, F_DUPFD, 0);
- if(fd<0){
- FATAL;
- }
- // if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) FATAL;
- // printf("/dev/mem opened.\n");
- // fflush(stdout);
- /* Map one page */
- map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
- if(map_base == (void *) -1) FATAL;
- // printf("Memory mapped at address %p.\n", map_base);
- // fflush(stdout);
-
- virt_addr = map_base + (target & MAP_MASK);
-
- read_result = *((unsigned long *) virt_addr);
-
- // printf("Value at address 0x%X (%p): 0x%X\n", target, virt_addr, read_result);
- // fflush(stdout);
-
- // printf("bitsize:%d;value:%d\n",bitsize,value);
- if(value==0){
- read_result&=~(1<<bitsize);
- }else{
- read_result|=1<<bitsize;
- }
- writeval=read_result;
- *((unsigned long *) virt_addr)=writeval;
- read_result=*((unsigned long *) virt_addr);
-
- // printf("Written 0x%X; readback 0x%X\n", writeval, read_result);
- // fflush(stdout);
-
- if(munmap(map_base, MAP_SIZE) == -1) FATAL;
- close(fd);
- }
复制代码 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|