板子: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);
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 还是可以起到效果的,只是不知道靠不靠谱。