临沂市信鸽协会手机号:如何在内核中增加程序,并让系统开机就能执行该程序 - 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);