2440 led 驱动程序

微笑在这里就不多吐槽东山大师的口音了,总之juo的不quo......

准备工作:     jz2440       VMware ubuntu12      linux-2.6.22.6   

                        arm-linux-gcc-3.4.5-glibc-2.3.6

                      mkyaffs2image    fs_mini_mdev     

驱动程序:s3c24xx_leds.c

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

#define DEVICE_NAME     "leds"       
#define LED_MAJOR       231          
 //定义一下设备名 设备号

#define IOCTL_LED_ON    0
#define IOCTL_LED_OFF   1

static unsigned long led_table [ ] = {
    S3C2410_GPF4,
    S3C2410_GPF5,
    S3C2410_GPF6,
    S3C2410_GPF7,  //这个开发板最奇妙的地方,视频和原理图不配套  东山大师还讲得那么起劲...额也是醉嘞~~~
};
static unsigned int led_cfg_table [ ] = {
    S3C2410_GPF4_OUTP,
    S3C2410_GPF5_OUTP,
    S3C2410_GPF6_OUTP,
    S3C2410_GPF7_OUTP,
};


static int s3c24xx_leds_open(struct inode *inode, struct file *file)
{
    int i;
    
    for (i = 0; i < 4; i++) {

        s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);  //在/linux2.6.22.6/arch/arm/mach-s3c2410/include/regs_gpio.h定义
    }
    return 0;
}

static int s3c24xx_leds_ioctl(                //@相关资料

    struct inode *inode, 
    struct file *file, 
    unsigned int cmd, 
    unsigned long arg)
{
    if (arg > 4) {
        return -EINVAL;        //    #define EINVAL 1使用时:int rc = -EINVAL <==> int rc = -1     当作常量来使用

    }
    
    switch(cmd) {
    case IOCTL_LED_ON:


        s3c2410_gpio_setpin(led_table[arg], 0); 

 //作用:设置相应GPIO口的值,如pin=S3C2410_GPB5    to=0   则:设置S3C2410_GPB5的输出值为0

                                                      如pin=S3C2410_GPB5    to=1   则:设置S3C2410_GPB5的输出值为1
        return 0;


    case IOCTL_LED_OFF:


        s3c2410_gpio_setpin(led_table[arg], 1);
        return 0;


    default:
        return -EINVAL;
    }
}

static struct file_operations s3c24xx_leds_fops = {                  

  
    .owner  =   THIS_MODULE,    
    .open   =   s3c24xx_leds_open,     
    .ioctl  =   s3c24xx_leds_ioctl,

      //   硬件设备接口层用来描述驱动程序与设备的交互

         .owner=THIS_MODULE, //指向拥有该结构的模块,内核使用该结构维护模块使用计数
  .open=DS18B20_open, //打开设备函数
  

};

static int __init s3c24xx_leds_init(void)
{
    int ret;


    ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &s3c24xx_leds_fops);   //前面定义过
    if (ret < 0) {
      printk(DEVICE_NAME " can't register major number\n");
      return ret;
    }
    
    printk(DEVICE_NAME " initialized\n");
    return 0;
}


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

module_init(s3c24xx_leds_init);
module_exit(s3c24xx_leds_exit);


make menuconfig

      Device Drivers-->

          LED Devices---->  然后把里面的都取消掉

make zImage   然后烧内核

make modules   

linux-2.6.22.26/drivers/char/目录下会生成相应的.ko文件  然后copy到文件系统的目录下

......好多然后


视频和光盘驱动程序都不匹配   那么测试程序就自己想办法吧

ledtest.c  :

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/ioctl.h>
int main(int argc,char *argv[])
{
int num;
int statue;
int fd;


sscanf(argv[1],"%d",&num);
sscanf(argv[2],"%d",&statue);

fd = open("/dev/leds",O_RDWR);
if(fd<0)
    {
     perror("open dev/leds\n");
     return (-1);
    }

printf("open /dev/leds\n");

ioctl(fd,statue,num);
printf("statue=%d,num=%d\n",statue,num);
close(fd);
return (0);

}   


arm-linux-gcc ledtest.c -o ledtest

cp ledtest /fs_mini_mdev/bin

cd ..

./mkyaffs2image fs_mini_mdev led.yaffs2

然后烧写到板子上



板子启动后  insmod s3c24xx_leds.ko

                      mknod /dev/leds c 231 0

                     ledtest 1 1  

ok  完成   大概就这么多


相关资料

    ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的参数个数如下:int ioctl(int fd, int cmd, …);其中fd就是用户程序打开设备时使用open函数返回的文件标示符,cmd就是用户程序对设备的控制命令,至于后面的省略号,那是一些补充参数,一般最多一个,有或没有是和cmd的意义相关的。ioctl函数是文件结构中的一个属性分量,就是说如果你的驱动程序提供了对ioctl的支持,用户就能在用户程序中使用ioctl函数控制设备的I/O通道。(百度)

    strcmp 比较两个字符串

    atoi 把字符串转换成整型数的一个函数


 此贴用来纪念纠结的上个星期~~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值