打印

驱动移植的一些经验分享

[复制链接]
119|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一片混沌|  楼主 | 2018-9-27 15:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
驱动必须是在编译好了的内核上才能正常的工作

register_chrdev主设备号,名字,注册函数



用int first_drv()

{

去调用注册函数;

return 0;

}



用module_init(first_drv)

编译内核的驱动程序的时候用到的是arm-linux-gcc因为是要放到开发板当中运行啊

内核是依赖主设备号和次设备号知道这个file_operation



用cat /proc/devices来查看已经安装好的驱动程序,但是要注册节点才能正常工作。可以用mknod/dev/111 主设备号 次设备号来创建



在cd /sys/class目录下查看到有first_drv这个类 cd first_drv这个目录有xyz命名的节点cat dev





可用val的值1,2,3控制三盏灯的亮灭,也能通过取此设备号来控制它的亮灭

int minor =MINOR(file->f_dentry->d_inode->i_rdev)



在韦东山的光盘上面有详细的代码,这个是比较官方的代码





我们用insmod second_drv.ko加载进去之后哦可以用lsmod命令来查看是不是真的生成了这个驱动:可以看到大小,被使用者等等信息 用cat /proc/devices可以看到主次设备号信息 用ls/dev/buttons -l 来查看是否已经生成了这个节点,这些药保证正确无误才能进行下面的驱动开发工作





用fsync()函数实时的传入到磁盘当中,就像我们用fflush一样把printf的内容实时的传入

#include

#include

const char* journal_filename = “journal.log”;

void write_journal_entry (char* entry)

{

int fd = open (journal_filename, O_WRONLY | O_CREAT |O_APPEND, 0660);

write (fd, entry, strlen (entry));

write (fd, “\n”, 1);

fsync (fd);

close (fd);

}





我们说的linux低级输入输出系统指的是文件描述付fd,标准描述符是FILE 返回的是指针;





当我写的第一个驱动提示说没有 linux/module.h: No such file or directory

#include 这个时候就是因为我的Ubuntu上面没有编译内核我们去下载官网的内核https://www.kernel.org/pub/linux/kernel/ 这个不能用GCC来编译要求我们写好Makefile然后从make就行了,我们看到这个有很多错误,比如找不到宏,或者没有定义宏,找不到的直接删除掉,没有定义的我们搜索看看别人内核是如何使用他的,有些函数的参数或者用法不同,我们可以进si写出一部分函数名,就有扩展的选项供你查看,还有就是我们要找某一个函数在哪儿使用可以用crtl+/,或者鼠标右键lookupreference。



内核的启动过程:根据machid 找到相应的单板.c的文件编译,但是我们可以使用相应的单板的make...defautconfig就不用这一过程了,那么就是我们的启动参数里面的波特率没有设置好











按键中断的方法驱动:1、按键按下 2、CPU发生中断 3、跳到异常向量表 4、保存中断环境 5、执行中断处理程序6、恢复





中断的处理过程:irq_desc

1.清中断 2.中断处理程序 3.



用命令exec 5cat /proc/interrupts就能产看buttons所有的中断号码;





为什么用了中断之后还要用到poll机制,因为中断的方法虽然不占用系统资源,但是没有按键按下read()就永远不会返回,这影响了其他程序的运行,如果用到poll机制我们可以设置,没有按键按下的情况5s后依然会返回,也就是说poll机制就是在限定的时间内查询按键的值



1.查询   好资源

2.中断   rear()一直读取,不能返回

3.poll   指定超时时间,没有读取数据就返回



以上为程序主动去读,去查询



4.异步通知     使用信号signal去提醒应用,是为被动的





10、在我们新安装好的ubuntu里面,都会有预装的linux内核这个内核的文件是在/usr/src这个文件夹里面。



11.对于一个可执行的文件我们用readelf a.out -h 就能查看这个是用arm-linux-gcc交叉编译ARM产生的或者是 UNIX - SystemV中的gcc产生的



12、在hello.c和Makefile之间存在着某种联系,用自带系统预装的内核指定为Makefile的地址则这个驱动会insmod到系统的驱动当中,,用arm--linux-gcc编译过的内核这个内核的驱动会insmod到开发板当中,他们两个是不能互换的因为格式不对,,这里

KERN_DIR = /usr/src/linux-headers-2.6.31-14-generic



all:

make -C $(KERN_DIR) M=`pwd` modules



clean:

make -C $(KERN_DIR) M=`pwd` modules clean

rm -rf modules.order



obj-m += hello1.o



其中的KERN_DIR =/usr/src/linux-headers-2.6.31-14-generic就是我的电脑的预装的内核当中的地址,这个自然会加载到我的电脑当中

在电脑当中用lsmod 就会看到

hello1               1052  0

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

391

主题

391

帖子

0

粉丝