Davinci DM6446开发攻略——LINUX GPIO驱动源码移植
作者 佚名技术
来源 Linux系统
浏览
发布时间 2012-04-16
case 1: //gpio = 1
if(0==arg)
{
gpio_direction_output(DM644X_GPIO_LED0, 1);
}
else if(1==arg)
{
gpio_direction_output(DM644X_GPIO_LED1, 1);
}
else if(2==arg)
{
gpio_direction_output(DM644X_GPIO_BUZZER, 1);
}
else
{
return -EINVAL;
}
break;
default:
return -EINVAL;
}
}
/*定义驱动设备文件API,在linux系统当中,任何设备都可以当做文件的方式操作,这一点和单片机和MCU有很大差别*/
static const struct file_operations davinci_dm644x_gpio_fileops = {
.owner = THIS_MODULE,
.open = davinci_dm644x_gpio_open,
.ioctl = davinci_dm644x_gpio_ioctl,
};
static int __init davinci_dm644x_gpio_init(void) /*内核初始化会调用该函数*/
{
int ret;
gpio_direction_output(DM644X_GPIO_LED0, 1); //led0 is on
udelay(1);
gpio_direction_output(DM644X_GPIO_LED1, 1); //led1 is on
udelay(1);
gpio_direction_output(DM644X_GPIO_BUZZER, 1); //BUZZER is on
mdelay(500); /*初始化时,buzzer 发出声音500ms*/
gpio_direction_output(DM644X_GPIO_BUZZER, 1); //BUZZER is off
ret = register_chrdev(GPIO_MAJOR, DEVICE_NAME, &davinci_dm644x_gpio_fileops);
if(ret < 0)
{
printk(DEVICE_NAME " register falid!\n");
return ret;
}
printk (DEVICE_NAME" initialized\n");
return ret;
}
static void __exit davinci_dm644x_gpio_exit(void)
{
unregister_chrdev(GPIO_MAJOR, DEVICE_NAME);
}
module_init(davinci_dm644x_gpio_init);
module_exit(davinci_dm644x_gpio_exit);
MODULE_AUTHOR("xxx <>");
MODULE_DESCRIPTION("Davinci DM644x gpio driver");
MODULE_LICENSE("GPL");
这个驱动源码是一种比较老的驱动移植,即register_chrdev(GPIO_MAJOR, DEVICE_NAME, &davinci_dm644x_gpio_fileops),静态分配设备节点,适合linux-2.4.x和linux-2.6.10前的版本,当然也可以在2.6.18及以后的版本使用,现在新的版本char字符设备的移植可以参考davinci_resizer.c、davinci_previewer.c等文件.
上面的初始化函数调用udelay和msdelay,udelay一般适用于一个比较小的delay,如果你填的数大于2000,系统会认为你这个是一个错误的delay函数,因此如果需要2ms以上的delay需要使用mdelay函数.
![]() ![]() |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: linux 更改用户权限下一篇: 无法进入init 3 字符界面
关于Davinci DM6446开发攻略——LINUX GPIO驱动源码移植的所有评论