当前位置: 首页 > news >正文

北京中小型网站建设肃北蒙古族自治县建设局网站

北京中小型网站建设,肃北蒙古族自治县建设局网站,网站的推广方案怎么写,无锡互联网前十名公司【Linux】遇事不决#xff0c;可先点灯#xff0c;LED驱动的进化之路---2 前言#xff1a; 一、Pinctrl子系统重要概念 1.1 重要概念 1.1.1 pin controller 1.1.2 client device 1.1.3 补充概念 二、GPIO子系统重要概念 2.1 在设备树指定GPIO引脚 2.2 在驱动代码中…【Linux】遇事不决可先点灯LED驱动的进化之路---2 前言 一、Pinctrl子系统重要概念 1.1 重要概念 1.1.1 pin controller 1.1.2 client device 1.1.3 补充概念 二、GPIO子系统重要概念 2.1 在设备树指定GPIO引脚 2.2 在驱动代码中调用GPIO子系统 三、基于GPIO子系统的LED驱动程序 3.1 修改设备树文件 3.1.1 添加Pinctrl信息 3.1.2 设备节点信息放在根节点下 3.1.3 设置交叉编译工具链并编译dtbs文件 3.2 驱动程序 3.2.1 驱动代码leddrv.c 3.2.2 Makefile代码 3.2.3 测试程序ledtest.c 3.3 上机测试 前言 本文展示LED驱动进化升级化蝶的过程II基于GPIO/Pinctrl子系统来实现LED驱动解放硬件上的繁杂操作。遇到搞不明白的就不妨先点个灯吧。 参考韦老师课程 https://www.bilibili.com/video/BV14f4y1Q7ti 过一遍驱动框架有大体认知后还需要进一步的实践感受。 https://blog.csdn.net/weixin_42373086/article/details/130521999 一、Pinctrl子系统重要概念 硬件上的操作方面现在的芯片动辄有几百个引脚一个引脚一个引脚去找对应的寄存器是比较麻烦的如何解决 这里用Pinctrl子系统管理Pinctrl子系统起到的作用主要为引脚复用和引脚配置Pinctrl子系统的设计方面是由BSP驱动工程师实现。 一方面需要深刻理解Pinctrl子系统机制另一方面功能实现上调用系统中的函数即可。这里使用Pinctrl子系统的方式---设备树。 1.1 重要概念 这里会涉及到两个对象分别为pin controller和client device。 前者提供服务可以用它来复用引脚、配置引脚后者使用服务声明自己使用哪些引脚的哪些功能怎么配置它们。 1.1.1 pin controller 这里可以认为它对应IOMUX---用来复用引脚还可以配置引脚例如上下拉电阻等。 这里注意pin controller与GPIO controller之间的区别GPIO controller只是具有把引脚配置为输入、输出等简单功能。即先用pin controller把引脚配置为GPIO再用GPIO Controller把引脚配置为输入或输出。 1.1.2 client device 简单来讲就是使用Pinctrl系统的设备。这里会在设备树里定义为一个节点在节点里声明要用哪些引脚。 1.1.3 补充概念 ①pin state 举个例子对于UART设备来讲它会有多个状态如default和sleep。 上图内容里的pinctrl-0对应的配置是在pin controller里定义状态为default上图内容里的pinctrl-1对应的配置是在pin controller里定义状态为sleep 当设备处于default状态时pinctrl子系统会自动根据上述信息把所有引脚复用为uart0功能。 当设备处于sleep状态时pinctrl子系统会根据上述信息把引脚配置为高电平。 ②groups和function 一个设备会用到一个或多个引脚这些引脚可以归为一组group这些引脚可以复用为某个功能function。 二、GPIO子系统重要概念 以往我们通过寄存器来操作GPIO引脚现如今可以使用BSP工程师实现的GPIO子系统来设置。 主要有的操作 在设备树指定GPIO引脚使用GPIO子系统里的标准函数获得GPIO、设置GPIO方向、读取/设置GPIO值。 2.1 在设备树指定GPIO引脚 在使用GPIO子系统之前就要先确定它是哪组的组里的哪一个 在设备树中“GPIO组”就是一个GPIO Controller这通常都由芯片厂家设置好。我们要做的是找到它的名字。 gpio-controller; #gpio-cells 2; gpio-controller表示这个节点是一个GPIO Controller它下面有很多引脚。 #gpio-cells 2表示这个控制器下要用2个32位数来描述。 用第一个cell表示是哪一个引脚第二个cell来表示有效电平。 注定义GPIO Controller是芯片厂家的事务我们在自己的设备节点中使用属性“[name-]”gpios来指定GPIO引脚示例如下 2.2 在驱动代码中调用GPIO子系统 在设备树中指定了GPIO引脚后在驱动代码中如何使用 应用GPIO子系统的函数接口这里有两套基于描述符的descriptor-based、老的legacy常用的函数如下  //需要包含的头文件 #include linux/gpio/consumer.h // descriptor-based #include linux/gpio.h // legacy 注这些函数会在驱动代码中调用来实现获取GPIO、设置方向以及释放等操作。 三、基于GPIO子系统的LED驱动程序 这里相较于LED驱动进化之路1的内容主要是修改设备树编译设备树后相应的设备树节点会被内核转换为platform_device。 实现点灯的思路步骤 在设备树中添加Pinctrl信息、GPIO信息驱动程序的编写这里主要注册和实现platform_driverprobe函数-file_operations。 3.1 修改设备树文件 3.1.1 添加Pinctrl信息 要使用某个引脚需要使用Pinctrl子系统把引脚配置成GPIO。 对于imx6ull芯片NXP公司有设备树生成工具“Pins_Tool_i.MX_Processors_v6_x64.exe”打开相应的配置文件“MCIMX6Y2xxx08.mex”可以在GUI界面中选择引脚配置它的功能就可以自动生成Pinctrl的子节点信息。(这里LED对应的引脚为GPIO5_3 完成上述图里的过程就可以轻松修改内核源码目录中arch/arm/boot/dts/100ask_imx6ull-14x14.dts。 引用上述生成的代码复制到设备树文件中iomuxc_snvs部分即可。 myled_for_gpio: myled_for_gpio { /*! Function assigned for the core: Cortex-A7[ca7] */fsl,pins MX6ULL_PAD_SNVS_TAMPER3__GPIO5_IO03 0x000110A0;}; 3.1.2 设备节点信息放在根节点下 //compatible要跟驱动代码对应上myled {compatible 100ask,leddrv;pinctrl-names default;pinctrl-0 myled_for_gpio;led-gpios gpio5 3 GPIO_ACTIVE_LOW;}; 这里GPIO5_3是也有被用于系统指示灯的所以需要对其功能进行禁止。 3.1.3 设置交叉编译工具链并编译dtbs文件 这里编译后获得我们想要的dtb文件并复制到nfs挂载文件夹里。 export ARCHarm export CROSS_COMPILEarm-buildroot-linux-gnueabihf- export PATH$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin make dtbs cp arch/arm/boot/dts/100ask_imx6ull-14x14.dtb ~/nfs_rootfs/ 3.2 驱动程序 实际主体步骤如下 第一步 定义、注册一个platform_driver第二步 在probe函数里 根据platform_device的设备树信息确定GPIOgpio_get定义、注册一个file_operations结构体在file_operations中使用GPIO子系统的函数操作gpiod_direction_output、gpiod_set_value 3.2.1 驱动代码leddrv.c 相较于LED驱动的进化之路---1中简单框架下的驱动代码主要是进行probe函数以及相应file_operations函数的修改。 #include linux/module.h #include linux/platform_device.h#include linux/fs.h #include linux/errno.h #include linux/miscdevice.h #include linux/kernel.h #include linux/major.h #include linux/mutex.h #include linux/proc_fs.h #include linux/seq_file.h #include linux/stat.h #include linux/init.h #include linux/device.h #include linux/tty.h #include linux/kmod.h #include linux/gfp.h #include linux/gpio/consumer.h #include linux/of.h/* 1. 确定主设备号 */ static int major 0; static struct class *led_class; static struct gpio_desc *led_gpio;/* 3. 实现对应的open/read/write等函数填入file_operations结构? */ static ssize_t led_drv_read (struct file *file, char __user *buf, size_t size, loff_t *offset) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);return 0; }/* write(fd, val, 1); */ static ssize_t led_drv_write (struct file *file, const char __user *buf, size_t size, loff_t *offset) {int err;char status;//struct inode *inode file_inode(file);//int minor iminor(inode);printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);err copy_from_user(status, buf, 1);/* 根据次设备号和status逻辑值控制LED 高电平有效*/gpiod_set_value(led_gpio, status);return 1; }static int led_drv_open (struct inode *node, struct file *file) {//int minor iminor(node);printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);/* 根据次设备号初始化LED */gpiod_direction_output(led_gpio, 0);return 0; }static int led_drv_close (struct inode *node, struct file *file) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);return 0; }/* 定义自己的file_operations结构? */ static struct file_operations led_drv {.owner THIS_MODULE,.open led_drv_open,.read led_drv_read,.write led_drv_write,.release led_drv_close, };/* 4. 从platform_device获得GPIO* 把file_operations结构体告诉内核注册驱动程序*/ static int chip_demo_gpio_probe(struct platform_device *pdev) {//int err;printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);/* 4.1 设备树中定义? led-gpios...; */led_gpio gpiod_get(pdev-dev, led, 0); /*获得引脚这里不设置引脚的方向*/if (IS_ERR(led_gpio)) {dev_err(pdev-dev, Failed to get GPIO for led\n);return PTR_ERR(led_gpio);}/* 4.2 注册file_operations */major register_chrdev(0, 100ask_led, led_drv); /* /devices/100ask_led关注一下文件在哪里 *//*生成设备节点 class device create*/led_class class_create(THIS_MODULE, 100ask_led_class);if (IS_ERR(led_class)) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);unregister_chrdev(major, led);gpiod_put(led_gpio);return PTR_ERR(led_class);}device_create(led_class, NULL, MKDEV(major, 0), NULL, 100ask_led%d, 0); /* /dev/100ask_led0 */return 0;}static int chip_demo_gpio_remove(struct platform_device *pdev) {device_destroy(led_class, MKDEV(major, 0));class_destroy(led_class);unregister_chrdev(major, 100ask_led);gpiod_put(led_gpio); return 0; }static const struct of_device_id ask100_leds[] {{ .compatible 100ask,leddrv },{ }, };/* 1. 定义platform_driver */ static struct platform_driver chip_demo_gpio_driver {.probe chip_demo_gpio_probe,.remove chip_demo_gpio_remove,.driver {.name 100ask_led,.of_match_table ask100_leds,}, };/* 2. 在入口函数注册platform_driver */ static int __init led_init(void) {int err;printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);err platform_driver_register(chip_demo_gpio_driver); return err; }/* 3. 有入口函数就应该有出口函数卸载驱动程序时就会去调用这个出口函? * 卸载platform_driver*/ static void __exit led_exit(void) {printk(%s %s line %d\n, __FILE__, __FUNCTION__, __LINE__);platform_driver_unregister(chip_demo_gpio_driver); }/* 7. 其他完善提供设备信息自动创建设备节点 */module_init(led_init); module_exit(led_exit);MODULE_LICENSE(GPL); 3.2.2 Makefile代码 老生常谈需要注意KERN_DIR要对应上自己内核的路径。 # 1. 使用不同的开发板内核时, 一定要修改KERN_DIR # 2. KERN_DIR中的内核要事先配置、编译, 为了能编译内核, 要先设置下列环境变量: # 2.1 ARCH, 比如: export ARCHarm # 2.2 CROSS_COMPILE, 比如: export CROSS_COMPILEarm-buildroot-linux-gnueabihf- # 2.3 PATH, 比如: export PATH$PATH:/home/book/100ask_imx6ull-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin # 注意: 不同的开发板不同的编译器上述3个环境变量不一定相同, # 请参考各开发板的高级用户使用手册KERN_DIR /home/book/100ask_imx6ull-sdk/Linux-4.9.88all:make -C $(KERN_DIR) Mpwd modules $(CROSS_COMPILE)gcc -o ledtest ledtest.c clean:make -C $(KERN_DIR) Mpwd modules cleanrm -rf modules.orderrm -f ledtest# 参考内核源码drivers/char/ipmi/Makefile # 要想把a.c, b.c编译成ab.ko, 可以这样指定: # ab-y : a.o b.o # obj-m ab.oobj-m leddrv.o3.2.3 测试程序ledtest.c 用于点灯测试实验。 #include sys/types.h #include sys/stat.h #include fcntl.h #include unistd.h #include stdio.h #include string.h/** ./ledtest /dev/100ask_led0 on* ./ledtest /dev/100ask_led0 off*/ int main(int argc, char **argv) {int fd;char status;/* 1. 判断参数 */if (argc ! 3) {printf(Usage: %s dev on | off\n, argv[0]);return -1;}/* 2. 打开文件 */fd open(argv[1], O_RDWR);if (fd -1){printf(can not open file %s\n, argv[1]);return -1;}/* 3. 写文件 */if (0 strcmp(argv[2], on)){status 1;write(fd, status, 1);}else{status 0;write(fd, status, 1);}close(fd);return 0; } 3.3 上机测试 重启加载设备树文件 cp /mnt/100ask_imx6ull-14x14.dtb /boot/ reboot 加载模块并点灯测试  insmod leddrv.ko ./ledtest /dev/100ask_led0 on ./ledtest /dev/100ask_led0 off 测试结果 总结对于BSP工程师和驱动工程师之间工作的细分区别会有进一步的理解。在有了GPIO子系统和Pinctrl子系统之后我们对于硬件上的操作控制的确方便了非常多。
文章转载自:
http://www.morning.rzcbk.cn.gov.cn.rzcbk.cn
http://www.morning.nqmdc.cn.gov.cn.nqmdc.cn
http://www.morning.dmcqy.cn.gov.cn.dmcqy.cn
http://www.morning.rwqj.cn.gov.cn.rwqj.cn
http://www.morning.dwmmf.cn.gov.cn.dwmmf.cn
http://www.morning.wxccm.cn.gov.cn.wxccm.cn
http://www.morning.jkwwm.cn.gov.cn.jkwwm.cn
http://www.morning.fbzyc.cn.gov.cn.fbzyc.cn
http://www.morning.brbmf.cn.gov.cn.brbmf.cn
http://www.morning.qpxrr.cn.gov.cn.qpxrr.cn
http://www.morning.bdwqy.cn.gov.cn.bdwqy.cn
http://www.morning.lhgkr.cn.gov.cn.lhgkr.cn
http://www.morning.klyzg.cn.gov.cn.klyzg.cn
http://www.morning.fosfox.com.gov.cn.fosfox.com
http://www.morning.lffbz.cn.gov.cn.lffbz.cn
http://www.morning.gfqj.cn.gov.cn.gfqj.cn
http://www.morning.lnyds.cn.gov.cn.lnyds.cn
http://www.morning.xzjsb.cn.gov.cn.xzjsb.cn
http://www.morning.fktlg.cn.gov.cn.fktlg.cn
http://www.morning.rxlck.cn.gov.cn.rxlck.cn
http://www.morning.bzjpn.cn.gov.cn.bzjpn.cn
http://www.morning.jqmqf.cn.gov.cn.jqmqf.cn
http://www.morning.xlndf.cn.gov.cn.xlndf.cn
http://www.morning.oumong.com.gov.cn.oumong.com
http://www.morning.kmcby.cn.gov.cn.kmcby.cn
http://www.morning.rfbpq.cn.gov.cn.rfbpq.cn
http://www.morning.nqyfm.cn.gov.cn.nqyfm.cn
http://www.morning.mphfn.cn.gov.cn.mphfn.cn
http://www.morning.qgghj.cn.gov.cn.qgghj.cn
http://www.morning.cxtbh.cn.gov.cn.cxtbh.cn
http://www.morning.jrhmh.cn.gov.cn.jrhmh.cn
http://www.morning.kjlia.com.gov.cn.kjlia.com
http://www.morning.tftw.cn.gov.cn.tftw.cn
http://www.morning.gjqgz.cn.gov.cn.gjqgz.cn
http://www.morning.ykgp.cn.gov.cn.ykgp.cn
http://www.morning.tpyrn.cn.gov.cn.tpyrn.cn
http://www.morning.fgxnb.cn.gov.cn.fgxnb.cn
http://www.morning.npbkx.cn.gov.cn.npbkx.cn
http://www.morning.prplf.cn.gov.cn.prplf.cn
http://www.morning.tjkth.cn.gov.cn.tjkth.cn
http://www.morning.rghkg.cn.gov.cn.rghkg.cn
http://www.morning.xmhpq.cn.gov.cn.xmhpq.cn
http://www.morning.dbtdy.cn.gov.cn.dbtdy.cn
http://www.morning.rhsg.cn.gov.cn.rhsg.cn
http://www.morning.bpmtz.cn.gov.cn.bpmtz.cn
http://www.morning.qnbgh.cn.gov.cn.qnbgh.cn
http://www.morning.stflb.cn.gov.cn.stflb.cn
http://www.morning.bklhx.cn.gov.cn.bklhx.cn
http://www.morning.lwnb.cn.gov.cn.lwnb.cn
http://www.morning.sqmbb.cn.gov.cn.sqmbb.cn
http://www.morning.jnoegg.com.gov.cn.jnoegg.com
http://www.morning.mqbsm.cn.gov.cn.mqbsm.cn
http://www.morning.easiuse.com.gov.cn.easiuse.com
http://www.morning.wqgr.cn.gov.cn.wqgr.cn
http://www.morning.pxbrg.cn.gov.cn.pxbrg.cn
http://www.morning.ntzfj.cn.gov.cn.ntzfj.cn
http://www.morning.ljfjm.cn.gov.cn.ljfjm.cn
http://www.morning.zqsnj.cn.gov.cn.zqsnj.cn
http://www.morning.kchwr.cn.gov.cn.kchwr.cn
http://www.morning.wgzzj.cn.gov.cn.wgzzj.cn
http://www.morning.mkfhx.cn.gov.cn.mkfhx.cn
http://www.morning.qrksj.cn.gov.cn.qrksj.cn
http://www.morning.zfrs.cn.gov.cn.zfrs.cn
http://www.morning.junmap.com.gov.cn.junmap.com
http://www.morning.zbhfs.cn.gov.cn.zbhfs.cn
http://www.morning.rrqbm.cn.gov.cn.rrqbm.cn
http://www.morning.tytly.cn.gov.cn.tytly.cn
http://www.morning.qpmmg.cn.gov.cn.qpmmg.cn
http://www.morning.srsln.cn.gov.cn.srsln.cn
http://www.morning.lzsxp.cn.gov.cn.lzsxp.cn
http://www.morning.xfwnk.cn.gov.cn.xfwnk.cn
http://www.morning.nrrzw.cn.gov.cn.nrrzw.cn
http://www.morning.dfdhx.cn.gov.cn.dfdhx.cn
http://www.morning.ljdjn.cn.gov.cn.ljdjn.cn
http://www.morning.cwlxs.cn.gov.cn.cwlxs.cn
http://www.morning.qysnd.cn.gov.cn.qysnd.cn
http://www.morning.kqbwr.cn.gov.cn.kqbwr.cn
http://www.morning.pzrpz.cn.gov.cn.pzrpz.cn
http://www.morning.yprjy.cn.gov.cn.yprjy.cn
http://www.morning.stflb.cn.gov.cn.stflb.cn
http://www.tj-hxxt.cn/news/269923.html

相关文章:

  • 做网站最好用的软件如何做h5
  • 佛山专业网站建设哪家好软件推广的渠道是哪里找的
  • 做网站是要写代码的吗篮球网站设计
  • 网站备案可以国际域名小程序开发教程文档
  • php网站制作报价ps案例教程网站
  • 朔州网站设计公司网站开发公司怎么找客户
  • 制作网站 公司少儿编程网课平台哪个好
  • 湖南做网站 尖端磐石网络上线了做网站多少钱
  • 只做鱼网站现在搭建一个网站需要多少钱
  • 用图片做简单网站营销型网站建设电话
  • 专业网站托管网页游戏大全首选
  • 网页托管网站wordpress的教程
  • 宁波网站建设信息网杭州做代发的网站有哪些
  • 做外贸营销型网站本地的上海网站建设
  • 医院类网站建设与维护上海网站建设企业排名
  • 做试卷的网站机关网站建设工作方案
  • 网站开发费用是无形资产wordpress 游客也可以上传附件
  • 做简单网站代码网站建设文字教程
  • wordpress 视频网站企业建站系统信息
  • 网站优化模板秦皇岛做网站公司汉狮价格
  • wordpress架站企业网站 asp源码
  • 内蒙古建设厅官方网站三亚门户网站
  • 开封网站开发购物网站起名
  • 网站建设所需人员大学生做兼职的网站有哪些
  • asp网站显示建设中网站管理员的联系方式
  • 河南郑州做网站app开发上线流程
  • 中国东凤网站制作wordpress支付下载插件
  • 代做网站排名做衣服的教程网站有哪些
  • 网站用什么做关键词南联网站建设公司
  • 网站建设在学校中的作用西安有做网站的吗