02day led灯01
//加载的时候,点亮led灯,卸载模块,关闭led灯
/*
核心版中一共有4个led灯
高电平灭,低电平亮
GPM4_0
GPM4_1
GPM4_2
GPM4_3
0x110002e0
方法1:
linux 封装的gpio口操作
编译Linux内核已经把tiny4412_leds.c 这个驱动加载到内核中,
使用gpio_requeset申请gpio管脚就会冲突,所以需要重新编译内核。
把make menuconfig -->Device Drivers --->Character devices --->
LED Support for FriendlyARM Tiny4412 GPIO LEDs
去掉
M 表示 内核再编译,会把该.c文件,编译生成对应.ko文件。此时需要手动把该模块插入到内核中
* 编译到内核中
空 不做任何的编译
include/linux 所有的头文件和平台无关
gpio_request(gpio口端口, 名称);
gpio_free
int gpio_direction_input(unsigned gpio);
设置成gpio端口为输入模式,返回值是该端口的电平信号
int gpio_direction_output(unsigned gpio, int value);
设置成gpio端口为输出模式,value 输出高低电平
#include <mach/gpio.h>
GPIO端口地址可以使用EXYNOS4X12_GPM4宏
bootcmd:
set bootargs "noinitrd root=/dev/nfs rw nfsroot=192.168.0.90:/home/candle/nfsroot ip=192.168.0.100 console=ttySAC0,115200 init=/linuxrc lcd=S70"
nfsroot 路径 根据具体情况而定
zImage 必须拷贝40008000
set bootcmd 'dnw 0x40008000;bootm 0x40008000'
*/
#include <linux/module.h> //MODULE_LICENSE("GPL");
#include <linux/init.h> //module_init module_exit
#include <linux/kernel.h> //printk
#include <linux/gpio.h>
//gpio_request gpio_direction_output 和平台无关的
#include <mach/gpio.h> //EXYNOS4X12_GPM4
//EXYNOS4X12_GPM4(0)
struct gpio_desc
{
unsigned int num; //gpio口编号
const char * name; //gpio口名称
int value; //gpio的值
};
struct gpio_desc led_gpio[] = {
{EXYNOS4X12_GPM4(0), "LED0", 0},
{EXYNOS4X12_GPM4(1), "LED1", 1},
{EXYNOS4X12_GPM4(2), "LED2", 1},
{EXYNOS4X12_GPM4(3), "LED3", 0},
};
//#define GPM4CON *(volatile u32 *)0x110002e0
//加载
static int test_init(void)
{
int ret = 0;
int i = 0;
//内核是用printk打印
printk("%s:%s:%d load \n", __FILE__, __FUNCTION__, __LINE__);
//GPM4CON = (GPM4CON & ~0xf) | 1 << 0;
//linux 支持虚拟内存,所以所有的地址都是虚拟,不能直接
for(i=0;i < ARRAY_SIZE(led_gpio);i++) {
//向内核中注册GPIO
ret = gpio_request(led_gpio[i].num, led_gpio[i].name);
if(ret < 0) {
printk("gpio_request name:%s failed\n", led_gpio[i].name);
goto err_gpio_request;
}
gpio_direction_output(led_gpio[i].num, led_gpio[i].value);
}
return 0;
err_gpio_request:
for(i=i-1;i>=0;i--) {
gpio_free(led_gpio[i].num);
}
return -1;
}
//卸载
static void test_exit(void)
{
int i =0;
printk("%s:%s:%d reload \n", __FILE__, __FUNCTION__, __LINE__);
for(i=0;i < ARRAY_SIZE(led_gpio);i++) {
gpio_free(led_gpio[i].num);
}
}
module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL"); //加入GPL许可
--------------------------------------------
obj-m := test.o
#添加当前的系统的路径
#uname -r 查看当前系统的内核版本,
#指定内核的地址
#KERNEL_DIR := /usr/src/linux-headers-3.19.0-15-generic
KERNEL_DIR:= ~/4412_res/linux/linux-3.5
NFSROOT := ~/nfsroot/
all: build
build:
make -C $(KERNEL_DIR) M=$(PWD) modules
cp test.ko ~/nfsroot/
make clean
copy:
mv $(obj-m:.o=.ko) $(NFSROOT)
clean:
make -C $(KERNEL_DIR) M=$(PWD) clean
.PHONY: all build copy clean