【Linux系统开发】 x210开发板 虚拟驱动创建流程(驱动编译进内核)

内核编译常用命令

安装模块
lsmod module_test.ko
创建设备文件
mknod /dev/test c 250 0
查看设备状态
lsmod module_test.ko
查看设备注册信息(分为字符设备和块设备)
cat /proc/devices

知识补充:

#include<stdio.h>
int main(void)
{
	int i;
	static int j;
	printf(i);
	printf(j);
}
// 注意:这里如果没有指定i值,则打印出来的是随机值
// 如果定义一个静态变量而没有赋值,则打印默认为0

虚拟驱动创建流程

首先进入x210_bsp/kernel

make menuconfig

make -j4

cp arch/arm/boot/zImage /tftpboot/ -f

重启开发板查看开发板设备

ls /sys/devices/platform/

cd sys/class/leds

led_test_4编写完成后

编译不报错即可

cd /root/x210_bsp/kernel/drivers/leds/

cp /mnt/hgfs/Myshare/driver/led_test_4/leds-s5pv210.c ./

vi Makefile->

obj-$(CONFIG_LEDS_S5PV210) += leds-s5pv210.o

vi Kconfig更改依赖(添加以下文件)

config LEDS_S5PV210 tristate "LED Support for S5PV210" help This option enables support for on-chip LED drivers found on Marvell Semiconductor 88PM8606 PMIC.

进入到x210_bsp/kernel

执行make menuconfig

可以发现生成了新的配置(Device Drivers-> LED_Support),使能这个

执行make编译

cp arch/arm/boot/zImage /tftpboot/ -f

secureCRT:

cd sys/class/leds

进入LED1,执行

echo 1 > brightness // 灯亮

echo 0 > brightness //灯灭


最后附上源代码:

leds-s5pv210.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
#include <mach/gpio-bank.h>
#include <mach/regs-gpio.h>
#include <linux/ioport.h>
#include <asm/io.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <mach/gpio.h>
#include <linux/leds.h>

#define GPIO_LED1	S5PV210_GPJ0(3)
#define GPIO_LED2	S5PV210_GPJ0(4)
#define GPIO_LED3	S5PV210_GPJ0(5)

#define X210_LED_OFF	1
#define X210_LED_ON		0

struct led_classdev mydev1;
struct led_classdev mydev2;
struct led_classdev mydev3;

void s5pv210_led1_set(struct led_classdev *led_cdev,enum led_brightness value)
{
	printk(KERN_INFO "s5pv210_led1_set\n");
	
	if(value == LED_OFF)
	{
		gpio_set_value(GPIO_LED1,X210_LED_OFF);
	}
	else
	{
		gpio_set_value(GPIO_LED1,X210_LED_ON);
	}
}
void s5pv210_led2_set(struct led_classdev *led_cdev,enum led_brightness value)
{
	printk(KERN_INFO "s5pv210_led2_set\n");
	
	if(value == LED_OFF)
	{
		gpio_set_value(GPIO_LED2,X210_LED_OFF);
	}
	else
	{
		gpio_set_value(GPIO_LED2,X210_LED_ON);
	}
}
void s5pv210_led3_set(struct led_classdev *led_cdev,enum led_brightness value)
{
	printk(KERN_INFO "s5pv210_led3_set\n");
	
	if(value == LED_OFF)
	{
		gpio_set_value(GPIO_LED3,X210_LED_OFF);
	}
	else
	{
		gpio_set_value(GPIO_LED3,X210_LED_ON);
	}
}



static  int __init s5pv210_led_init(void)
{
	int ret = -1;
	// 申请GPIO
	if(gpio_request(GPIO_LED1,"led1_gpj0.3"))
	{
		printk(KERN_ERR "gpio_request failed.\n");
	}
	else
	{
		gpio_direction_output(GPIO_LED1,1);
	}
	
	mydev1.name = "led1";
	mydev1.brightness = 0;
	mydev1.brightness_set = s5pv210_led1_set;
	
	
	ret = led_classdev_register(NULL,&mydev1);
	if(ret < 0)
	{
		printk(KERN_ERR "led_classdev_register failed.\n");
		return ret;
	}
	
	mydev2.name = "led2";
	mydev2.brightness = 0;
	mydev2.brightness_set = s5pv210_led2_set;
	
	
	ret = led_classdev_register(NULL,&mydev2);
	if(ret < 0)
	{
		printk(KERN_ERR "led_classdev_register failed.\n");
		return ret;
	}
	
	mydev3.name = "led3";
	mydev3.brightness = 0;
	mydev3.brightness_set = s5pv210_led3_set;
	
	
	ret = led_classdev_register(NULL,&mydev3);
	if(ret < 0)
	{
		printk(KERN_ERR "led_classdev_register failed.\n");
		return ret;
	}
	
	return 0;
}

static void __exit s5pv210_led_exit(void)
{
	led_classdev_unregister(&mydev1);
	led_classdev_unregister(&mydev2);
	led_classdev_unregister(&mydev3);
	
	gpio_free(GPIO_LED1);
	gpio_free(GPIO_LED2);
	gpio_free(GPIO_LED3);
}

module_init(s5pv210_led_init);
module_exit(s5pv210_led_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("WYQ");
MODULE_DESCRIPTION("module_test");

Makefile

#KERN_VER = $(shell uname -r)
#KERN_DIR = /lib/modules/$(KERN_VER)/build

KERN_DIR = /root/x210_bsp/kernel

obj-m += leds-s5pv210.o

all:
	make -C $(KERN_DIR) M=`pwd` modules

.PHONY:clean
clean:
	make -C $(KERN_DIR) M=`pwd` modules clean

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

以放_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值