刚才和一个朋友聊天,说 linux的门坎太高。控制硬件必须通过驱动。<br />我的这个例子是独创,通过地址映射直接控制硬件。<br />这可是花了我一个月功夫搞定的。<br />这样很多对linux不怎么了解的人很容易学会这个程序。<br />估计这个程序对15us以上的数据采集速度应该问题不大。<br />用到是是pc口。是我的那个A9 core板的一个例子。<br /><br />/*-------------------------------------------------------------------------------------<br />date:20070625<br />author: wkj<br />ver 1.0<br />contrl 8*8 led matrix example ,Application direct control HardWare<br />input:XXXXXX<br />output:return 0<br />---------------------------------------------------------------------------------------*/<br />#include <sys/types.h><br />#include <stdio.h><br />#include <stdarg.h><br />#include <stdlib.h><br />#include <string.h><br />#include <unistd.h><br />#include <fcntl.h><br />#include <errno.h><br />#include <signal.h><br />#include <time.h><br />#include <sys/time.h><br />#include <sys/ioctl.h><br />#include <sys/stat.h><br />#include <sys/file.h><br />#include "gpio.h"<br />#include "main.h"<br />#include "io.h"<br />#include <stdarg.h><br />#include <memory.h><br />#include <errno.h><br />#include <sys/types.h><br />#include <sys/socket.h><br />#include <sys/mman.h><br />#include <sys/ioctl.h><br />#include <fcntl.h><br />#include <signal.h><br />#include "font5x7.h"<br />#define DEVICE_FILE_NAME "scan_keyb"<br /><br /><br />void *map_base; //phy 0xffff f000 virtual address<br /><br />#define DEBUGMSG(x, y, args...) printf(y, ##args)<br /><br /><br />//#define DEBUGMSG(x, y, args...)<br />FILE *f;<br />int n,fd;<br /><br />int main(int argc, char *argv[])<br />{<br />char num,status=0;<br />int i,j,count;<br />int ch; <br /> <br />printf("start
");<br />if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1){<br /> DEBUGMSG(DEBUG_ERR, "gpio: Error opening /dev/mem
");<br /> exit(-1);<br /> }<br /> //map 0xffff<br />map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, AT91_SYS);//AT91_SYS = 0xffff f000<br /> <br />*((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_PER )))) = 0xFFFF0000; //PC31:PC16 as gpio<br />*((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_OER )))) = 0xFFFF0000;<br /><br />/*<br />8*8 LED mattix <br />1 A<br />2 B<br />3 C<br />4 D<br />5 E<br />6 F<br />7 G<br />8 H<br />Data(-) scan line(+)<br />D0-8-PC16 D0-1-PC31<br />D1-7-PC18 D1-6-PC20<br />D2-3-PC24 D2-A-PC30<br />D3-C-PC25 D3-4-PC27<br />D4-2-PC29 D4-H-PC17<br />D5-E-PC23 D5-B-PC28<br />D6-F-PC21 D6-G-PC19<br />D7-5-PC22 D7-D-PC26<br /><br />*/<br />for(;;) //dispaly all character in Fonts lib<br /> { <br /> *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0xFFFF0000; //0 default state<br /> usleep(1000000);<br /> for (i=0;i<8;i++) <br /> {<br /> *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR))))<br /> = (0x1<<31)|(0x1<<20)|(0x1<<30)|(0x1<<27)|(0x1<<17)|(0x1<<28)|(0x1<<19)|(0x1<<26); <br /> *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR))))<br /> =(0x1<<16)|(0x1<<18)|(0x1<<24)|(0x1<<25)|(0x1<<29)<br /> |(0x1<<23)|(0x1<<21)|(0x1<<22);//all col light off<br />/*<br /> //*((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR))))=0xffff0000;<br /> //= (0x1<<31)|(0x1<<20)|(0x1<<30)|(0x1<<27)|(0x1<<17)|(0x1<<28)|(0x1<<19)|(0x1<<26); <br /> *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR))))<br /> = (0x1<<31);//|(0x1<<20)|(0x1<<30)|(0x1<<27)|(0x1<<17)|(0x1<<28)|(0x1<<19)|(0x1<<26); <br /> *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) <br /> =(0x1<<16);//|(0x1<<18)|(0x1<<24)|(0x1<<25)|(0x1<<29)<br /> //|(0x1<<23)|(0x1<<21)|(0x1<<22);<br /> for(;;);<br />*/<br /> switch (i)<br /> {//select which col is on<br /> case 0://D0.PC31=1<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<31; <br /> break; <br /> case 1://D1.PC20=1<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<20;<br /> break;<br /> case 2://D2.PC30=1<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<30;<br /> break;<br /> case 3://D3.PC27=1<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<27;<br /> break;<br /> case 4://D4.PC17=1<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<17;<br /> break;<br /> case 5://D5.PC28=1<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<28;<br /> break;<br /> case 6://D6.PC19=1<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<19;<br /> break;<br /> case 7://D7.PC26=1<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<26;<br /> break; <br /> }<br /> //Put on col line Fonts[i+j]<br /><br /> for (j=0;j<8;j++) //LED matrix col 0..7<br /> {<br /> switch (j)//col dot<br /> {//1 mean the colum is on<br /> case 0://D0.PC16=0<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<16; <br /> break; <br /> case 1:<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<18; <br /> break; <br /> case 2:<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<24; <br /> break; <br /> case 3:<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<25; <br /> break; <br /> case 4:<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<29; <br /> break; <br /> case 5:<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<23; <br /> break; <br /> case 6:<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<21; <br /> break; <br /> case 7:<br /> *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<22; <br /> break; <br /> }<br /> printf("%d,%d
",i,j);<br /> <br /> usleep(300000);<br /> }<br /> }<br /> }<br />close(fd);<br />return 0;<br />}<br /> |
|