临沂市信鸽协会手机号:如何在内核中增加程序,并让系统开机就能执行该程序 - Slackware /Solaris...
来源:百度文库 编辑:偶看新闻 时间:2024/05/04 18:32:32
以LED灯的驱动程序为例:
1 将编写的gpiodrv.c源代码复制到linux-2.6.8.1/drivers/char 目录.
2 在目录的Kconfig文件中增加LED的编译配置选项,如下所示:
config "S3C2410_LED"
bool "S3C2410 LED Driver"
depends on ARCH_S3C2410
help
LED driver for the Samsung S3C2410.
3 在目录Makefile文件中增加对gpiodrv.c源代码的编译,如下所示
obj-$(CONFIG_S3C2410_LED) += gpiodrv.o
到此OK了,重新编译内核,执行吧.GOOD LUCK!
我用的gpiodrv.c是我自己写的,贴出来跟大家分享一下吧,虽然简陋了点儿.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define IOPORT_MAJOR 220
static struct file_operations gpio_ctl_fops={
owner: THIS_MODULE,
};
#define LED1_ON( ) __raw_writel(__raw_readl(S3C2410_GPFDAT) & (~0x10), S3C2410_GPFDAT)
#define LED2_ON( ) __raw_writel(__raw_readl(S3C2410_GPFDAT) & (~0x20), S3C2410_GPFDAT)
#define LED3_ON( ) __raw_writel(__raw_readl(S3C2410_GPFDAT) & (~0x40), S3C2410_GPFDAT)
#define LED4_ON( ) __raw_writel(__raw_readl(S3C2410_GPFDAT) & (~0x80), S3C2410_GPFDAT)
#define LED1_OFF( ) __raw_writel(__raw_readl(S3C2410_GPFDAT) | 0x10, S3C2410_GPFDAT)
#define LED2_OFF( ) __raw_writel(__raw_readl(S3C2410_GPFDAT) | 0x20, S3C2410_GPFDAT)
#define LED3_OFF( ) __raw_writel(__raw_readl(S3C2410_GPFDAT) | 0x40, S3C2410_GPFDAT)
#define LED4_OFF( ) __raw_writel(__raw_readl(S3C2410_GPFDAT) | 0x80, S3C2410_GPFDAT)
static void LedSet ( unsigned char led )
{
unsigned char LedStatus;
LedStatus = led;
if ( LedStatus & 1)
LED1_ON();
else
LED1_OFF();
if ( LedStatus & 2)
LED2_ON();
else
LED2_OFF();
if ( LedStatus & 4)
LED3_ON();
else
LED3_OFF();
if ( LedStatus & 8)
LED4_ON();
else
LED4_OFF();
}
static void LedDisp ( void )
{
LedSet(0x08);
mdelay(1000);
LedSet(0x04);
mdelay(1000);
LedSet(0x02);
mdelay(1000);
LedSet(0x01) ;
mdelay(1000);
LedSet(0x00);
mdelay(1000);
LedSet(0x01) ;
mdelay(1000);
LedSet(0x02);
mdelay(1000);
LedSet(0x04);
mdelay(1000);
LedSet(0x08);
mdelay(1000);
LedSet(0x00);
mdelay(1000);
}
static int __init gpio_init(void)
{
int err=0;
int arg=5;
__raw_writel(0x5500, S3C2410_GPFCON); //GPFCON = 0x5500;
__raw_writel(0xff, S3C2410_GPFUP); //GPFUP = 0xff ;
printk("gpio_init\n");
err=register_chrdev(IOPORT_MAJOR,"gpio",&gpio_ctl_fops);
if(err<0)
{
printk("fail to register\n");
return -1;
}
printk("success to register!!!\n");
while( arg-- )
{
printk("...\n");
LedDisp();
}
return 0;
}
static void __exit gpio_exit(void)
{
printk("release this device!!!\n");
unregister_chrdev(IOPORT_MAJOR,"gpio");
}
module_init(gpio_init);
module_exit(gpio_exit);