博客
关于我
ARM Linux 驱动入门及手把手教你简单驱动书写
阅读量:114 次
发布时间:2019-02-26

本文共 4372 字,大约阅读时间需要 14 分钟。

????????

1. ??????????

?????????????????????

  • ????????????????? arm-at91-linux-gnueabi-gcc?
  • ?????????????????? menuconfig ???? .config ???

2. ??????????Makefile??

???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

3. ??????Makefile

???????????

  • ? obj-m ??? .o ???????????????
  • ? KERNELDIR ????????????
  • ? CROSS_COMPILE ???????????????
  • ???????? make ???????

    4. ???? obj-m?

    • obj-y ??????? zImage?
    • obj-m ?????? .ko ????????? zImage?

    3. ??????????????????????

    ?????????????

    #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");

    ??????????

  • ?????make
  • ?????insmod xyy.ko
  • ???????dmesg -c
  • ?????rmmod xyy.ko
  • ?? /dev ?????????ls /dev/Adam
  • 4. ???????????????????

    4.1 MODULE_AUTHOR ???

    ??????????????????????

    MODULE_AUTHOR("XXXXXBBBBB Corporation");

    4.2 module_init ? module_exit

    ????????????????

    static int __init test_init(void) { ... }static void __exit test_exit(void) { ... }

    4.3 misc_register ? misc_deregister

    ????????????

    struct miscdevice misc_dev = { .minor = MISC_DYNAMIC_MINOR, .name = "Adam" };misc_register(&misc_dev);

    5. ???????? 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");

    5. ????

    ?????????

    #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;}

    6. ???????

  • ?????????????? file_operations ??? read ???
  • ?????????????? file_operations ??? write ???
  • ?????????????????????? register_chrdev ??? misc_register?
  • 7. ????

    • Linux????
    • ?????????????????
    • ?Linux???????????????

    转载地址:http://wgru.baihongyu.com/

    你可能感兴趣的文章
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    Openlayers高级交互(2/20):清除所有图层的有效方法
    查看>>
    Openlayers高级交互(20/20):超级数据聚合,页面不再混乱
    查看>>
    Openlayers高级交互(3/20):动态添加 layer 到 layerGroup,并动态删除
    查看>>
    Openlayers高级交互(4/20):手绘多边形,导出KML文件,可以自定义name和style
    查看>>
    Openlayers高级交互(5/20):右键点击,获取该点下多个图层的feature信息
    查看>>
    Openlayers高级交互(6/20):绘制某点,判断它是否在一个电子围栏内
    查看>>
    Openlayers高级交互(7/20):点击某点弹出窗口,自动播放视频
    查看>>
    Openlayers高级交互(8/20):选取feature,平移feature
    查看>>
    Openlayers高级交互(9/20):编辑图形(放缩、平移、变形、旋转),停止编辑
    查看>>
    Openlayers:DMS-DD坐标形式互相转换
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenLDAP(2.4.3x)服务器搭建及配置说明
    查看>>
    OpenLDAP编译安装及配置
    查看>>
    Openmax IL (二)Android多媒体编解码Component
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(三):STM32F103 FreeRTOS移植
    查看>>
    OpenMCU(二):GD32E23xx FreeRTOS移植
    查看>>
    OpenMCU(五):STM32F103时钟树初始化分析
    查看>>