驱动程序开发,驱动程序开发工程师招聘
NVIDIA Jetson Linux驱动程序包开发人员指南 - 介绍
Jetson开发人员套件和模块
Jetson模块和开发套件的软件
本文档支持的设备
开发人员指南主题-如何识别设备
NVIDIA ?Jetson?是全球领先的边缘AI平台。其适用于用于 深度学习 和计算机视觉的高性能和低功耗, 使其成为计算密集型项目的理想平台。Jetson平台包括各种Jetson模块以及NVIDIA JetPack?SDK。
每个Jetson模块都是一个包装为插件(系统模块System on Module)形式的计算系统。NVIDIA提供了具有不同功能的各种Jetson模块。
Jetpack集成Jetson平台全家桶,从NVIDIA ?Jetson?Linux的驱动程序包(L4T)开始。L4T为Jetson平台提供了Linux内核,引导程序(bootloader),NVIDIA驱动程序,闪存实用程序(flashing utilities),示例文件系统(sample filesystem)等。
Jetson开发人员套件包括一个非生产规格的Jetson模块,该模块连接到参考载板上。它与JetPack SDK一起用于开发和测试用例的软件。Jetson开发人员套件不适用于生产用途。
Jetson模块适合在整个使用寿命内部署在生产环境中。每个Jetson模块出厂时均未预安装任何软件。您可以将其连接到为最终产品设计或购买的载板上,并将已开发的软件映像写入闪存。
NVIDIA JetPack SDK是用于构建AI应用程序的综合资源。它包括L4T以及加速开发的软件库,API,示例应用程序,开发人员工具和文档。
使用 NVIDIA SDK Manager 在您的Jetson开发人员工具包上安装L4T和其他JetPack组件。有关说明,请参阅相应的《 Jetson Developer Kit用户指南》 。或者,请参阅本文档的 快速入门指南, 以使用引导加载程序和文件系统来刷新您的Jetson模块,但不包括其他JetPack组件。
有关将完整的应用程序从Jetson开发人员工具箱移至生产载板上的生产Jetson模块的信息,请参阅Jetson模块的 平台适应和启动指南 。
您可以自定义L4T软件以适合您的项目需求。本开发人员指南包含了优化使用完整的Jetson产品功能集所需的信息。
NVIDIA Jetson Linux驱动程序包开发指南盖使用L4T支持任何在此表中所描述的模块和参考载板组合。
** PCB版本A02的P3449-0000载板仅与PCB版本A02的P3448-0000模块兼容。它们与P3448-0002模块不兼容。
有关各种Jetson模块和开发者工具包的更多信息,请参阅 Jetson开发者网站 和 Jetson常见问题解答 。
如果“开发人员指南”主题与所有受支持的Jetson设备无关,则其标题或子标题指定其范围。以下是此类标题的一些示例:
子标题的一些示例:
“ Jetson AGX Xavier”或“ Jetson TX2系列”的范围是Jetson AGX Xavier或Jetson TX2的所有变体。
“ Jetson TX2”的范围仅是Jetson TX2(不是Jetson TX2 4GB或Jetson TX2i)。有时将Jetson TX2称为“the original Jetson TX2”,以强调它不包括Jetson TX2 4GB或Jetson TX2i。
对着原理图开发驱动程序的叫什么开发
应用层开发:在操作系统之上写程序,这里和在上位机写程序没什么不同,只需要考虑系统资源是否够用。驱动层:写驱动程序,既需要软件,更需要硬件,最终提供一个dll或者设备文件,供应用开发核心层:操作系统的移植,修改等。
驱动开发的步骤有哪些
步骤?没有什么现成的可作为规律来用的步骤。
开发驱动主要有两方面的基础要求:
a,明白你手头的硬件工作原理,包括处理器架构的知识,还有外设控制器的 datasheet 为必读之物;
b,假如你们要开发的整个系统是裸机程序,那你要开发的驱动程序就是一套和硬件打交道的函数库;但是假如你们计划在产品中使用一个操作系统,那开发驱动之前就需要熟悉这个操作系统的相关内部操作原理,因为你写的是驱动程序需要很好的“镶嵌”到这个操作系统的环境中去。
具体的,可以参考 JulianTec 的这篇文章:《应用程序,操作系统,驱动程序和硬件》
linux驱动开发设备树和总线之间的关系?
在 Linux 系统中,设备树(Device Tree)是一种数据结构,它用于描述硬件结构,帮助内核在启动时确定硬件设备的位置和如何使用它们。在设备树中,节点表示硬件设备,而边表示设备之间的关系。
总线(Bus)是用于在计算机系统中传输数据的通道。它通常是一组连接设备的线路,并允许设备之间交换数据。在 Linux 中,总线也在设备树中表示为节点,并且设备节点与总线节点之间存在边。
因此,在 Linux 系统中,设备树用于描述硬件结构,其中包含设备和总线,以及它们之间的关系。在驱动程序开发中,开发人员通常使用设备树来确定特定设备的位置和如何与其通信。
嵌入式驱动开发的基本流程
驱动一般过程是这样的:
首先了解你需要做的驱动的设备的规格,详细看看手册
了解设备的使用方法,通常厂家会提供一个测试的驱动程序源代码,
在你所移植的系统上编译驱动程序源代码,按照手册进行测试
然后再根据自己的需要修改相关代码
如何编写驱动程序?
代码:
#includelt;linux/module.hgt;
#includelt;linux/kernel.hgt;
#includelt;asm/io.hgt;
#includelt;linux/miscdevice.hgt;
#includelt;linux/fs.hgt;
#includelt;asm/uaccess.hgt;
//流水灯代码
#define GPM4CON 0x110002e0
#define GPM4DAT 0x110002e4
static unsigned long*ledcon=NULL;
static unsigned long*leddat=NULL;
//自定义write文件操作(不自定义的话,内核有默认的一套文件操作函数)
static ssize_t test_write(struct file*filp,const char __user*buff,size_t count,loff_t*offset)
{
int value=0;
int ret=0;
ret=copy_from_user(value,buff,4);
//底层驱动只定义基本操作动作,不定义功能
if(value==1)
{
*leddat|=0x0f;
*leddat=0xfe;
}
if(value==2)
{
*leddat|=0x0f;
*leddat=0xfd;
}
if(value==3)
{
*leddat|=0x0f;
*leddat=0xfb;
}
if(value==4)
{
*leddat|=0x0f;
*leddat=0xf7;
}
return 0;
}
//文件操作结构体初始化
static struct file_operations g_tfops={
.owner=THIS_MODULE,
.write=test_write,
};
//杂设备信息结构体初始化
static struct miscdevice g_tmisc={
.minor=MISC_DYNAMIC_MINOR,
.name="test_led",
.fops=g_tfops,
};
//驱动入口函数杂设备初始化
static int __init test_misc_init(void)
{
//IO地址空间映射到内核的虚拟地址空间
ledcon=ioremap(GPM4CON,4);
leddat=ioremap(GPM4DAT,4);
//初始化led
*ledcon=0xffff0000;
*ledcon|=0x00001111;
*leddat|=0x0f;
//杂设备注册函数
misc_register(g_tmisc);
return 0;
}
//驱动出口函数
static void __exit test_misc_exit(void)
{
//释放地址映射
iounmap(ledcon);
iounmap(leddat);
}
//指定模块的出入口函数
module_init(test_misc_init);
module_exit(test_misc_exit);
MODULE_LICENSE("GPL");
扩展资料:
include用法:
#include命令预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代该宏。
插入头文件的内容
#include命令告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。有两种方式可以指定插入头文件:
1、#includelt;文件名gt;
2、#include"文件名"
如果需要包含标准库头文件或者实现版本所提供的头文件,应该使用第一种格式。如下例所示:
#includelt;math.hgt;//一些数学函数的原型,以及相关的类型和宏
如果需要包含针对程序所开发的源文件,则应该使用第二种格式。
采用#include命令所插入的文件,通常文件扩展名是.h,文件包括函数原型、宏定义和类型定义。只要使用#include命令,这些定义就可被任何源文件使用。如下例所示:
#include"myproject.h"//用在当前项目中的函数原型、类型定义和宏
你可以在#include命令中使用宏。如果使用宏,该宏的取代结果必须确保生成正确的#include命令。例1展示了这样的#include命令。
【例1】在#include命令中的宏
#ifdef _DEBUG_
#define MY_HEADER"myProject_dbg.h"
#else
#define MY_HEADER"myProject.h"
#endif
#include MY_HEADER
当上述程序代码进入预处理时,如果_DEBUG_宏已被定义,那么预处理器会插入myProject_dbg.h的内容;如果还没定义,则插入myProject.h的内容。