一、在内核驱动目录里建.c文件,这里以myfirst.c为例
ubuntu@ubuntu:/work1/1168MP/kernel/msm-3.18/drivers/misc$ vi myfirst.c
1、一个简单的驱动程序写法
这个驱动怎么写?
在《linux设备驱动(LDD)中文》的2.2节有讲
二、修改Kconfig文件
去到Kconfig所在目录并打开 ubuntu@ubuntu:/work1/1168MP/kernel/msm-3.18/drivers/misc$ vi Kconfig
安照上面的模式进行添加MYFIRST 一栏 主要改config和tristate 这两行与自己文件相符
三、修改Makefile文件
去到Kconfig所在目录并打开 ubuntu@ubuntu:/work1/1168MP/kernel/msm-3.18/drivers/misc$ vi Makefile
四、修改sunmi_msm8937_defconfig文件(这是个默认的内核配置文件,在里面添加和更改 就不需要一个个添加)
在目录 ubuntu@ubuntu:/work1/1168MP/kernel/msm-3.18/drivers/misc$ vi ../../arch/arm/configs/sunmi_msm8937_defconfig
CONFIG_MYFIRST= 后面是m还是y,看自己是要把这个驱动程序按模块添加还是直接编进内核
五、编译内核
到目录ubuntu@ubuntu:/work1/1168MP$ make bootimage -j4
如果编译出错:先$: source build/envsetup.sh
然后$:lunch 选12
六、查看 .config 是否已经修改相应的选项
到目录ubuntu@ubuntu:/work1/1168MP/out/target/product/zqp1168_p2lite/obj/kernel/msm-3.18$ vi .config
查看方法为:shift+g到文末; 然后 /MYFIRST ;就可定位到CONFIG_MYFIRST
我这里为m,因为第四步修改为m
七、查看是否有相应的.ko文件生成(因为我是按模块添加进内核,所以是.ko文件)
到目录ubuntu@ubuntu:/work1/1168MP/out/target/product/zqp1168_p2lite/obj/kernel/msm-3.18/drivers/misc$ ls
发现已经存在 myfirst.ko文件
八、刷机
ubuntu@ubuntu:/work1/1168MP/out/target/product/zqp1168_p2lite$ adb shell //进入shell
zqp1168_p2lite:/ # reboot bootloader //让手机进入bootloader模式
ubuntu@ubuntu:/work1/1168MP/out/target/product/zqp1168_p2lite$ fastboot devices //查看有木有devices(这步可不要)
40a3e477 fastboot
ubuntu@ubuntu:/work1/1168MP/out/target/product/zqp1168_p2lite$ fastboot flash boot boot.img //加载boot.img
target reported max download size of 535822336 bytes
sending 'boot' (27209 KB)...
OKAY [ 0.859s] //表示成功
writing 'boot'...
OKAY [ 0.582s]
finished. total time: 1.441s
ubuntu@ubuntu:/work1/1168MP/out/target/product/zqp1168_p2lite$ fastboot reboot //重启手机
rebooting...
finished. total time: 0.255s
九、上传 .ko文件
1)ubuntu@ubuntu:/work1/1168MP/out/target/product/zqp1168_p2lite$ adb shell //进入shell
zqp1168_p2lite:/ # cd data/my //进入data目录 可以自己随便建一个
zqp1168_p2lite:/data/my # ls //这个先前建的 查看并没有myfirst.ko
hello.ko
2)上传.ko文件
ubuntu@ubuntu:/work1/1168MP/out/target/product/zqp1168_p2lite/obj/kernel/msm-3.18/drivers/misc$ adb push myfirst.ko data/my
显示成功
3)再去查看data/my目录里已经有了
十、添加驱动模块到内核里
127|zqp1168_p2lite:/data/my # insmod myfirst.ko //加载驱动模块
127|zqp1168_p2lite:/data/my # lsmod //查一下是否加上
Module Size Used by
myfirst 12600 0
zqp1168_p2lite:/data/my # dmesg |grep world //查看驱动是否在运行
[ 4.220215] Bluetooth: ed87dec0<6>[ 4.224868] cfg80211: Calling CRDA to update world regulatory domain
[ 1552.254815] Hello, world init // 运行了入口函数;显示存在 表明成功
zqp1168_p2lite:/data/my # rmmod myfirst.ko //卸载模块
zqp1168_p2lite:/data/my # lsmod //查看已经没有
Module Size Used by
zqp1168_p2lite:/data/my # dmesg |grep world //再查运行情况
[ 4.220215] Bluetooth: ed87dec0<6>[ 4.224868] cfg80211: Calling CRDA to update world regulatory domain
[ 1552.254815] Hello, world init
[ 2077.717456] Goodbye, cruel world exit //运行了出口函数 表明成功
模块驱动ok
十一、如果静态编译进内核 需要改动的
1、第四步时
ubuntu@ubuntu:/work1/1168MP/kernel/msm-3.18/drivers/misc$ vi ../../arch/arm/configs/sunmi_msm8937_defconfig
把m换成y;
2、先执行第六步,后执行第五步
这里发现CONFIG_MYHELLO的值已经变为y
3、接着第七步会发现有 hello.o文件;接着第八步进行刷机
4、不需要第九步,第十部直接:adb shell
ubuntu@ubuntu:/work1/1168MP/out/target/product/zqp1168_p2lite$ adb shell
1|zqp1168_p2lite:/ # dmesg |grep Hello //然后进行查询输出的关键字
[ 6.214701] Hello init //发现有 则成功
如果没有 去到刚刚建的.c文件目录下,重新touch .c文件 。然后重新第十一步
至此,第一个驱动结束!