驱动之制作s3c_led.ko
驱动就是通过特定的程序驱使硬件响应一些特定的功能,也就是实现操作系统与硬件设备的通信。
Linux系统将设备分成三种基本类型:
字符设备:能够像字节流一样被访问的设备,由字符设备驱动程序实现这种特性,通常实现open、close、read、write等系统调用,字符设备可以通过文件系统节点来访问,以后要学习的LED驱动就是字符设备。
块设备:块设备也是通过文件系统节点访问,在内核中,块驱动程序具有与字符驱动程序完全不同的接口。
网络接口:由内核中的网络子系统驱动,负责发送和接受数据包。
Hello World模块,解释已经备注上:
- /*********************************************************************************
- 2 * Copyright: (C) 2017 minda
- 3 * All rights reserved.
- 4 *
- 5 * Filename: hello.c
- 6 * Description: This file
- 7 *
- 8 * Version: 1.0.0(04/09/2017)
- 9 * Author:luliteng <[email protected]>
- 10 * ChangeLog: 1, Release initial version on "04/09/2017 03:22:01 AM"
- 11 *
- 12 ********************************************************************************/
- 13 #include <linux/init.h> //指定初始化和清除函数
- 14 #include <linux/kernel.h> //包含内核打印函数printk函数
- 15 #include <linux/module.h> //包含有可装载模块需要的大量符号和函数的定义
- 16
- 17 #define MOD_AUTHOR "luliteng <[email protected]>" //模块作者
- 18 #define MOD_DESC "It's just a Linux kernel module sample!" //模块用途说明
- 19
- 20
- 21 static int __init hello_init(void) //初始化函数
- 22 {
- 23 printk("Welcome to Lingyun Embedded System Trainning!\n");
- 24 printk("Official Website: http://mcuos.com/thread-7178-1-1.html\n");
- 25 return 0; //成功运行返回0
- 26 }
- 27
- 28 static void __exit hello_exit(void) //清除函数
- 29 {
- 30 printk("Wow! It's very good and I have learn much from it, thanks!\n");
- 31 return ;
- 32 }
- 33
- 34 module_init(hello_init); //说明内核初始化函数所在的位置
- 35 module_exit(hello_exit); //帮助内核找到模块的清除函数
- 36
- 37 MODULE_AUTHOR(MOD_AUTHOR); //模块作者
- 38 MODULE_DESCRIPTION(MOD_DESC); //模块用途说明
- 39 MODULE_LICENSE("GPL"); //代码所使用的许可证
- 40
创建一个Makefile
- 1 obj-m := s3c_led. o
- 2 KERNEL_DIR := ~/kernel/linux-3.0.54/
- 3 PWD := $(shell pwd)
- 4 all:
- 5 make -C $(KERNEL_DIR) SUBDIRS=$(PWD) modules
- 6 clean:
- 7 rm *.o *.ko *.mod.c
- 8
- 9 .PHONY:clean
-
然后保存退出 make一下
然后可以看见生成的s3c_led.ko文件
接下来将.ko文件传到开发板上:
tftp -gr s3c_led.ko 192.168.1.2 --------这里的地址是服务器的ip
然后可以加载模块 :insmod,卸载模块可用rmmod
有一个前提 你安装了网卡驱动 才能使用tftp