FS2410 学习(三)

板子:FS2410

内核版本:linux-3.6


关键字:GPIO ,UDEV,MDEV

板子上led 灯 所用的GPIO:




FS2410 GPIO介绍:

GPA:23-output port

GPB:11-input/output port

GPC:16-input/output port

GPD:16-input/output port

GPE:16-input/output port

GPF: 8-input/output port

GPG:16-input/output port

GPH:11-input/output port

http://wenku.baidu.com/view/1ba06a135f0e7cd1842536b0.html


linux 中代码实现简单的跑马灯程序

static void cfg_led(void)
{
        int i;
        for (i = 4;i < 8;i++)
        {
                s3c2410_gpio_cfgpin(S3C2410_GPF(i),0x1<<(i*2));  //宏S3C2410_GPF(i),指的是GPF寄存器的第i个管脚。设置4,5,6,7为输出功能。
        }
        while(1)
        {
                printk("%s[%d]\n",__func__,__LINE__);
                for(i = 4;i < 8;i++)
                {
                        s3c2410_gpio_setpin(S3C2410_GPF(i),0);  //设为低电平,灯亮
                        ssleep(1);
                        s3c2410_gpio_setpin(S3C2410_GPF(i),1);  //设为高电平,灯灭
                }
                //ssleep(3);
        }
}

创建设备时,了解到了udev,可以代替devfs来自动生成设备节点,下面做了尝试:

a.动态分配设备号:

        ret = alloc_chrdev_region(&dev_num,0,1,"sprink_led");

        if (ret)
        {
                printk("alloc char dev error\n");
                return -1;
        }
        else
        {
                major = MAJOR(dev_num);
                minor = MINOR(dev_num);
                printk("%s[%d] major=%d minor=%d\n",__func__,__LINE__,major,minor);
        }

b.创建cdev,字符设备注册:

        my_cdev = cdev_alloc();

        if (my_cdev == NULL)
        {
                printk("cdev_alloc error\n");
                return -1;
        }

        printk("%s[%d]\n",__func__,__LINE__);
        cdev_init(my_cdev,&fpos);
        my_cdev->owner = THIS_MODULE;
        ret = cdev_add(my_cdev,dev_num,1);


c.创建类:

        my_class = class_create(THIS_MODULE,"led_class");
        if (IS_ERR(my_class))
        {
                printk("class create error\n");
                return -1;
        }
        printk("%s[%d]\n",__func__,__LINE__);
创建类是为了自动生成设备,这边没有细细看过,是否这边的类和C++中相似,所有用此类生成的设备,都会继承它的特征。

执行之后,会在/sys/class 和/devices/virtual/led_class下生成一个led_class文件夹.

从下图可以看到/sys/class/led_class 下只是一个指向/devices/virtual/led_class/sprink_led0/的link。


d.创建设备:

 dev     =       device_create(my_class,NULL,dev_num,NULL,"sprink_led%d",minor);
创建设备之后再sprink_led0的文件夹下面会多一个dev的文件。

文件中记录着设备号。


UDEV,MDEV:

上面的只是驱动层面的铺垫,要自动生成设备需要UDEV的支持。但是UDEV的移植到现在还是有问题,只能暂时先用MDEV代替一下。

MDEV是busybox下的一个简化的UDEV。主要实现热插拔,但是,mdev -s 还是可以起到效果的,只是不知道靠不靠谱。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值