打印

linux下像51一样编程序的一个例子(像用51一样用linux,甚至比51

[复制链接]
4751|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangkj|  楼主 | 2007-7-18 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚才和一个朋友聊天,说 linux的门坎太高。控制硬件必须通过驱动。
我的这个例子是独创,通过地址映射直接控制硬件。
这可是花了我一个月功夫搞定的。
这样很多对linux不怎么了解的人很容易学会这个程序。
估计这个程序对15us以上的数据采集速度应该问题不大。
用到是是pc口。是我的那个A9 core板的一个例子。

/*-------------------------------------------------------------------------------------
date:20070625
author: wkj
ver 1.0
contrl 8*8 led matrix example ,Application direct control HardWare
input:XXXXXX
output:return 0
---------------------------------------------------------------------------------------*/
#include <sys/types.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/file.h>
#include "gpio.h"
#include "main.h"
#include "io.h"
#include <stdarg.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <signal.h>
#include "font5x7.h"
#define DEVICE_FILE_NAME "scan_keyb"


void    *map_base;      //phy 0xffff f000 virtual address

#define DEBUGMSG(x, y, args...) printf(y, ##args)


//#define DEBUGMSG(x, y, args...)
FILE *f;
int n,fd;

int main(int argc, char *argv[])
{
char num,status=0;
int i,j,count;
int ch;       
 
printf("start ");
if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1){
     DEBUGMSG(DEBUG_ERR, "gpio: Error opening /dev/mem ");
     exit(-1);
        }
        //map 0xffff
map_base      = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, AT91_SYS);//AT91_SYS = 0xffff f000
    
*((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_PER )))) = 0xFFFF0000; //PC31:PC16 as gpio
*((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_OER )))) = 0xFFFF0000;

/*
8*8 LED mattix 
1                A
2                B
3                C
4                D
5                E
6                F
7                G
8                     H
Data(-)            scan line(+)
D0-8-PC16        D0-1-PC31
D1-7-PC18        D1-6-PC20
D2-3-PC24        D2-A-PC30
D3-C-PC25        D3-4-PC27
D4-2-PC29        D4-H-PC17
D5-E-PC23        D5-B-PC28
D6-F-PC21        D6-G-PC19
D7-5-PC22        D7-D-PC26

*/
for(;;) //dispaly all character in Fonts lib
  { 
    *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0xFFFF0000; //0  default state
    usleep(1000000);
    for (i=0;i<8;i++) 
      {
          *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR))))
            = (0x1<<31)|(0x1<<20)|(0x1<<30)|(0x1<<27)|(0x1<<17)|(0x1<<28)|(0x1<<19)|(0x1<<26); 
          *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR))))
            =(0x1<<16)|(0x1<<18)|(0x1<<24)|(0x1<<25)|(0x1<<29)
            |(0x1<<23)|(0x1<<21)|(0x1<<22);//all col light off
/*
          //*((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR))))=0xffff0000;
            //= (0x1<<31)|(0x1<<20)|(0x1<<30)|(0x1<<27)|(0x1<<17)|(0x1<<28)|(0x1<<19)|(0x1<<26); 
          *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR))))
                  = (0x1<<31);//|(0x1<<20)|(0x1<<30)|(0x1<<27)|(0x1<<17)|(0x1<<28)|(0x1<<19)|(0x1<<26); 
          *((volatile unsigned int*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) 
                  =(0x1<<16);//|(0x1<<18)|(0x1<<24)|(0x1<<25)|(0x1<<29)
            //|(0x1<<23)|(0x1<<21)|(0x1<<22);
          for(;;);
*/
          switch (i)
            {//select which col is on
              case 0://D0.PC31=1
              *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<31; 
              break;                  
              case 1://D1.PC20=1
              *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<20;
              break;
              case 2://D2.PC30=1
              *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<30;
              break;
              case 3://D3.PC27=1
              *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<27;
              break;
              case 4://D4.PC17=1
              *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<17;
              break;
              case 5://D5.PC28=1
              *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<28;
              break;
              case 6://D6.PC19=1
              *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<19;
              break;
              case 7://D7.PC26=1
              *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_SODR)))) = 0x1<<26;
              break;     
            }
          //Put on col line Fonts[i+j]

          for (j=0;j<8;j++) //LED matrix col 0..7
           {
            switch (j)//col dot
              {//1 mean the colum is on
              case 0://D0.PC16=0
                   *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<16;        
              break;                  
              case 1:
                   *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<18;        
              break;                  
              case 2:
                   *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<24;        
              break;                  
              case 3:
                   *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<25;        
              break;                  
              case 4:
                   *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<29;        
              break;                  
              case 5:
                   *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<23;        
              break;                  
              case 6:
                   *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<21;        
              break;                  
              case 7:
                   *((volatile unsigned long*)(map_base + ((PIOC_OFFSET + AT91_PIO_CODR)))) = 0x1<<22;        
              break;                  
         }
          printf("%d,%d ",i,j);
        
          usleep(300000);
           }
      }
  }
close(fd);
return 0;
}

相关帖子

沙发
flylongins| | 2007-7-18 18:37 | 只看该作者

re

不错,有想法。


include "font5x7.h"

这个是哪个头文件。

使用特权

评论回复
板凳
wangkj|  楼主 | 2007-7-18 22:44 | 只看该作者

ascii font lib

This is only example, not include all file

使用特权

评论回复
地板
王紫豪| | 2007-7-19 00:06 | 只看该作者

顶!!!支持

使用特权

评论回复
5
jack.king| | 2007-7-19 23:32 | 只看该作者

请问学习ARM7必须要学习LINUX吗?

请问学习ARM7必须要学习LINUX吗?

使用特权

评论回复
6
wangkj|  楼主 | 2007-7-20 08:04 | 只看该作者

想有钱图,用arm9+linux

arm7比单片机高点

使用特权

评论回复
7
wangharry| | 2007-7-25 08:43 | 只看该作者

wangkj果然高人中的高人

高人啊

使用特权

评论回复
8
wangkj|  楼主 | 2007-7-25 09:28 | 只看该作者

这个比较复杂,等我的板子回来了

再写个简单的,控制一个GPIO的。这样大家就更明白了。

这个控制了16个GPIO,而且还有图形点阵算法,所以很多人看晕了了很正常。

使用特权

评论回复
9
sklar| | 2007-7-25 11:54 | 只看该作者

..................

.....................

使用特权

评论回复
10
leifeng| | 2007-7-31 13:50 | 只看该作者

等待wangkj的PIO控制的例子

使用特权

评论回复
11
Hotpοwer| | 2007-8-1 03:12 | 只看该作者

通过此方法,可以控制PIO,usart,spi...哈哈

使用特权

评论回复
12
wangkj|  楼主 | 2007-8-1 08:16 | 只看该作者

确实如此!

楼上说的对。不过,这适合于对硬件了解,对os不太清楚的。
然而,uart,网络等这些用os的功能更合适。

使用特权

评论回复
13
wangkj|  楼主 | 2007-8-4 15:17 | 只看该作者

这是gpio的最简单程序

/*-------------------------------------------------------------------------------------
date:20070625
author: wkj
ver 1.0
contrl SPK GPIO example ,Application direct control HardWare
input:XXXXXX
output:return 0
---------------------------------------------------------------------------------------*/
#include <sys/types.h>
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/file.h>
#include "gpio.h"
#include "main.h"
#include "io.h"
#include <stdarg.h>
#include <memory.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <signal.h>
#define DEVICE_FILE_NAME "scan_keyb"


void    *map_base;      //phy 0xffff f000 virtual address

#define DEBUGMSG(x, y, args...) printf(y, ##args)


//#define DEBUGMSG(x, y, args...)
FILE *f;
int n,fd;

int main(int argc, char *argv[])
{
char num,status=0;
int i,j,count;
int ch;       
 
printf("start ");
if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1){
     DEBUGMSG(DEBUG_ERR, "gpio: Error opening /dev/mem ");
     exit(-1);
        }
        //map 0xffff
map_base      = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, AT91_SYS);//AT91_SYS = 0xffff f000
    
*((volatile unsigned int*)(map_base + ((PIOB_OFFSET + AT91_PIO_PER )))) = 0x1<<28; //PB28  gpio as SPEAKER
*((volatile unsigned int*)(map_base + ((PIOB_OFFSET + AT91_PIO_OER )))) = 0x1<<28;

for(j=0;j<1000;j++)
  { 
    *((volatile unsigned long*)(map_base + ((PIOB_OFFSET + AT91_PIO_CODR))))
            =  0x1 <<28; 
        printf("%d ",j);
    usleep(500000);
    *((volatile unsigned long*)(map_base + ((PIOB_OFFSET + AT91_PIO_SODR))))
            =  0x1 <<28; 
    usleep(500000);
  }
close(fd);
return 0;
}

使用特权

评论回复
14
wangkj|  楼主 | 2007-8-4 15:18 | 只看该作者

完整工程文件在amd.9966.org

自己找找,那个网站也是用这个arm9做的。
而且,这个arm9网站已经支持编译了

使用特权

评论回复
15
wangkj|  楼主 | 2007-8-4 15:23 | 只看该作者

这是一个内置gcc的arm9板子,编程比51还简单

测试地址:
telnet arm.9966.org
guest
123456

cd /root.big/win/speaker
make clean
make

这可是在arm中编译arm代码,连移植都省了。
 

/root.big/win/这个目录是windows共享的,用网上邻居就可以直接编辑其中的文件!
编译的时候,telnet到主机,然后直接执行make就行了!
51还需要在windows下安装个keil c,这个在windows下不需要安装任何软件。

使用特权

评论回复
16
wangkj|  楼主 | 2007-8-4 15:25 | 只看该作者

所有的软件下载地址:

arm.9966.org/ipk

使用特权

评论回复
17
xwj| | 2007-8-4 18:14 | 只看该作者

我觉得,还是先定义几个宏方便些,

这样子就算再简单初学者也会看得眼花缭乱的.

使用特权

评论回复
18
xwj| | 2007-8-4 18:18 | 只看该作者

wangkj,你那网站最好再加个留言板,临时网站一般人都懒得

使用特权

评论回复
19
xwj| | 2007-8-4 18:23 | 只看该作者

或者匿名发言,或者自动注册都行

自己去改下ASP教本吧,很简单的

使用特权

评论回复
20
drq1997| | 2007-8-5 00:11 | 只看该作者

arm 占位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

581

主题

9976

帖子

24

粉丝