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


原文地址:https://www.cnblogs.com/yanhc/p/2175239.html