Linux 驱动学习笔记
最近用mini2440学习linux驱动,做一下笔记
LED驱动:
static int __init dev_init(void)
在驱动的初始化函数中经常看到,__init 前缀, 这个在下面文件中定义
file:/include/linux/init.h
主要是将这个函数放在init段section中,这样可以在执行完成后,释放内存。
关于s3c2410_gpio_cfgpin函数,只能了解到,设置某个GPIO的功能,但是怎么实现的没看明白,好像还用到虚拟地址了,最后也没有发现是怎么配置的GPCON寄存器的,
而且,后面
有个地方讲不通: (这个地方应该是都不满足 switch 的条件,所以, function 不改变)
#define S3C2410_GPIO_LEAVE (0xFFFFFFFF)
#define S3C2410_GPIO_INPUT (0xFFFFFFF0) /* not available on A */
#define S3C2410_GPIO_OUTPUT (0xFFFFFFF1)
#define S3C2410_GPIO_IRQ (0xFFFFFFF2) /* not available for all */
#define S3C2410_GPIO_SFN2 (0xFFFFFFF2) /* bank A => addr/cs/nand */
#define S3C2410_GPIO_SFN3 (0xFFFFFFF3) /* not available on A */
而
#define S3C2410_GPB5_OUTP (0x01 << 10)
所以,
s3c2410_gpio_cfgpin(S3C2410_GPB5, S3C2410_GPB5_OUTP);
switch (function)
根本对不上号?
s3c2410_gpio_cfgpin(S3C2410_GPB5, S3C2410_GPB5_OUTP);
s3c2410_gpio_cfgpin(37, S3C2410_GPB5_OUTP);
s3c2410_gpio_cfgpin(37, 0x01 << 10 );
剩下的37怎么变换出mask,怎么得到GPCON的地址没看懂?
这个在 /arch/arm/mach-s3c2410/include/mach/regs-gpio.h 中定义
#define S3C2410_GPB5 S3C2410_GPIONO(S3C2410_GPIO_BANKB, 5)
#define S3C2410_GPB5_INP (0x00 << 10)
#define S3C2410_GPB5_OUTP (0x01 << 10)
#define S3C2410_GPB5_nXBACK (0x02 << 10)
S3C2410_GPIONO (S3C2410_GPIO_BANKB , 5)
#define S3C2410_GPIONO (bank,offset) ((bank) + (offset))
#define S3C2410_GPIO_BANKA (32*0)
#define S3C2410_GPIO_BANKB (32*1)
可以看一下这篇文章:
http://www.linuxidc.com/Linux/2011-06/37322.htm