Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程

发布者:EtherealGrace最新更新时间:2025-01-15 来源: cnblogs关键字:Samsung  tiny4412 手机看文章 扫描二维码
随时随地手机看文章

/***********************************************************************************

 *                    

 *                          字符设备驱动基本操作及调用流程

 *

 *  声明:

 *      1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会

 *         不对齐,从而影响阅读.

 *      2. 以下所有的shell命令都是在root权限下运行的;


 **********************************************************************************/


                        \\\\\\\--*目录*--//////////////

                        |  一. make编译快捷方式;             

                        |  二. ctags使用;                    

                        |  三. menuconfig编译成内核内部模块; 

                        |  四. 编译内核模块的方法;           

                        |  五. 模块操作;                     

                        |  六. 多源文件编译模块Makefile格式; 

                        |  七. 导出符号;                     

                        |  八. printk打印等级;               

                        |  九. 模块传参;                     

                        |  十. 字符设备;                     

                        |  十一. 2种字符设备注册;            

                        |  十二. 驱动中常见的3种结构体;      

                        |  十三. 内核空间与用户空间数据拷贝; 

                        |  十四. 驱动被调用函数流程:         

                        \\\\\\\\\///////////////////


一. make编译快捷方式:

    1. export CC=arm-linux-gcc 

    2. make app 

        arm-linux-gcc     app.c   -o app 


二. ctags使用:

    1. 生成tags文件 ctags -Rn . 

    2. 把tags文件的路径名添加到vim的配置文件中 

        cat >> ~/.vimrc << EOF

        set tags+=/root/linux-3.5/tags #可以添加多个原文件目录

        EOF

    3. vim查找符号定义: :ts


三. menuconfig 编译成内核内部模块:

    1. cat > test.c << EOF

        #include

        int test_init(void)

        {

            printk('Hello module.n');

            return 0;

        }

        void test_exit(void)

        {

            printk('Bye module.n');

        }

        //指定模块的初始化函数与退出函数

        module_init(test_init);

        module_exit(test_exit);

        MODULE_LICENSE('GPL');

        MODULE_AUTHOR('lizhichao');

        MODULE_DESCRIPTION('simpile module.');

        MODULE_VERSION('1.0');

        EOF

    2. 在test.c所在目录的Makefile文件添加:

        obj-$(CONFIG_TEST) += test.o

    3. 在test.c所在目录的Kconfig文件添加:

        config TEST

            bool '----- test module -------'

    4. 这时候可以通过menuconfig等配置工具配置test模块的编译

    5. 重新编译内核

    6. make -j2 zImage

    7. 查看模块是否编译到内核

        1. nm vmlinux | grep test_init

            c08d0790 t __initcall_test_init6

            c030537c T test_init

        2. nm vmlinux | grep test_exit

            c0305370 T test_exit

    8. 重新把内核烧写到SD卡的kernel分区,dwn或者fastboot都行.

    9. 系统启动时将调用初始化函数test_init,使用dmesg命令查看是否有正确的输出


四. 编译内核模块的方法

    1. Makefile中对变量的引用,可以是$(变量名),也可以是${变量名},但是目前看到$(变量名)居多.

    2. 以下是几个对模块编译的make命令:

        1. make -C $(内核跟目录路径) M=`pwd` modules

        2. make -C $(内核根目录路径) M=`pwd` clean

        3. make -s -C $(内核根目录路径) M=$PWD INSTALL_MOD_PATH=$(nfs文件系统根目录) modules_install

    3. 实现了上面make命令的shell脚本实例: 

        cat > mm << EOF

        #!/bin/bash

        KERNEL=/disk/A9/filesystem/linux-3.5

        ROOT_PATH=/disk/A9/filesystem

        if [ $# -eq 0 ]

        then

            make -s -C ${KERNEL} M=$PWD modules

        elif [ $# -eq 1 -a '$1' = 'clean' ]

        then

            make -s -C ${KERNEL} M=$PWD modules clean

        elif [ $# -eq 1 -a '$1' = 'install' ]

        then

            make -s -C ${KERNEL} M=$PWD

            INSTALL_MOD_PATH=${ROOT_PATH} modules_install

        else

            echo 'usage:'

            echo '      mm'

            echo '      mm clean'

            echo '      mm install'

        fi

        EOF

    4. 实现上面make命令的Makefile实例:

        ifneq ($(KERNELRELEASE),)

           obj-m := at24c02.o

        else 

        KDIR := /home/myzr/myandroid/kernel_imx

        all:

         make -C $(KDIR) M=$(PWD) modules


        clean:

         rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order

        endif

    5. 将mm当常用命令来是用: cp mm /bin/ && chmod 777 /bin/mm 


五. 模块操作:

    1. 动态插入模块到当前运行的系统: insmod test.ko

    2. 查看当前运行的系统加载的模块信息: lsmod

    3. 查看模块的信息: modinfo test.ko 或者 modinfo test

    4. 卸载加载的模块: rmmod test

    5. 生成模块的依赖关系: depmod

    6. 加载内核模块,主要用于加载make install的模块: modprobe test

    7. 卸载内核模块,主要用于卸载make install的模块: modprobe -r test



六. 多源文件编译模块Makefile格式:

    1. xxx是模块文件名

    2. obj-m   += xxx.o

       xxx-objs = main.o foo.o ...


七. 导出符号:

    把符号导出到内核全局符号表,主要是为其他的模块提供函数调用,有两种方式:

    1. EXPORT_SYMBOL(foo);      //普通方式

    2. EXPORT_SYMBOL_GPL(foo);  //只有声明为GPL的模块才能调用



八. printk打印等级:

    1. 数字越小,等级越高:

        #define KERN_EMERG      '<0>'   /* system is unusable           */

        #define KERN_ALERT      '<1>'   /* action must be taken immediately */

        #define KERN_CRIT       '<2>'   /* critical conditions          */

        #define KERN_ERR        '<3>'   /* error conditions         */

        #define KERN_WARNING    '<4>'   /* warning conditions           */

        #define KERN_NOTICE     '<5>'   /* normal but significant condition */

        #define KERN_INFO       '<6>'   /* informational            */

        #define KERN_DEBUG      '<7>'   /* debug-level messages         */


        /* Use the default kernel loglevel */

        #define KERN_DEFAULT    ''

    2. cat /proc/sys/kernel/printk

        5       4       1       7

        数字解析如下:

        1. 5   ---> 打印等级小于5的内核消息输出到控制台

        2. 4   ---> 默认的打印等级

        3. 1   ---> 允许设置的最小等级

        4. 7   ---> 允许设置的最大等级


九. 模块传参:

    1. 声明定义可传参变量:

        int num = 500;

        module_param(num, int, 0644);

        module_param参数说明:

            1. num     参数名

            2. int     参数类型

[1] [2] [3]
关键字:Samsung  tiny4412 引用地址:Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程

上一篇:Samsung_tiny4412(驱动笔记04)----volatile,container_of,file_operations,file,inode
下一篇:Samsung_tiny4412(驱动笔记01)----linux 3.5,U-Boot,Busybox,SD卡启动环境搭建

推荐阅读最新更新时间:2026-03-25 13:19

Samsung_tiny4412(驱动笔记03)----字符设备驱动基本操作及调用流程
/*********************************************************************************** * * 字符设备驱动基本操作及调用流程 * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 以下所有的shell命令都是在root权限下运行的; *******************************************************************************
[单片机]
Samsung_tiny4412(驱动笔记10)----mdev,bus,device,driver,platform
/*********************************************************************************** * * mdev,bus,device,driver,platform * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 由于本人水平有限,很难阐述清楚bus device driver platform的关系 * 所以强烈要求您详细参考本次提供的预热文章. * **********
[单片机]
Samsung_tiny4412(驱动笔记02)----ASM with C,MMU,Exception,GIC
/**************************************************************************** * * ASM with C,MMU,Exception,GIC * * 声明: * 1. 本系列文档是在vim下编辑,请尽量是用vim来阅读,在其它编辑器下可能会 * 不对齐,从而影响阅读. * 2. 以下所有的shell命令都是在root权限下运行的; * 3. 文中在需要往文件中写入内容的时候使用了如下2方式: * 1.如果文件不存在,创建文件;如果存在,以覆盖的方式往文件中添加内容: *
[单片机]
Tiny4412 支持 adb reboot-bootloader
硬件版本: Tiny4412ADK + S700 4GB u-boot 版本: u-boot-2010-12 linux版本: Linux-3.0.8 版本一 支持 adb reboot bootloader patch:http://pan.baidu.com/s/1i3KfCI5 版本二 支持按住K1键,然后开机,进入fastboot模式 patch: http://pan.baidu.com/s/1hqgmnQ0
[单片机]
tiny4412 串口驱动分析一 --- u-boot中的串口驱动
开发板:tiny4412ADK+S700 4GB Flash 主机:Wind7 64位 虚拟机:Vmware+Ubuntu12_04 u-boot:U-Boot 2010.12 Linux内核版本:linux-3.0.31 Android版本:android-4.1.2 我们以tiny4412为例分析串口驱动,下面我们从u-boot开始分析,然后再分析到Linux。 串口初始化 关于这部分代码流程参考件: tiny4412 u-boot 启动.pdf ,这里主要分析函数:uart_asm_init 在初始化串口驱动之前已经进行了系统时钟以及内存的初始化。下面的代码取自board/samsung/tiny441
[单片机]
<font color='red'>tiny4412</font> 串口<font color='red'>驱动</font>分析一 --- u-boot中的串口<font color='red'>驱动</font>
基于tiny4412的Linux内核移植 ---- 調試方法
平臺 Linux-4.4.4 uboot使用的是友善自帶的(爲了支持uImage和設備樹做了稍許修改) 概述 這篇博客主要用於匯總一下調試方法。 正文 1. dnw下載 目前我將uboot燒寫到SD卡中,然後使用dnw將kernel、根文件系統以及設備樹鏡像下載到內存中,爲了提高效率,可以使用下面的方法: 在uboot中添加環境變量: setenv dnw_up 'dnw 0x40600000; dnw 0x41000000; dnw 0x42000000; bootm 0x40600000 0x41000000 0x42000000' 進入uboot終端後,執行如下命令: run d
[单片机]
基于tiny4412的Linux内核移植 -- PWM子系统学习(八)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 实验二、用蜂鸣器测试backlight 一般LCD的背光的亮度调节都是通过控制输入给背光控制
[单片机]
串口编程(基于tiny4412
参考: http://www.cnblogs.com/wblyuyang/archive/2011/11/21/2257544.html http://www.cppblog.com/amazon/archive/2010/01/28/106644.html serial_demo.c #include stdio.h #include stdlib.h #include unistd.h #include sys/types.h #include sys/stat.h #include fcntl.h //文件控制定义 #include termios.h //终端控制定义 #include errno
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved