Linux內核為2.6.32.2
源碼分析工具source insight
前言:在裸機中操作幾個gpio口很簡單,對控制寄存器和數據寄存器進行配置即可,但要在linux系統中實現同樣的功能還是得費上一番周折的。
以下是驅動的源碼。
#include <……>
#define DEVICE_NAME "leds" //設備名
static unsigned long led_table [] = {
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};
static unsigned int led_cfg_table [] = {
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
};
static int sbc2440_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
s3c2410_gpio_setpin(led_table[arg], !cmd);
return 0;
default:
return -EINVAL;
}
}
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.ioctl = sbc2440_leds_ioctl,
};
static struct miscdevice misc = { //雜項設備結構體
.minor = MISC_DYNAMIC_MINOR, //次設備號
.name = DEVICE_NAME,
.fops = &dev_fops,
};
static int __init dev_init(void)
{
int ret;
int i;
for (i = 0; i < 4; i++) {
s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
s3c2410_gpio_setpin(led_table[i], 0);
}
ret = misc_register(&misc); //混雜設備注冊
printk (DEVICE_NAME"\tinitialized\n");
return ret;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc); //混雜設備注銷
}
module_init(dev_init); //模塊加載函數
module_exit(dev_exit); //模塊卸載函數
MODULE_LICENSE("GPL"); //證書
MODULE_AUTHOR("FriendlyARM Inc."); //作者
以上列出了加入簡單注釋的MINI2440led驅動程序的源碼,頭文件已被省去。對於上述的驅動,我們主要分析這個驅動的整體框架以及裡面涉及到的一些重要的函數和宏定義內容。