本文共 4372 字,大约阅读时间需要 14 分钟。
?????????????????????
arm-at91-linux-gnueabi-gcc?menuconfig ???? .config ??????Makefile?????????????????????????????
# ??KERNELRELEASE???????????ifneq ($(KERNELRELEASE),) obj-m += xyy.oelse # KERNELDIR ??????? KERNELDIR ?= /path_to_linux_src/linux-at91-linux-2.6.39-at91-20160713 PWD := $(shell pwd)endif# ????????????clean: make -C $(KERNELDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- \ rm -rf *.o .*.cmd .tmp_versions *.mod.c modules.order Module.symvers *.ko.unsigned
???????????
obj-m ??? .o ???????????????KERNELDIR ????????????CROSS_COMPILE ??????????????????????? make ???????
obj-m?obj-y ??????? zImage?obj-m ?????? .ko ????????? zImage??????????????
#include#include #include #include static int __init test_init(void) { int ret = misc_register(&misc_dev); if (ret) { printk(KERN_ERR "[xyy] misc_register error\n"); } else { printk(KERN_INFO "[xyy] test driver init\n"); } return ret;}static void __exit test_exit(void) { misc_deregister(&misc_dev); printk(KERN_INFO "[xyy] test driver exit\n");}module_init(test_init);module_exit(test_exit);MODULE_AUTHOR("XXXXXBBBBB Corporation");MODULE_DESCRIPTION("XXXXXXXX machine main controller board IO test driver");MODULE_LICENSE("Dual BSD/GPL");MODULE_VERSION("1.0.0");
makeinsmod xyy.kodmesg -crmmod xyy.ko/dev ?????????ls /dev/AdamMODULE_AUTHOR ?????????????????????????
MODULE_AUTHOR("XXXXXBBBBB Corporation"); module_init ? module_exit????????????????
static int __init test_init(void) { ... }static void __exit test_exit(void) { ... } misc_register ? misc_deregister????????????
struct miscdevice misc_dev = { .minor = MISC_DYNAMIC_MINOR, .name = "Adam" };misc_register(&misc_dev); ioctl???????????????????? ioctl ??????
#include#include #include #include #include #include #include struct test { int a; short b; char c;};struct file_operations io_ops = { .owner = THIS_MODULE, .release = io_release, .open = io_open, .ioctl = io_ioctl,};static int io_open(struct inode *inode, struct file *filp) { printk("[xyy] Open called!!\n"); return 0;}static int io_release(struct inode *inode, struct file *file) { printk("[xyy] close called!!\n"); return 0;}static int io_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { printk("cmd = %x\n", cmd); printk("arg: %p\n", (void *)arg); struct test t = { 0, 0, 0 }; int ret = copy_from_user(&t, (struct test *)arg, sizeof(t)); printk("ret = %d, t.a = %d, t.b = %d, t.c = %d\n", ret, t.a, t.b, t.c); t.a = 111; t.b = 222; t.c = 33; ret = copy_to_user((struct test *)arg, &t, sizeof(t)); return 0;}struct miscdevice misc_dev = { .minor = MISC_DYNAMIC_MINOR, .name = "Adam", .fops = &io_ops,};static int __init test_init(void) { int ret = misc_register(&misc_dev); if (ret) { printk(KERN_ERR "[xyy] misc_register error\n"); } else { printk(KERN_INFO "[xyy] test driver init\n"); } return ret;}static void __exit test_exit(void) { misc_deregister(&misc_dev); printk(KERN_INFO "[xyy] test driver exit\n");}module_init(test_init);module_exit(test_exit);MODULE_AUTHOR("XXXXXBBBBB Corporation");MODULE_DESCRIPTION("XXXXXXXX machine main controller board IO test driver");MODULE_LICENSE("Dual BSD/GPL");MODULE_VERSION("1.0.0");
?????????
#include#include #include #include struct test { int a; short b; char c;};int main(void) { int fd = open("/dev/Adam", O_RDONLY); if (fd < 0) { puts("open fail\n"); return -1; } struct test t = { 100, 20, 10 }; printf("tt: %p\n", &t); int ret = ioctl(fd, 0x11223344, &t); if (ret != 0) { puts("ioctl fail\n"); } else { printf("ret = %d, t.a = %d, t.b = %d, t.c = %d\n", ret, t.a, t.b, t.c); } close(fd); return 0;}
file_operations ??? read ???file_operations ??? write ???register_chrdev ??? misc_register?转载地址:http://wgru.baihongyu.com/