2440 led module

sbc2440_leds.c

#include  < linux / config.h >
#include 
< linux / module.h >
#include 
< linux / kernel.h >
#include 
< linux / fs.h >
#include 
< linux / init.h >
#include 
< linux / devfs_fs_kernel.h >
#include 
< linux / miscdevice.h >
#include 
< linux / delay.h >
#include 
< asm / irq.h >
#include 
< asm / arch / regs - gpio.h >
#include 
< asm / hardware.h >

#define  DEVICE_NAME    "leds2"
#define  LED_MAJOR 233

static  unsigned  long  led_table []  =   {
    S3C2410_GPB5,
    S3C2410_GPB6,
    S3C2410_GPB7,
    S3C2410_GPB8,
}
;

static  unsigned  int  led_cfg_table []  =   {
    S3C2410_GPB5_OUTP,
    S3C2410_GPB6_OUTP,
    S3C2410_GPB7_OUTP,
    S3C2410_GPB8_OUTP,
}
;

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 sbc2440_leds_fops  =   {
    .owner    
=    THIS_MODULE,
    .ioctl    
=    sbc2440_leds_ioctl,
}
;

static   int  __init sbc2440_leds_init( void )
{
    
int ret;
    
int i;

    ret 
= register_chrdev(LED_MAJOR, DEVICE_NAME, &sbc2440_leds_fops);
    
if (ret < 0{
      printk(DEVICE_NAME 
" can't register major number ");
      
return ret;
    }


    devfs_mk_cdev(MKDEV(LED_MAJOR, 
0), S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEVICE_NAME);
    
    
for (i = 0; i < 4; i++{
        s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
        s3c2410_gpio_setpin(led_table[i], 
1);
    }


    printk(DEVICE_NAME 
" initialized ");
    
return 0;
}


static   void  __exit sbc2440_leds_exit( void )
{
    devfs_remove(DEVICE_NAME);
    unregister_chrdev(LED_MAJOR, DEVICE_NAME);
}


module_init(sbc2440_leds_init);
module_exit(sbc2440_leds_exit);


Makefile

KERNELDIR  =/ home / fown / kernel / kernel - 2.6 . 13
PWD 
:=  $(shell pwd)
INSTALLDIR 
=/ lib

CC    
=/ usr / local / arm / 3.4 . 1 / bin / arm - linux - gcc

obj
- :=  sbc2440_leds . o

modules
:
    $(MAKE) 
- C $(KERNELDIR) M = $(PWD) modules

modules_install
:
    cp sbc2440_leds
. ko $(INSTALLDIR)

clean
:
    rm 
- rf  *. *~  core  . depend  .*. cmd  *. ko  *. mod . . tmp_versions

. PHONY :  modules modules_install clean

make modules

make -C /home/fown/kernel/kernel-2.6.13 M=/home/fown/ldd/leds modules
make[1]: Entering directory `/home/fown/kernel/kernel-2.6.13'

  WARNING: Symbol version dump /home/fown/kernel/kernel-2.6.13/Module.symvers
           is missing; modules will have no dependencies and modversions.

  CC [M]  /home/fown/ldd/leds/sbc2440_leds.o
  Building modules, stage 2.
  MODPOST
  CC      /home/fown/ldd/leds/sbc2440_leds.mod.o
  LD [M]  /home/fown/ldd/leds/sbc2440_leds.ko
make[1]: Leaving directory `/home/fown/kernel/kernel-2.6.13'


ledctrl.c
#include  < stdio.h >
#include 
< fcntl.h >
#include 
< linux / delay.h >   
#include 
< unistd.h >


 
int  main( int  argc,  char   ** argv)
 
{
  
int fd;
 
int  led_no;

 sscanf(argv[
1], "%d"&led_no); 
 fd 
= open("/dev/leds2", O_RDWR);
 
if (fd < 0)
 
{
    perror(
"can't open device leds");
    exit(
1);
 }

 
while(1)
{
  ioctl(fd, 
1, led_no);
   printf(
"led:%d on", led_no);
   usleep(
50000); //sleep 50 ms
   ioctl(fd, 
0, led_no);
   usleep(
50000);
}
 

 close(fd);
 
return 0;
 }
 

 arm-linux-gcc -o ledctrl ledctrl.c

---------------------------------------------------
2440
---------------------------------------------------
insmod sbc2440_leds.ko
./ledctrl 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值