实现自己的RPi.GPIO(一)-Python C Extension

树莓派有个RPi.GPIO的Python模块,import之后就可以直接用Python操作ARM芯片的GPIO硬件模块。觉得这个很有意思,于是查资料想在自己画的DM8148平台上面也实现这样的一个模块。

DM8148是TI推出的一款达芬奇系列数字图像处理芯片,比DM8168性能略差,但是功耗更低。之前公司的很多图像处理都是用的DM8168,但是散热和功耗问题一直很让人头疼,于是就让我预研更低功耗的DM8148。DM8148可以理解为ARM+DSP的异构核心,我们要用到的就是它的一颗Cortex A8的ARM核心。

我们公司没有使用TI的EZSDK,而是购买了DVR-RDK。DVR-RDK4.0提供的编译器arm-arago-linux-gnueabi-gcc目录中已经包含了Python2.6,我自己也交叉编译了Python2.7,但是很多库有问题,就直接使用自带的Python2.6。

Python并不能直接操作硬件,直接操作硬件只能用C去实现,然后通过Python的Extensions功能调用C。下面是Python的Extensions功能的一个Demo,从某Python tutorial上拷贝的:

 1 #include <python2.6/Python.h>
 2 static PyObject *helloworld(PyObject *self)
 3 {
 4   return Py_BuildValue("s", "Hello, Python extensions!!");
 5 }
 6 static char helloworld_docs[] = "helloworld():Any message you want to put hele!
 7 ";
 8 static PyMethodDef helloworld_funcs[] = {
 9     {"helloworld", (PyCFunction)helloworld, METH_NOARGS, helloworld_docs},
10     {NULL}
11 };
12 void inithelloworld(void)
13 {
14   Py_InitModule3("helloworld", helloworld_funcs, "Extension module example!");
15 }

交叉编译:

arm-arago-linux-gnueabi-gcc hello.c -g -I/home/jugg/CodeSourcery/cgt_a8/arago/linux-devkit/arm-arago-linux-gnueabi/usr/include/python2.6 -shared -L/home/jugg/CodeSourcery/cgt_a8/arago/linux-devkit/arm-arago-linux-gnueabi/usr/lib/python2.6 -o helloworld.so

然后将得到的helloworld.so拷贝到Python的库路径中:

cp ./helloworld.so /home/jugg/working_space/nfs/rfs_814x/usr/lib/python2.6/lib-dynload

在DM8148板卡上测试:

时间: 2024-11-07 13:14:19

实现自己的RPi.GPIO(一)-Python C Extension的相关文章

实现自己的RPi.GPIO(三)-Python C API

Python C 的扩展按照模板来就行了,其实就4步:参数传递,返回值传递,函数注册,初始化. 直接上代码: 1 /* 2 * PyGPIO.h 3 * 4 * Created on: 2015年5月19日 5 * Author: jugg 6 */ 7 8 #ifndef SRC_PYGPIO_H_ 9 #define SRC_PYGPIO_H_ 10 11 #include <errno.h> 12 #include <string.h> 13 #include <std

树莓派瞎玩~7~RPi.GPIOのWIKI文档

树莓派瞎玩~7~RPi.GPIOのWIKI文档 RPiGPIO Python Module RPiGPIO module basics Importing the module Pin numbering Warnings Setup up a channel Setup more than one channel Input Output Output to several channels Cleanup RPi Board Information and RPiGPIO version I

【玩转开源】BananaPi R2——移植RPi.GPIO 到 R2

1. 首先给大家介绍一下什么是RPi.GPIO. 简单去讲,RPi.GPIO就是一个运行在树莓派开发板上可以通过Python去控制GPIO的一个中间件. 现在我这边做了一个基础功能的移植,接下来大家可以跟着我去学习一下RPi.GPIO是如何通过Python去实现控制开发板上的GPIO的. 2. 看一下效果图: 2.1 硬件实物运行效果 2.2 执行Python脚本打印的log 3. 那么RPi.GPIO在R2上是如何使用的呢? 3.1 首先在R2上面运行一个Ubuntu镜像,然后下载代码:git

实现自己的RPi.GPIO(二)-mmap 直接访问硬件

通过驱动访问硬件是很方便简洁的事,但是我想直接操作硬件外设的寄存器.好在Linux提供了mmap函数,可以绕过驱动,直接操作外设的寄存器. mmap可以实现外设的物理地址到Linux虚拟地址的映射,这样就可以通过操作虚拟地址来操作物理地址. file = open("/dev/mem", O_RDWR|O_SYNC); mem_viraddr = mmap(NULL, GPIO_REG_ADDR_4KB, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_SHAR

Duanxx的BeagleBone学习: 安装GPIO的Python库

第一步:upgrade dtc comiler ro enable SPI wget -c https://raw.githubusercontent.com/RobertCNelson/tools/master/pkgs/dtc.sh chmod +x dtc.sh ./dtc.sh 参考网址:https://learn.adafruit.com/introduction-to-the-beaglebone-black-device-tree/compiling-an-overlay 第二步:

RPi GPIO 图

为了保险,还需要用万用表测量一下我们的判断对不对:在Raspberry Pi的工作状态下,将万用表的“+”接到“1”口上,万用表的“-”接到“6”口上,在看看万用表的显示是不是大约为正3.3V,如果不是,那么说明我们弄错了针脚顺序,需要回头再检查! From WizNote

RPi 2B GPIO 测试

/************************************************************************************** * RPi 2B GPIO 测试 * 声明: * 本文主要记录RPi 2B GPIO口的使用,理解什么是GPIO的BOARD编号和BCM编号. * * 2016-2-24 深圳 南山平山村 曾剑锋 ***************************************************************

树莓派2代B model 上手初体验,不用显示器,Python GPIO 点亮一颗LED

开题:[好东西,值得研究!] 标题:树莓派2代B model 上手初体验,不用显示器,Python GPIO 点亮一颗LED [知识普及] 1,树莓派各版本对比: 2,树莓派2代BModel 主板,图样 树莓派2 代B GPIO 图 [所需硬件] 一张TF卡,8G或者8G以上,我的是 [三星TF卡16g class10 EVO] 一根网线,让树莓派与路由器连接 一个5V 500MA 的普通USB电源,为树莓派供电 ,我试过了,5V 500ma没问题 一个树莓派2代B 一个普通路由器[如果你连路由

树莓派高级GPIO库,wringpi2 for python使用笔记(一)安装

网上的教程,一般Python用RPi.GPIO来控制树莓派的GPIO,而C/C++一般用wringpi库来操作GPIO,RPi.GPIO过于简单,很多高级功能不支持,比如i2c/SPI库等,也缺乏高精度定时等高级特性.相比之下,wiringpi则功能丰富的多,其实wringpi已经有了python绑定,可以非常简单的在python中使用这个库.鉴于网上基本没有这个库的中文说明,我一边学习,一边以做笔记的形式,写几篇关于这个库的基本使用的文章. 安装:首先安装python-pip: 我用的Arch