驱程序般open函数定义:int(*open)(struct inode *inode, struct file *filp)
LED点亮应用层主函数
[code=C/C++][/code]void main(void)
{
int testdev
int i
char buf[10]
testdev = open ("/dev/test",O_RDWR)//应该用应用层默认Open函数吧
if(testdev == -1)
{
printf("Cann't open file...../n")
exit(0)
}
printf("buf = 0x%x/n",buf)
read(testdev,buf,10)//功opentestdev值0能够file文件描述符呢
write(testdev,buf,1)
led_ctl.port='G'
led_ctl.bit=5
led_ctl.value=0
ioctl(testdev,GPIO_IO_SET_GPG,&led_ctl)
printf("%s",buf)
pause()
close(testdev)
}
我疑问:
1.驱程序open函数:int(*open)(struct inode *inode, struct file *filp)
哪使用啊
2.驱open函数般用做啊
3.文代码功opentestdev值0能够file文件描述符呢
才始习Linux设备驱发借本书代码没注释面驱意思懂希望各位神指点指点万谢
面都我编写字符设备驱代码请问static int read_test()函数始static void release_test()函数参数内部代码意义
万谢
采纳前加100谢谢
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/errno.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/module.h>
unsigned int test_major = 0
static int read_test(struct inode *node,struct file *fle,char *buf,int count)
{
int left
if (access_ok(VERIFY_WRITE, buf, count))
{
for (left = countleft >0left--)
{
_put_user('a',buf)
buf ++
}
}
return count
}
static int write_test(struct inode *node, struct file *fle, char *buf, int count)
{
return count
}
static int open_test(struct inode *inode,struct file *file)
{
try_module_get(THIS_MODULE)
return 0
}
static void release_test(struct inode *inode, struct file *file)
{
module_put(THIS_MODULE)
}
struct file_operations test_fops =
{
.owner = THIS_MODULE,
.read = read_test,
.write = write_test,
.open = open_test,
.release = release_test,
}
int init_module()
{
int result
result = register_chrdev(0,"test,&test_fops")
if (result <0)
{
printk(KERN_INFO "dddddddddddddddd")
return result
}
return 0
}
/*这是一个简单的用户程序与驱动交互的例程*/void main(void)
{
int testdev
int i
char buf[10]
/* 这里是用的open系统调用,是linux内核接口函数,不是库函数,返回fd,详细请google ,这个open最终会调用驱动中的open函数(代码流程是这样的open()->sys_open()->filp_open()->dentry_open()->驱动open)*/
testdev = open ("/dev/test",O_RDWR)
if(testdev == -1)
{
printf("Cann't open file...../n")
exit(0)
}
printf("buf = 0x%x/n",buf)
/* 下面的read write 和ioctl是用户程序和内核驱动的最直接的交互方式 */
read(testdev,buf,10)
write(testdev,buf,1)
led_ctl.port='G'
led_ctl.bit=5
led_ctl.value=0
ioctl(testdev,GPIO_IO_SET_GPG,&led_ctl)
printf("%s",buf)
pause()
close(testdev)
}
你基础有点弱,慢慢学习就知道了,参考下《linux设备驱动程序》
linux的系统是有很多的版本的,比如说linux的redhat,centos,Ubuntu等系统,不懂系统的版本不同命令也是不同的,你说的应该是centos或rhel吧。这样的系统在6版本和7版本的命是不同的7版本的命令的守护进程不是init而是systemctl。所以只有7版本的命令是systemctl,但是6版本的是service。关于7版本更多的信息可以参考linux就该这样学。希望能够帮助到你欢迎分享,转载请注明来源:内存溢出
评论列表(0条)