写一个linux驱动,并刷到手机上

一、在内核驱动目录里建.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文件 。然后重新第十一步

至此,第一个驱动结束!

猜你喜欢

转载自blog.csdn.net/qq_41831724/article/details/81557782