在这之前我们已经把字符设备驱动框架和模型,包括一些机制我们都讲的非常清楚了,在这里我在给大家总结一下。
首先大家理解几个概念,像物理地址和虚拟地址,IO映射和内存映射,操作IO我总结了有以下三种方法:
第一种方法:用的时候加上 *
volatile unsigned long *adccon=NULL;
volatile unsigned long *adcdat=NULL;
adccon=(volatile unsigned long *)ioremap(0x58000000,8);
adcdat=adccon+4;
iounmap(adccon);
iounmap(adcdat);
第二种方法:
__raw_readl(S3C2410_GPBCON);//S3C2410_GPBCON你可以看作是物理地址,本质是一个对IO管教的基地址加上一些偏移量。
__raw_writel(temp, S3C2410_GPBCON);//_raw_write
//自动将地址转化成虚拟地址
第三种方法:
static unsigned long led_table [] = {
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB8,
S3C2410_GPB10,
};
static unsigned int led_cfg_table [] = {
S3C2410_GPB5_OUTP, //0x01<<10 defined in refg-gpio.h
S3C2410_GPB6_OUTP,
S3C2410_GPB8_OUTP,
S3C2410_GPB10_OUTP,
};
s3c2410_gpio_setpin(unsigned int pin,unsigned int to)
s3c2410_gpio_getpin(unsigned int pin)
s3c2410_gpio_cfgpin(unsigned int pin,unsigned int function)
这三种后两种其实是一样的,自己一定要深入去理解。
然后我们来总结按键驱动程序:
第一:查询方法,read一直去读,这样是非常消耗cpu的。
第二:中断方法,我们还是去读,当没有按键发生的时候,我在此休眠,挂进队列,当按键发生了我们唤醒休眠,在去读按键。
第三:poll机制法,我们去读的时候,如果没有按键发生,开始的时候我们是让进程一直休眠下去,但是poll机制可以提供给定一个时间去读一次数据。
第四:异步通知,当我们没有按键按下的时候,应用程序不会来读取,当按键发生中断函数里面就通知应用程序来读。
紧接着我们讲了同步机制:信号量,自旋锁,互斥锁,原子变量,顺序锁,阻塞,非阻塞,RCU,完成接口等,(这些自己不懂得在去网上看看资料)
前面有几种常用的我在前面也讲得非常详细了。
最后一个是对定时器的理解,注意观察udelay.mdelay,sleep timer_list,这些我只是在这里提出来,给你们一些思路,全部写下来的话东西太多了。
在下一篇文章中我准备总结下我对input输入子系统,分离的理解,还有LCD,触摸屏。