分享

如何在内核中增加程序,并让系统开机就能执行该程序 - Slackware /Solaris...

 oskycar 2011-01-28

以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 <linux/config.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/spinlock.h>
#include <linux/interrupt.h>
#include <linux/delay.h>
#include <linux/devfs_fs_kernel.h>

#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/arch/regs-gpio.h>

#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);


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多