驱动必须是在编译好了的内核上才能正常的工作
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 |