弱弱的问下led驱动问题

tbba321 2010-11-24 08:27:10
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/gpio.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>


#define DEVICE_NAME "leds"

static unsigned long led_table [] = {
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};

static unsigned int led_cfg_table [] = {
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
};

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

static struct miscdevice misc = {
.minor = MISC_DYNAMIC_MINOR,
.name = DEVICE_NAME,
.fops = &dev_fops,
};

static int __init dev_init(void)
{
int ret;

int i;

for (i = 0; i < 4; i++) {
s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
s3c2410_gpio_setpin(led_table[i], 0);
}

ret = misc_register(&misc);

printk (DEVICE_NAME"\tinitialized\n");

return ret;
}

static void __exit dev_exit(void)
{
misc_deregister(&misc);
}

module_init(dev_init);
module_exit(dev_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("FriendlyARM Inc.");

//以上是GPB5-GPB8的驱动,输出低电平就点亮LED
//那位大哥可以帮我注释下上面的语句吗?
//有什么方法可以学好嵌入式的驱动呢?有什么书是比较好的呢?基于2.6.~的
...全文
55 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
tbba321 2010-11-24
  • 打赏
  • 举报
回复
很多函数还是不太懂,感觉每本书说的都不一样。
一些驱动程序的程序,目前大多数书和程序都基于2.6了,应该是基于s3c2440的才对,我看了很多是基于s3c2410开发的书,感觉差别也很大,函数名字不一样啊
李迟 2010-11-24
  • 打赏
  • 举报
回复
//那位大哥可以帮我注释下上面的语句吗?
---------------------------
一个简单的点灯程序,填充结构体、初始化、退出,具体点灯由下面两个函数完成,它们已经定义好了的:
s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);
s3c2410_gpio_setpin(led_table[i], 0);
简单的内核驱动模块无非也是这个样子的。

//有什么方法可以学好嵌入式的驱动呢?有什么书是比较好的呢?基于2.6.~的
每个人的方法不一样,但有几点是相同的:多看书、多动手、多作笔记外加坚持下去。
至于书,网上有很多,很多人会讲LDD3啊、深入内核啊这些,个人觉得不合适作入门。很多介绍嵌入式的书都涉及到一些驱动程序的程序,目前大多数书和程序都基于2.6了。

个人现在主要在看LDD3和宋宝华那本驱动详解。
李迟 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tbba321 的回复:]
很多函数还是不太懂,感觉每本书说的都不一样。
一些驱动程序的程序,目前大多数书和程序都基于2.6了,应该是基于s3c2440的才对,我看了很多是基于s3c2410开发的书,感觉差别也很大,函数名字不一样啊
[/Quote]
内核版本不同,所用的API也不同。
至于很多s3c2440的书、资料,跟某些厂家、商家的某些行为不无关系。
我们真正要学习是驱动的思想、编写方法。——当然,入门过程是一个必须经历的过程。
此外,每本书都有每本书的优点与不好之处,这些需要我们自己来辨别。为自己所用才算真正学习东西。

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧