<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.geekworm.com/index.php?action=history&amp;feed=atom&amp;title=CommentStreams%3A61968edb8e8ef0d52ec61e7d3c4ae14b</id>
	<title>CommentStreams:61968edb8e8ef0d52ec61e7d3c4ae14b - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.geekworm.com/index.php?action=history&amp;feed=atom&amp;title=CommentStreams%3A61968edb8e8ef0d52ec61e7d3c4ae14b"/>
	<link rel="alternate" type="text/html" href="https://wiki.geekworm.com/index.php?title=CommentStreams:61968edb8e8ef0d52ec61e7d3c4ae14b&amp;action=history"/>
	<updated>2026-07-29T04:11:27Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.geekworm.com/index.php?title=CommentStreams:61968edb8e8ef0d52ec61e7d3c4ae14b&amp;diff=31131&amp;oldid=prev</id>
		<title>Negens: Migrated comment #933</title>
		<link rel="alternate" type="text/html" href="https://wiki.geekworm.com/index.php?title=CommentStreams:61968edb8e8ef0d52ec61e7d3c4ae14b&amp;diff=31131&amp;oldid=prev"/>
		<updated>2020-05-02T05:28:57Z</updated>

		<summary type="html">&lt;p&gt;Migrated comment #933&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Hello,&lt;br /&gt;
&lt;br /&gt;
After digging a lot, I made it.&lt;br /&gt;
Forget the raspi-gpio program. I could never install it because of the messy buggy nodejs package.&lt;br /&gt;
&lt;br /&gt;
Here is the method I used :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create a file &amp;quot;gpio_alt.c&amp;quot; :&lt;br /&gt;
&lt;br /&gt;
======================================================&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
Utility to switch Raspberry-Pi GPIO pin functions&lt;br /&gt;
Tim Giles 01/04/2013&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
$ gpio_alt -p PIN_NUMBER -f ALT_NUMBER&lt;br /&gt;
&lt;br /&gt;
Based on RPi code from Dom and Gert, 15-Feb-2013, &amp;lt;http://elinux.org/RPi_Low-level_peripherals#C_2&amp;gt;&lt;br /&gt;
and Gnu getopt() example &amp;lt;http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html#Example-of-Getopt&amp;gt;&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;ctype.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;
#include &amp;lt;sys/mman.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define BCM2708_PERI_BASE        0x20000000&lt;br /&gt;
#define GPIO_BASE                (BCM2708_PERI_BASE + 0x200000) /* GPIO controller */&lt;br /&gt;
#define PAGE_SIZE (4*1024)&lt;br /&gt;
#define BLOCK_SIZE (4*1024)&lt;br /&gt;
&lt;br /&gt;
int  mem_fd;&lt;br /&gt;
void *gpio_map;&lt;br /&gt;
volatile unsigned *gpio;&lt;br /&gt;
void setup_io();&lt;br /&gt;
&lt;br /&gt;
// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y)&lt;br /&gt;
#define INP_GPIO(g) *(gpio+((g)/10)) &amp;amp;= ~(7&amp;lt;&amp;lt;(((g)%10)*3))&lt;br /&gt;
#define OUT_GPIO(g) *(gpio+((g)/10)) |=  (1&amp;lt;&amp;lt;(((g)%10)*3))&lt;br /&gt;
#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)&amp;lt;=3?(a)+4:(a)==4?3:2)&amp;lt;&amp;lt;(((g)%10)*3))&lt;br /&gt;
&lt;br /&gt;
#define GPIO_SET *(gpio+7)  // sets   bits which are 1 ignores bits which are 0&lt;br /&gt;
#define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char **argv) {&lt;br /&gt;
  int opt, flag, n_pin, n_alt;&lt;br /&gt;
  flag=0;&lt;br /&gt;
&lt;br /&gt;
  while ((opt = getopt (argc, argv, &amp;quot;hp:f:&amp;quot;)) != -1) {&lt;br /&gt;
    switch (opt) {&lt;br /&gt;
    case &amp;#039;h&amp;#039;:&lt;br /&gt;
      break;&lt;br /&gt;
    case &amp;#039;p&amp;#039;:&lt;br /&gt;
      n_pin = atoi(optarg); flag |= 0b0001; break;&lt;br /&gt;
    case &amp;#039;f&amp;#039;:&lt;br /&gt;
      n_alt = atoi(optarg); flag |= 0b0010; break;&lt;br /&gt;
    case &amp;#039;?&amp;#039;:&lt;br /&gt;
      // getopt() prints error messages, so don&amp;#039;t need to repeat them here&lt;br /&gt;
      return 1;&lt;br /&gt;
    default:&lt;br /&gt;
      abort ();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  if (flag != 0b0011) {&lt;br /&gt;
    fprintf (stderr, &amp;quot;Usage:\n$ gpio_alt -p PIN_NUM -f FUNC_NUM\n&amp;quot;);&lt;br /&gt;
    return 1;&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  setup_io(); // Set up gpi pointer for direct register access&lt;br /&gt;
  INP_GPIO(n_pin);  // Always use INP_GPIO(x) before using SET_GPIO_ALT(x,y)&lt;br /&gt;
  SET_GPIO_ALT(n_pin, n_alt);&lt;br /&gt;
  &lt;br /&gt;
  printf(&amp;quot;Set pin %i to alternative-function %i\n&amp;quot;, n_pin, n_alt);&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void setup_io() {&lt;br /&gt;
   /* open /dev/mem */&lt;br /&gt;
   if ((mem_fd = open(&amp;quot;/dev/mem&amp;quot;, O_RDWR|O_SYNC) ) &amp;lt; 0) {&lt;br /&gt;
      printf(&amp;quot;can&amp;#039;t open /dev/mem \n&amp;quot;);&lt;br /&gt;
      exit(-1);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   /* mmap GPIO */&lt;br /&gt;
   gpio_map = mmap(&lt;br /&gt;
      NULL,             //Any adddress in our space will do&lt;br /&gt;
      BLOCK_SIZE,       //Map length&lt;br /&gt;
      PROT_READ|PROT_WRITE,// Enable reading &amp;amp; writting to mapped memory&lt;br /&gt;
      MAP_SHARED,       //Shared with other processes&lt;br /&gt;
      mem_fd,           //File to map&lt;br /&gt;
      GPIO_BASE         //Offset to GPIO peripheral&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
   close(mem_fd); //No need to keep mem_fd open after mmap&lt;br /&gt;
&lt;br /&gt;
   if (gpio_map == MAP_FAILED) {&lt;br /&gt;
      printf(&amp;quot;mmap error %d\n&amp;quot;, (int)gpio_map);//errno also set!&lt;br /&gt;
      exit(-1);&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   // Always use volatile pointer!&lt;br /&gt;
   gpio = (volatile unsigned *)gpio_map;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
===================================&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Then run following commands to compile and copy it on PATH :&lt;br /&gt;
gcc gpio_alt.c -o gpio_alt&lt;br /&gt;
sudo chown root:root gpio_alt&lt;br /&gt;
sudo chmod u+s gpio_alt&lt;br /&gt;
sudo mv gpio_alt /usr/local/bin/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Create a systemd file&lt;br /&gt;
/etc/systemd/system/mzdpi.service &lt;br /&gt;
&lt;br /&gt;
=====================================&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=mzdpi screen blue yellow fix service &lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
ExecStart=/usr/local/bin/gpio_alt -p 7 -f 2 ; /usr/local/bin/gpio_alt -p 8 -f 2&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=multi-user.target&lt;br /&gt;
Alias=mzdpi.service&lt;br /&gt;
=====================================&lt;br /&gt;
&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable mzdpi.service&lt;/div&gt;</summary>
		<author><name>Negens</name></author>
	</entry>
</feed>