在上一节的基础上修改代码,点亮led。
目的:写一个点灯的驱动。
- 框架;
- 完善硬件的操作
a.看原理图(确定引脚);
b.看2440手册(确定配置);
c.写代码:单片机:物理地址;驱动:虚拟地址(使用ioremap映射)
配置:GPFCON open
设置:GPFDAT write
1.建立两个变量
2.在加载时进行ioremap
3.卸载时再unmap
4.在open函数里面配置引脚![](https://img-blog.csdnimg.cn/20210718220721642.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzMTQxMzUz,size_16,color_FFFFFF,t_70)
5.在write函数里面设置引脚
根据输入的数据控制引脚,如果是1就点灯,是0就关闭。
这里有一个用户空间向内核空间传递数据的函数。
这里buf和count就对应测试程序里面write函数的buf和count。
6.修改测试程序
根据使用测试app时传入的参数决定点亮还是熄灭。
7.调试
调试发现会在点灯和灭灯的时候报段错误。
怀疑是地址gpfdat直接从gpfcon加1不行,修改为单独的map后可以正常。
退出时unmap。
现在可以同时控制三盏灯,如果要单独控制其中的一盏灯要怎么做呢?
- 根据传入的值不同点亮不同的灯;
- 根据次设备号来决定点亮/熄灭哪盏灯;
使用此设备号来控制的方法。
1.类名改为leds,共注册4个设备
2. open和write函数添加针对不同此设备号进行不同的操作
3.修改测试程序
4.调试
使用次设备号来控制,代码写完之后操作led,不论点亮还是熄灭,led都是闪一下就灭了。
将test中传入的参数count修改为4就可以正常了,有点懵逼。。。
后续再看吧。