micro2440选用S3C2440处理器(和S3C2410差异不大),在其Linux源码中,和这个渠道相关的代码主要在arch/arm/mach-s3c2410和include/asm-arm/arch-s3c2410中,相关驱动在drivers目录中。
(1)DM9000 网卡驱动
kernel-2.6.13/drivers/net/dm9000x.c
(2)串口(包括三个串口驱动0,1,2,对应设备名/dev/tts/0,1,2)
kernel-2.6.13/drivers/serial/s3c2410.c
(3)实时时钟RTC 驱动
kernel-2.6.13/drivers/char/s3c2410-rtc.c
(4)LED 驱动
kernel-2.6.13/drivers/char/qq2440_leds.c
(5)按键驱动
kernel-2.6.13/drivers/char/qq2440_buttons.c
(6)触摸屏驱动
kernel-2.6.13/drivers/input/touchscreen/s3c2410_ts.c
(7)yaffs 文件体系源代码目录
kernel-2.6.13/fs/yaffs2
(8)USB 鼠标、键盘源代码
kernel-2.6.13/drivers/ usb/input/hid-input.c
(9)SD/MMC 卡驱动源代码目录(在2.6.13 内核中仅支撑2G 容量以内的SD 卡)
kernel-2.6.13/drivers/mmc
(10)Nand Flash 驱动
kernel-2.6.13/drivers/mtd/nand
(11)UDA1341 音频驱动目录
kernel-2.6.13/ sound/oss/uda1341.c
kernel-2.6.13/ drivers/l3
(12)LCD 驱动(包括3.5″, 7″, 8.4″, 10.4″, 12.4″, 15″等巨细的驱动)
kernel-2.6.13/drivers/video/s3c2410fb.c
(13)优盘支撑驱动
kernel-2.6.13/drivers/usb/storage
(14)中星微USB 摄像头驱动
kernel-2.6.13/drivers/usb/media/gspca
1.S3C2410_GPB5是端口编号,界说在regs-gpio.h中,
#define S3C2410_GPIO_BANKB
#define S3C2410_GPIONO(bank,offset)
#define S3C2410_GPB5
S3C2410共有130个GPIO,分为9组(GPA~GPJ),每组最多能够有32个,每个GPIO有2~4个可选功用,每组的操控寄存器空间有4个,例如关于GPB,有GPBCON、GPBDAT、GPBUP和Reserved,分别是功用装备、数据缓存、上拉使能和保存。
上面的S3C2410_GPB5便是GPIO的编号,也便是在号码空间(0~32*9-1)中的方位,bank是分组的基号码,offset是组内偏移量。
2.S3C2410_GPB5_OUTP是端口功用,界说在regs-gpio.h中,
#define S3C2410_GPB5_INP
#define S3C2410_GPB5_OUTP
GPBCON的第10、11两位用于装备GPB5的功用,00 = Input ,01 = Output
3.S3C2410 GPIO的操作函数
在hardware.h文件中有:
s3c2410_gpio_cfgpin
s3c2410_gpio_getcfg
s3c2410_gpio_pullup
s3c2410_modify_misccr //杂项装备
s3c2410_gpio_getirq
s3c2410_gpio_irqfilter
s3c2410_gpio_setpin
s3c2410_gpio_getpin
这些函数的实现在gpio.h中
void s3c2410_gpio_setpin(unsigned int pin, unsigned int to)
{
void __iomem *base = S3C2410_GPIO_BASE(pin);
unsigned long offs = S3C2410_GPIO_OFFSET(pin);
unsigned long flags;
unsigned long dat;
local_irq_save(flags);
dat = __raw_readl(base + 0x04);
dat &= ~(1 << offs);
dat |= to << offs;
__raw_writel(dat, base + 0x04);
local_irq_restore(flags);
}
4.S3C2410_GPIO_BASE和S3C2410_GPIO_OFFSET也是在regs-gpio.h文件中界说,
#define S3C2410_GPIO_BASE(pin)
#define S3C2410_GPIO_OFFSET(pin)
而在map.h中有:
#define S3C24XX_VA_GPIO
#define S3C2400_PA_GPIO
#define S3C2410_PA_GPIO
#define S3C24XX_SZ_GPIO
S3C2410_GPIO_BASE作用是:依据端口编号pin,算出端口地点组的虚拟基址。((pin) & ~31)是去掉pin傍边小于等于31的零头(清0低5位),>>1的原因是每组GPIO中最多能够有32个端口,操控这些端口需求4个寄存器空间,4个寄存器空间就需求4*4=16个字节进行编址,32/16=2,左移一位刚好分量。也便是说,上一组端口和下一组端口的编号相差32,而操控寄存器的地址相差16。
S3C2410_GPIO_OFFSET作用是:依据端口编号pin,算出端口地点组的偏移量。((pin) & 31)即去掉比31大的数(清0第6位以上的位)。
5. __raw_readl和__raw_writel
Linux对I/O的操作都界说在asm/io.h中,相应的在arm渠道下,就在asm-arm/io.h中。
#define __raw_readl(a)
#define __raw_writel(v,a) (__chk_io_ptr(a), *(volatile unsigned int __force
在include\linux\compiler.h中:
#ifdef __CHECKER__
……
extern void __chk_io_ptr(void __iomem *);
#else
……
# define __chk_io_ptr(x) (void)0
……
#endif
__raw_readl(a)打开是:((void)0, *(volatile unsigned int _force *)(a))。在界说了__CHECKER__的时分先调用__chk_io_ptr查看该地址,不然__chk_io_ptr什么也不做,*(volatile unsigned int _force *)(a)便是回来地址为a处的值。(void)xx的做法有时分是有用的,例如编译器打开了查看未运用的参数的时分需求将没有用到的参数这么弄一下才干编译经过。
CPU对I/O的物理地址的编程办法有两种:一种是I/O映射,一种是内存映射。__raw_readl和__raw_writel等是原始的操作I/O的办法,由此派生出来的操作办法有:inb、outb、_memcpy_fromio、readb、writeb、ioread8、iowrite8等。
6.local_irq_save和local_irq_restore
关中止和开中止,在asm-arm/system.h中界说。
#define local_irq_save(x)
({
__asm__ __volatile__(
“mrs %0, cpsr
“cpsid i”
: “=r” (x) : : “memory”, “cc”);
})
#define local_irq_save(x)
({
__asm__ __volatile__(
“mrs %0, cpsr
” orr %1, %0, #128\n”
” msr cpsr_c, %1″
: “=r” (x), “=r” (temp)
:
: “memory”, “cc”);
})