树莓派驱动开发(二)打印Hello World

在配置好驱动开发的环境之后,则可以开始测试环境了,我们用打印Hello World作为测试程序

helloworld.c

第一步

创建一个helloworld.c文件

头文件

#include <linux/init.h>  //包含宏定义的头文件
#include <linux/module.h>  //包含初始化加载模块的头文件

第二步

写驱动模块的入口和出口

static int __init hello_init(void)
{                                                                                                                                                                    
        printk("hello world \n");                                                                                                                                           
        return 0;
}

static void __exit hello_exit(void)
{
        printk("Goodbye, the world\n");
}

module_init(hello_init);
module_exit(hello_exit);  

Makefile

# 判断是否在内核构建系统内。如果没有定义 KERNELRELEASE,则表示这是从命令行调用。
ifneq ($(KERNELRELEASE),)
        # 如果不是内核构建系统,则定义需要编译的模块对象文件。
        # obj-m 是内核模块的编译变量,+= 表示添加模块文件(.o)
        obj-m += helloworld.o
else
        # 定义内核头文件的位置,使用当前正在运行的内核版本。
        KDIR := /lib/modules/$(shell uname -r)/build

        # 定义当前的工作目录。
        PWD := $(shell pwd)

        # 默认目标。如果调用了 make 而没有指定目标,会执行这个部分。
        # -C $(KDIR) 表示切换到内核源码目录进行编译
        # M=$(PWD) 表示在当前模块的目录下执行内核模块编译
all:
        $(MAKE) -C $(KDIR) M=$(PWD) modules

        # 清理目标:用于清理编译产生的中间文件。
clean:
        rm -f *.mod.c *.order *.ko *.o *.mod *.symvers
endif

编译

make

安装驱动模块 

sudo insmod helloworld.ko

查看打印信息

dmesg

 卸载模块

sudo rmmod helloworld

再次查看打印信息

dmesg

完成!!

好的,树莓派使用wiringpi驱动oled屏幕的具体步骤如下: 1.安装wiringpi库 在终端中输入以下命令进行安装: ``` sudo apt-get update sudo apt-get install wiringpi ``` 2.连接oled屏幕 将oled屏幕的SDA和SCL引脚分别连接到树莓派的GPIO2和GPIO3引脚上。 3.编写代码 使用wiringpi库编写代码来控制oled屏幕的显示。以下是一个简单的示例: ``` #include <wiringPi.h> #include <wiringPiI2C.h> #define OLED_ADDR 0x3c int fd; void write_cmd(unsigned char cmd) { wiringPiI2CWriteReg8(fd, 0x00, cmd); } void write_data(unsigned char data) { wiringPiI2CWriteReg8(fd, 0x40, data); } void OLED_Init() { write_cmd(0xAE); // display off write_cmd(0x20); // set memory addressing mode write_cmd(0x00); // horizontal addressing mode write_cmd(0x21); // set column address write_cmd(0x00); // start column write_cmd(0x7F); // end column write_cmd(0x22); // set page address write_cmd(0x00); // start page write_cmd(0x07); // end page write_cmd(0xB0); // set page start address write_cmd(0xC8); // flip vertically write_cmd(0x00); // set low column address write_cmd(0x10); // set high column address write_cmd(0x40); // set display start line write_cmd(0x81); // set contrast control write_cmd(0xFF); // set maximum contrast write_cmd(0xA1); // set segment remap write_cmd(0xA6); // set normal display write_cmd(0xA8); // set multiplex ratio write_cmd(0x3F); // set maximum multiplex ratio write_cmd(0xA4); // set display mode write_cmd(0xD3); // set display offset write_cmd(0x00); // set offset to 0 write_cmd(0xD5); // set display clock divide ratio/oscillator frequency write_cmd(0xF0); // set divide ratio and oscillator frequency write_cmd(0xD9); // set pre-charge period write_cmd(0x22); // set pre-charge period to 2 DCLKs write_cmd(0xDA); // set COM pins hardware configuration write_cmd(0x12); // set alternate COM pins write_cmd(0xDB); // set VCOMH write_cmd(0x40); // set VCOMH to 0.83 VCC write_cmd(0x8D); // set charge pump write_cmd(0x14); // enable charge pump write_cmd(0xAF); // display on } void OLED_Clear() { int i, j; for (i = 0; i < 8; i++) { write_cmd(0xB0 + i); write_cmd(0x00); write_cmd(0x10); for (j = 0; j < 128; j++) { write_data(0x00); } } } void OLED_ShowString(unsigned char x, unsigned char y, unsigned char *str) { unsigned char c = 0, i = 0, j = 0; while (str[j] != '\0') { c = str[j] - 32; if (x > 120) { x = 0; y++; } write_cmd(0xB0 + y); write_cmd((x & 0x0F) | 0x10); write_cmd((x >> 4) | 0x00); for (i = 0; i < 8; i++) { write_data(pgm_read_byte(font8x16 + c * 16 + i)); } write_cmd(0xB0 + y); write_cmd((x & 0x0F) | 0x10); write_cmd((x >> 4) | 0x00); for (i = 8; i < 16; i++) { write_data(pgm_read_byte(font8x16 + c * 16 + i)); } x += 8; j++; } } int main(int argc, char **argv) { if (wiringPiSetup() < 0) { fprintf(stderr, "Failed to setup wiringPi\n"); return 1; } if ((fd = wiringPiI2CSetup(OLED_ADDR)) < 0) { fprintf(stderr, "Failed to setup I2C device: %s\n", strerror(errno)); return 1; } OLED_Init(); OLED_Clear(); OLED_ShowString(0, 0, "Hello, world!"); return 0; } ``` 这段代码实现了oled屏幕的初始化、清屏和显示字符串等功能。 4.编译运行 在终端中输入以下命令进行编译: ``` gcc -o oled oled.c -lwiringPi ``` 然后运行程序: ``` sudo ./oled ``` 此时,oled屏幕应该可以显示出“Hello, world!”这个字符串了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值