欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

linux基础操作2-字符设备控制-LBA的控制

程序员文章站 2024-03-19 08:55:28
...

导:在 linux 驱动中,字符驱动是必须掌握的,本章主要介绍字符设备应用的程序,无论是学习了后面的知识自己写的字符驱动,还是已有的字符驱动,都需要能够写一些简单的应用程序。即使从事 linux 驱动的工作,linux 驱动写出来之后,也需要由驱动程序员编写简单的应用进行测试的。

1.先理顺对 main函数的理解

main 函数作为应用程序的入口,在头文件“#include<stdio.h> ”中。
main 函数需要传参数的时候完整的定义为: int main(int argc,char **argv)
            //参数 argc,表示参数的个数
            //参数**argv,存储输入字符的数组:argv[0]表示程序名称,argv[1]——argv[n]输入的参数
                不传参数的时候定义为:int main(void),

            //函数 main 的返回值为类型为 int,用于判断程序执行成功还是失败

                无返回,并且不传参数的时候定义为:main(void) (等同 void main(void))

可测函数 int main(int argc,char **argv) 的用例子如下

linux基础操作2-字符设备控制-LBA的控制linux基础操作2-字符设备控制-LBA的控制

2.LBA控制操作

----------硬件电路---------------linux基础操作2-字符设备控制-LBA的控制

linux基础操作2-字符设备控制-LBA的控制

linux基础操作2-字符设备控制-LBA的控制

-----引入一个硬件io的控制函数ioctl()-----------

    int ioctl( int fd, int request, int cmd);
//参数 fd,函数 open 返回的句柄。
//参数 request 和参数 cmd,由内核驱动决定具体操作,例如:request 可以代表哪一个 IO 口,cmd 代表对 IO 进行什么样的操作,也可以反过来。具体的含义由驱动工程师在驱动中 switch决定。

//返回值:返回 0 成功;返回-1,出错

#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <termios.h>
#include <sys/stat.h>
 
int main(int argc ,char *argv[])
{
	int i,j,k,fd,adc_len,r;//
	i=atoi(argv[1]);
	j=atoi(argv[2]);//
	k=atoi(argv[3]);
	
	char adc_buffer[512];
	char *leds="/dev/leds";
	char *buzzer_ctl="/dev/buzzer_ctl";
	char *adc="/dev/adc";//=========if p i c p========================
	if((fd=open(leds,O_RDWR | O_CREAT | O_NDELAY))<0)
	{
		printf("打开LED失败!\r\n");
	} 
	printf("打开LED 成功!\r\n");
	ioctl(fd,i,j);
	close(fd);//--------关闭LED----if p i c p-----------------------------
	printf("关闭LED 成功!\r\n");
	
	if((fd=open(buzzer_ctl,O_RDWR | O_CREAT | O_NDELAY))<0)
	{
		printf("打开beep失败!\r\n");
	} 
	printf("打开beep 成功!\r\n");
	ioctl(fd,k,0);
	close(fd);//--------关闭beep-----if p i c p----------------------------
	printf("关闭beep 成功!\r\n");
	
	if((fd=open(adc,O_RDWR | O_CREAT | O_NDELAY))<0)
	{
		printf("打开adc失败!\r\n");
	}else
	{
		printf("打开adc成功!\r\n");
		adc_len=read(fd,adc_buffer,10);
		if(adc_len==0) printf("read null \r\n");
		else {
			r=atoi(adc_buffer);
			r=(int)(r*10000/4095);
			printf("数值为:%d \t",r);
		}
	}				
	close(fd);//--------关闭adc if c p---------------------------------
	printf("关闭beep 成功!\r\n");
	return 1;
}

linux基础操作2-字符设备控制-LBA的控制

3 现象验证:

第一个参数是亮灭,第二个参数是选择灯,第三个参数开关beep

        验证通过!!!!